AWS CloudFormation:如何从 VPC 获取子网列表?

AWS CloudFormation: How to get subnet list from VPC?

在 CloudFormation 中,我正在创建一个 VPC、两个 EC2 实例和一个位于它们前面的 Elasticache。在模板中,我试图将 elasticache 添加到 vpc。创建 AWS::Elasticache::SubnetGroup

时出现问题
    "CacheSubnetGroup" : {
      "Type" : "AWS::ElastiCache::SubnetGroup",
      "Properties" : {
        "Description" : "Subnets available for the ElastiCache Cluster",
        "SubnetIds" : [ ... ]
      }
    },

不想要求用户按照建议输入子网列表here因为我假设用户不知道什么是子网.有没有类似于{ "Fn::GetAtt" : ["myVpc", "SubnetList"] }?

的函数

编辑 在 jarmod 响应之后,我正在创建子网、vpc 和其他所有内容。但是仍然存在一个问题。我可以在创建的 VPC 中启动 EC2,但实例已创建,并且在初始化实例的中间关闭并启动了新实例。这个循环一直持续到我删除 cf 堆栈为止。这是我认为问题出处的部分:

"WebServerGroup" : {
  "Type" : "AWS::AutoScaling::AutoScalingGroup",
  "Properties" : {
    "VPCZoneIdentifier" : [{ "Ref" : "InstanceSubnet1" }, { "Ref" : "InstanceSubnet2" }, { "Ref" : "InstanceSubnet3" }, { "Ref" : "InstanceSubnet4" }],
    "LaunchConfigurationName" : { "Ref" : "LaunchConfig" },
    "MinSize" : "1",
    "MaxSize" : "4",
    ...
  }
}

如果您的模板创建了 VPC,那么您的模板可能还为该 VPC 创建了子网。您不能只从您创建的每个子网的各个子网 ID 填充 SubnetIds 吗?

像这样:

"SubnetIds" : [ {"Ref":"mysubnet1"}, {"Ref":"mysubnet2"} ]

处理这种情况的三种典型方法(按我的首选顺序):

  1. 如果子网仅供此堆栈使用,请将它们创建为堆栈的一部分并使用 ref.

  2. 如果子网将被多个堆栈使用,在单独的堆栈中创建它们,将它们定义为输出,在定义堆栈上执行 describe-stack 以获取值,然后传递它们作为参数进入此堆栈。

  3. 如果子网是在别处创建的(在 CloudFormation 之外),只需将它们作为参数传入即可。

如果您真的想使用 VPC 中的所有子网(我不建议这样做,以防将来为其他目的创建新的子网),那么您始终可以执行 describe-subnets 并过滤 VpcId do get你的清单。