从 CloudFormation 中的子网参数获取可用区
Get Availability Zone from Subnet Parameter in 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 (which requires a subnet) and an 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。
欢迎任何解决方案!
我不知道这是否是新东西,但根据文档,您可以获得 GetAttr
.
子网的 AZ
引用文档:
{ "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.
要回答您的问题,您不能从子网中检索可用区。
但如果您完全控制模板或为模板提供参数的资源,则有一些解决方法
如果可以控制为您提供 Subnet
参数的源,您还可以 return 来自该源的 Availability Zone
作为 Outputs
并将其提供您的模板作为创建 ENI 和 EBS 的参数。
此外,您还可以在创建 ENI 和 EBS 的同一模板中创建子网,并使用 { "Fn::GetAtt" : [ "mySubnet", "AvailabilityZone" ] }
问题(抱歉,我的代表还不允许我发表评论)
您是否碰巧要创建取决于可用性区域的动态值或资源?如果是,您可以在模板中创建 Mappings and if that is not enough, you could add Conditions。
我有
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 (which requires a subnet) and an 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。
欢迎任何解决方案!
我不知道这是否是新东西,但根据文档,您可以获得 GetAttr
.
引用文档:
{ "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.
要回答您的问题,您不能从子网中检索可用区。
但如果您完全控制模板或为模板提供参数的资源,则有一些解决方法
如果可以控制为您提供 Subnet
参数的源,您还可以 return 来自该源的 Availability Zone
作为 Outputs
并将其提供您的模板作为创建 ENI 和 EBS 的参数。
此外,您还可以在创建 ENI 和 EBS 的同一模板中创建子网,并使用 { "Fn::GetAtt" : [ "mySubnet", "AvailabilityZone" ] }
问题(抱歉,我的代表还不允许我发表评论)
您是否碰巧要创建取决于可用性区域的动态值或资源?如果是,您可以在模板中创建 Mappings and if that is not enough, you could add Conditions。