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

Ste*_*ane 8 amazon-web-services aws-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
Run Code Online (Sandbox Code Playgroud)

由此我创建了一个ENI(需要一个子网)和一个EBS卷(需要一个可用区).

这是ENI:

Zookeeper1IPResource:
    Properties:
      Description: Zookeeper1-IP
      GroupSet:
        - Fn::GetAtt:
            - ZookeeperSecurityGroup
            - GroupId
      PrivateIpAddress:
        Ref: Zookeeper1IPParam
      SubnetId:
        Ref: Zookeeper1SubnetParam
    Type: AWS::EC2::NetworkInterface
Run Code Online (Sandbox Code Playgroud)

这是EBS:

Zookeeper1EBSVolume:
    Properties:
      AvailabilityZone:
        Ref: Zookeeper1AZ
      Size: 8
      VolumeType: gp2
    Type: AWS::EC2::Volume
Run Code Online (Sandbox Code Playgroud)

我发现它对用户体验非常不利,还要求作为可用区的参数,因为它可以从所选子网中扣除

现在,百万美元的问题,我如何从CloudFormation中的子网获得可用区?据我所知,我不能在我的ENI上为AZ做一个GetAtt.

欢迎任何方案!

gzz*_*gzz 5

要回答您的问题,您无法从子网检索可用区。

但是,如果您完全控制模板或向模板提供参数的资源,则有一些解决方法

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

此外,您还可以在创建 ENI 和 EBS 的同一模板中创建子网,并使用{ "Fn::GetAtt" : [ "mySubnet", "AvailabilityZone" ] }

问题(抱歉,我的代表还不允许我发表评论)

您是否碰巧需要创建取决于可用区域的动态值或资源?如果是,您可以创建映射,如果这还不够,您可以在模板中添加条件。