创建AWS CloudFormation跨栈引用时提示YAML格式错误求助
问题原因
第15行YAML解析失败由两个语法错误导致:
- 内置函数嵌套格式不合法:使用
!开头的短格式CloudFormation内置函数时,参数必须紧跟函数标签,你将!ImportValue的参数拆到下一行后缩进错位,短标签与全写Fn::Sub的嵌套不符合YAML映射结构要求。 !Cidr函数参数结构断裂:!Cidr需要三个顺序固定的参数:源CIDR段、待切分子网数量、子网前缀长度,你把后两个参数3, 8写到了!ImportValue的结构外部,破坏了YAML的层级嵌套关系,解析器无法识别参数归属。
你模板中VpcId字段的!ImportValue嵌套Fn::Sub也存在相同格式问题,只是校验时先命中了CidrBlock行的错误。
修正方案
调整嵌套函数的缩进和结构,两种合法写法均可:
短标签写法(更简洁)
统一使用!开头的短函数标签,按层级缩进对齐所有参数,保证!Cidr的三个参数都归属到自身的参数列表内:
CidrBlock: !Select - 0 - !Cidr - !ImportValue !Sub "${NetworkStackParameter}-VPCCIDR" - 3 - 8 VpcId: !ImportValue !Sub "${NetworkStackParameter}-VPCID"
全写函数写法(结构更清晰,适合初学者)
全部使用Fn::开头的全写函数格式,层级关系更直观,不容易出现缩进错误:
CidrBlock: Fn::Select: - 0 - Fn::Cidr: - Fn::ImportValue: Fn::Sub: "${NetworkStackParameter}-VPCCIDR" - 3 - 8 VpcId: Fn::ImportValue: Fn::Sub: "${NetworkStackParameter}-VPCID"
修正后可正常校验的完整模板
AWSTemplateFormatVersion: "2010-09-09" Description: 在主VPC创建私有子网并共享给指定账号 Parameters: NetworkStackParameter: Type: String Resources: # 创建us-east-1a可用区私有子网 PrivateSubnetABC: Type: AWS::EC2::Subnet Properties: CidrBlock: !Select - 0 - !Cidr - !ImportValue !Sub "${NetworkStackParameter}-VPCCIDR" - 3 - 8 VpcId: !ImportValue !Sub "${NetworkStackParameter}-VPCID" AvailabilityZone: "us-east-1a" Tags: - Key: "Name" Value: "PrivateSubnetABC" # 创建RAM资源共享 PrivateSubnetABCShare: Type: AWS::RAM::ResourceShare Properties: Name: "Service ABC" Principals: - "123456789012" # 替换为真实的12位目标账号ID ResourceArns: - !Sub 'arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:subnet/${PrivateSubnetABC}'
其他注意事项
- 原模板中标签Key为小写
name,AWS控制台默认识别大写开头的Name标签作为资源显示名,建议修改否则控制台资源列表不会展示你设置的子网名称。 - RAM资源共享的Principal字段需要填写12位的AWS账号ID,原模板中填写的
1234567890仅10位,需要替换为真实目标账号ID。 - 跨栈引用需要保证主VPC栈的导出值名称与当前模板中
!Sub拼接的名称完全一致,否则部署时会报导出值不存在的错误。
内容的提问来源于stack exchange,提问作者foa771
相关产品推荐
相关产品推荐

