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"} ]
处理这种情况的三种典型方法(按我的首选顺序):
如果子网仅供此堆栈使用,请将它们创建为堆栈的一部分并使用 ref.
如果子网将被多个堆栈使用,在单独的堆栈中创建它们,将它们定义为输出,在定义堆栈上执行 describe-stack 以获取值,然后传递它们作为参数进入此堆栈。
如果子网是在别处创建的(在 CloudFormation 之外),只需将它们作为参数传入即可。
如果您真的想使用 VPC 中的所有子网(我不建议这样做,以防将来为其他目的创建新的子网),那么您始终可以执行 describe-subnets 并过滤 VpcId do get你的清单。
在 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"} ]
处理这种情况的三种典型方法(按我的首选顺序):
如果子网仅供此堆栈使用,请将它们创建为堆栈的一部分并使用 ref.
如果子网将被多个堆栈使用,在单独的堆栈中创建它们,将它们定义为输出,在定义堆栈上执行 describe-stack 以获取值,然后传递它们作为参数进入此堆栈。
如果子网是在别处创建的(在 CloudFormation 之外),只需将它们作为参数传入即可。
如果您真的想使用 VPC 中的所有子网(我不建议这样做,以防将来为其他目的创建新的子网),那么您始终可以执行 describe-subnets 并过滤 VpcId do get你的清单。