通过CloudFormation为路由表关联多个子网遇JSON错误
CloudFormation 多子网关联路由表的正确配置方式
错误原因
AWS::EC2::SubnetRouteTableAssociation 资源不支持在单个实例中配置多个SubnetId,每个该类型资源只能关联一个子网与一个路由表——你尝试的两种格式都违背了这个属性定义,SubnetId字段仅接受单个字符串值,而非数组或嵌套结构,这是触发JSON错误的核心原因。
正确配置方式
方式1:为每个子网创建独立的关联资源
直接为每个需要关联的子网单独定义SubnetRouteTableAssociation资源,示例代码如下:
RouteTableAssociationOpsA: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !ImportValue !Sub '${AWS::StackName}-OpsSubA' RouteTableId: !Ref PublicRouteTable RouteTableAssociationProdA: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !ImportValue !Sub '${AWS::StackName}-ProdSubA' RouteTableId: !Ref PublicRouteTable RouteTableAssociationDemoA: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !ImportValue !Sub '${AWS::StackName}-DemoSubA' RouteTableId: !Ref PublicRouteTable RouteTableAssociationDevA: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !ImportValue !Sub '${AWS::StackName}-DevSubA' RouteTableId: !Ref PublicRouteTable
方式2:使用批量创建语法(需模板版本≥2021-09-09)
如果子网数量较多,可以用CloudFormation的Fn::ForEach语法批量生成关联资源,简化代码:
AWSTemplateFormatVersion: "2021-09-09" Resources: Fn::ForEach::SubnetAssociations: - SubnetName - [OpsSubA, ProdSubA, DemoSubA, DevSubA] - RouteTableAssociation${SubnetName}: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !ImportValue !Sub '${AWS::StackName}-${SubnetName}' RouteTableId: !Ref PublicRouteTable
内容的提问来源于stack exchange,提问作者Michaey Tenorio
相关产品推荐
相关产品推荐

