我看到有Fn :: GetAtt和Fn :: Select函数但是如何使用这些或任何其他可以返回VPC CIDR并在下面列出的Egress上设置为CidrIp属性(cf tempalate)
"OutboundRule": {
"Type": "AWS::EC2::SecurityGroupEgress",
"Properties":{
"IpProtocol": "tcp",
"FromPort": "80",
"ToPort": "80",
"CidrIp" : "<VPC Cidr>"
}
}
答案 0 :(得分:8)
如果您已将VPC声明为同一模板中的另一个资源,则可以使用Fn::GetAtt
像这样引用其CIDR(假设&#34; MyVPC&#34;是您给出的逻辑名称VPC资源):
{
"OutboundRule": {
"Type": "AWS::EC2::SecurityGroupEgress",
"Properties":{
"IpProtocol": "tcp",
"FromPort": "80",
"ToPort": "80",
"CidrIp" : { "Fn::GetAtt" : [ "MyVPC", "CidrBlock" ] }
}
}
Fn::GetAtt
可以返回的属性特定于它返回的资源类型,并且它支持的资源类型和属性有限。您可以找到list of supported resources and attributes here。
如果您没有在同一模板中声明VPC,则另一个选项是将CIDR作为CloudFormation parameter传递,并使用{ "Ref": "<parmeterName>" }
代替Fn::GetAtt
。
<强>更新强> Announced on Sept 19, 2016,您可以使用exporting和importing values的跨堆栈引用来共享堆栈之间的值而不是参数。
示例(在YAML中代替JSON,在同一公告中可用):
部分模板1 :
...
Outputs:
VpcCidrBlock:
Description: My VPC's CIDR block.
Value:
Fn::GetAtt:
- MyVpc
- CidrBlock
Export:
Name: MyVpcCidrBlock
部分模板2 :
...
Resources:
Type: "AWS::EC2::SecurityGroupEgress"
Properties:
CidrIp:
Fn::ImportValue: MyVpcCidrBlock
FromPort: 80
IpProtocol: tcp
ToPort: 80
注意:在从模板2创建堆栈之前,必须在同一区域中从模板1创建堆栈。