如何在cf模板中设置出口时使用fn :: att或fn :: select或任何其他内置函数获取当前VPC CIDR

时间:2016-03-02 21:16:32

标签: amazon-web-services amazon-cloudformation

我看到有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>"
  }
}

1 个答案:

答案 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,您可以使用exportingimporting 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创建堆栈。