在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",
...
}
}
答案 0 :(得分:7)
处理这种情况有三种典型方式(按我的首选顺序):
如果子网仅由此堆栈使用,则将它们创建为堆栈的一部分并使用ref。
如果子网将由多个堆栈使用,则在单独的堆栈中创建它们,将它们定义为输出,在定义堆栈上执行describe-stack以获取值,然后将它们传递给此堆栈作为参数。
如果子网是在其他地方创建的(在CloudFormation之外),只需将它们作为参数传递。
如果你真的想要使用VPC中的所有子网,我将不建议将来为其他目的创建新的子网,那么你总是可以做描述子网并在VpcId上进行过滤。你的清单。
答案 1 :(得分:2)
如果您的模板创建了VPC,那么可能您的模板也为该VPC创建了子网。您是否只能从您创建的每个子网的各个子网ID中填充SubnetIds?
这样的事情:
"SubnetIds" : [ {"Ref":"mysubnet1"}, {"Ref":"mysubnet2"} ]