AWS CloudFormation多AZ子网分配:如何用IF-ELSE处理3AZ场景?
解决CloudFormation中基于AZ数量的子网分配逻辑问题
需求场景
- 1个AZ时,分配
PrivateSubnet1到Subnets - 2个AZ时,分配
PrivateSubnet1和PrivateSubnet2到Subnets - 3个AZ时,分配
PrivateSubnet1、PrivateSubnet2和PrivateSubnet3到Subnets
解决方案
CloudFormation的!If支持嵌套使用,你可以通过多层嵌套的!If来覆盖3AZ、2AZ和1AZ的所有场景。修改后的完整代码如下:
Conditions: SingleZone: !Equals [!Ref NumberOfZones, 1] TwoZones: !Equals [!Ref NumberOfZones, 2] ThreeZones: !Equals [!Ref NumberOfZones, 3] Resources: # 替换为你实际的资源名称(如ECSCluster、AutoScalingGroup等) TargetResource: Properties: Subnets: !If - ThreeZones - !Join [',', [!Ref PrivateSubnet1, !Ref PrivateSubnet2, !Ref PrivateSubnet3]] - !If - TwoZones - !Join [',', [!Ref PrivateSubnet1, !Ref PrivateSubnet2]] - !Ref PrivateSubnet1
逻辑说明
- 优先判断
ThreeZones条件:若匹配3个AZ的场景,直接返回三个子网的逗号分隔字符串 - 若不满足3AZ,进入第二层
!If判断TwoZones条件:匹配2个AZ时返回两个子网的逗号分隔字符串 - 最后默认分支(既非3也非2个AZ),返回单个
PrivateSubnet1
如果你的资源Subnets属性需要的是子网ID/ARN的数组列表而非逗号分隔字符串,可去掉!Join直接使用数组形式:
Subnets: !If - ThreeZones - - !Ref PrivateSubnet1 - !Ref PrivateSubnet2 - !Ref PrivateSubnet3 - !If - TwoZones - - !Ref PrivateSubnet1 - !Ref PrivateSubnet2 - - !Ref PrivateSubnet1
内容的提问来源于stack exchange,提问作者CJ Chang
相关产品推荐
相关产品推荐

