CloudFormation私有子网默认路由条件属性配置语法求助
CloudFormation 私有子网默认路由条件配置正确语法
适用场景
- 模板支持堆栈创建时选择
dev/prod环境prod环境:每个可用区部署1个NAT网关,合计2个dev环境:仅部署1台NAT实例
- 路由配置要求:根据所选环境,动态为私有路由表的0.0.0.0/0默认路由指定下一跳,prod环境指向NAT网关,dev环境指向NAT实例
原有写法问题说明
- 第一种全量属性放入
!If分支的写法:prod环境下CloudFormation无法正确识别路由对NAT网关的隐式依赖,会在NAT网关未就绪时提前创建路由,最终触发路由稳定超时错误 - 第二种分支内仅写部分属性的写法:prod分支缺失
RouteTableId、DestinationCidrBlock必填参数,直接触发参数校验失败 - 第三种公共属性前置后同级缩进写
!If的写法:不符合YAML语法规范,!If返回的键值对无法直接映射到Properties对象下,直接报模板格式错误
正确实现语法
核心规则:公共固定属性直接声明在Properties下,仅对存在差异的下一跳属性做条件判断,通过AWS::NoValue伪参数在条件不满足时移除不需要的属性,避免同时声明多个下一跳类型触发校验错误。
# Conditions段需提前定义环境判断逻辑 Conditions: IsProd: !Equals [!Ref EnvironmentType, "prod"] # 替换为模板中实际的环境参数判断规则 Resources: DefaultPrivateRoute1: Type: AWS::EC2::Route Properties: # 公共固定属性直接声明,不需要放入条件分支 RouteTableId: !Ref PrivateRouteTable1 DestinationCidrBlock: 0.0.0.0/0 # prod环境下声明GatewayId,dev环境下移除该属性 GatewayId: !If - IsProd - !Ref NatGateway1 - !Ref AWS::NoValue # dev环境下声明InstanceId,prod环境下移除该属性 InstanceId: !If - IsProd - !Ref AWS::NoValue - !Ref NATInstance
写法优势
- 完全符合YAML语法规范,不会报格式错误
- CloudFormation可正确识别资源依赖:prod环境下会等待NAT网关、关联EIP完全创建就绪后再执行路由创建,不会出现稳定超时问题
- 不会触发EC2路由的参数校验错误:任意环境下最终只会存在一个下一跳属性,符合资源属性要求
- 第二个可用区的默认路由只需替换对应路由表ID、NAT网关ID即可复用相同逻辑
内容的提问来源于stack exchange,提问作者aws_allthethings
相关产品推荐
相关产品推荐

