从CloudFormation中的子网参数获取可用区

时间:2018-07-25 07:24:08

标签: amazon-web-services amazon-cloudformation

我有

Parameters
  Zookeeper1SubnetParam:
    Description: Subnet where Zookeeper 1 should run
    Type: AWS::EC2::Subnet::Id
  Zookeeper1AZ:
    Description: Availability Zone of the Subnet
    Type: AWS::EC2::AvailabilityZone::Name

由此,我创建了一个ENI(需要一个子网)和一个EBS Volume(需要一个可用区域)。

这是ENI:

Zookeeper1IPResource:
    Properties:
      Description: Zookeeper1-IP
      GroupSet:
        - Fn::GetAtt:
            - ZookeeperSecurityGroup
            - GroupId
      PrivateIpAddress:
        Ref: Zookeeper1IPParam
      SubnetId:
        Ref: Zookeeper1SubnetParam
    Type: AWS::EC2::NetworkInterface

这是EBS:

Zookeeper1EBSVolume:
    Properties:
      AvailabilityZone:
        Ref: Zookeeper1AZ
      Size: 8
      VolumeType: gp2
    Type: AWS::EC2::Volume

我认为这对用户体验真的很不利,还要求将其作为可用区的参数,因为可以从所选子网中扣除它

现在,有百万美元的问题,我如何从CloudFormation的子网中获得可用区?据我所知,我无法在我的ENI上为AZ做GetAtt。

欢迎使用任何解决方案!

2 个答案:

答案 0 :(得分:1)

要回答您的问题, 您不能 从子网中获取可用区域。

但是,如果您完全控制了模板或为模板提供参数的资源,则有变通办法

如果可以控制源,则可以为您提供Subnet参数,也可以从源中返回Availability Zone作为Outputs,并将其作为参数提供给模板。您将创建ENI和EBS。

此外,您还可以在与将创建ENI和EBS并使用{ "Fn::GetAtt" : [ "mySubnet", "AvailabilityZone" ] }

的模板相同的模板中创建子网。

问题(对不起,我的代表无法允许我发表评论)

您是否碰巧要根据可用性区域创建动态值或资源?如果是,则可以创建Mappings,如果还不够,可以在模板中添加Conditions

答案 1 :(得分:-1)

我不知道这是否是新东西,但是根据文档,您可以使用GetAttr获取子网的可用区。

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html#aws-resource-ec2-subnet-returnvalues

引用文档:

{ "Fn::GetAtt" : [ "mySubnet", "AvailabilityZone" ] }

更新:

此建议错误,让我引用AWS的另一份文档:

Supported Functions
For the Fn::GetAtt logical resource name, you cannot use functions. You must specify a string that is a resource's logical ID.

For the Fn::GetAtt attribute name, you can use the Ref function.

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-getatt.html#getatt-supported-functions