在 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",
...
}
}
最佳答案
处理这种情况有三种典型方法(按照我的首选顺序):
如果子网仅由该堆栈使用,请将它们创建为堆栈的一部分并使用 ref。
如果子网将由多个堆栈使用,请在单独的堆栈中创建它们,将它们定义为输出,在定义堆栈上执行描述堆栈以获取值,然后将它们传递到此堆栈作为参数。
如果子网是在其他地方(CloudFormation 之外)创建的,只需将它们作为参数传递即可。
如果您确实想使用 VPC 中的所有子网(我不建议这样做,以防将来出于其他目的创建新子网),那么您始终可以对 VpcId 进行描述子网和过滤来获取列表.
关于amazon-web-services - AWS 云形成 : How to get subnet list from VPC?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30541950/