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

时间:2015-05-30 03:32:00

标签: amazon-web-services amazon-ec2 subnet amazon-cloudformation amazon-elasticache

在CloudFormation中,我正在创建一个VPC,两个EC2实例和一个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",
    ...
  }
}

2 个答案:

答案 0 :(得分:7)

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

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

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

  3. 如果子网是在其他地方创建的(在CloudFormation之外),只需将它们作为参数传递。

  4. 如果你真的想要使用VPC中的所有子网,我将不建议将来为其他目的创建新的子网,那么你总是可以做描述子网并在VpcId上进行过滤。你的清单。

答案 1 :(得分:2)

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

这样的事情:

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