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

How to get current VPC CIDR using fn::att or fn::select or anyother builtin functions while setting egress in cf template

我看到有 Fn::GetAtt 和 Fn::Select 功能,但我如何使用此类或任何其他可以 return VPC CIDR 并在出口上设置为 CidrIp 属性下面列出(cf tempalate)

  "OutboundRule": {
  "Type": "AWS::EC2::SecurityGroupEgress",
  "Properties":{
    "IpProtocol": "tcp",
    "FromPort": "80",
    "ToPort": "80",
    "CidrIp" : "<VPC Cidr>"
  }
}

如果您已经在同一模板中将您的 VPC 声明为另一个资源,您可以像这样使用 Fn::GetAtt 来引用它的 CIDR(假设 "MyVPC" 是您为该 VPC 指定的逻辑名称资源):

{
  "OutboundRule": {
  "Type": "AWS::EC2::SecurityGroupEgress",
  "Properties":{
    "IpProtocol": "tcp",
    "FromPort": "80",
    "ToPort": "80",
    "CidrIp" : { "Fn::GetAtt" : [ "MyVPC", "CidrBlock" ] }
  }
}

Fn::GetAtt 可以 return 的属性特定于它 return 从中获取它们的资源类型,并且它支持的资源类型和属性数量有限.您可以找到 list of supported resources and attributes here.

如果您没有在同一模板中声明 VPC,另一种选择是将 CIDR 作为 CloudFormation parameter 传递并使用 { "Ref": "<parmeterName>" } 代替 Fn::GetAtt

更新: Announced on Sept 19, 2016, you can use cross-stack references by exporting and 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

注意:必须先在同一区域中从模板 1 创建堆栈,然后才能从模板 2 创建堆栈。