CloudFormation添加多条Route53 A记录时YAML格式错误排查
解决CloudFormation批量创建Route53 A记录的格式问题
核心问题分析
你遇到的YAML格式错误,大概率是!Join函数的数组参数缩进不规范,或是批量创建资源时的循环语法不符合CloudFormation的YAML规则。要批量生成子域名A记录,无需逐个索引配置,推荐使用CloudFormation的**!ForEach循环**(需确保模板使用2010-09-09及以上格式版本,且目标AWS区域支持该功能)。
正确模板配置示例
以下是完整可运行的模板,包含参数定义、域名映射、批量创建A记录的逻辑:
AWSTemplateFormatVersion: 2010-09-09 Parameters: SubDomains: Type: CommaDelimitedList Description: 子域名列表,用逗号分隔(如stat,log,it,web) Default: stat,log,it,web TargetIp: Type: String Description: A记录指向的目标IP地址 Default: 192.168.1.1 Mappings: DomainMap: CN: DomainName: example.com Resources: !ForEach SubDomain in !Ref SubDomains: - ${SubDomain}Record: Type: AWS::Route53::RecordSet Properties: HostedZoneName: !FindInMap [DomainMap, CN, DomainName] Name: !Join ['.', [!Ref SubDomain, !FindInMap [DomainMap, CN, DomainName]]] Type: A TTL: '300' ResourceRecords: - !Ref TargetIp
关键细节说明
- 参数处理:
SubDomains采用CommaDelimitedList类型,传入的逗号分隔字符串会自动解析为数组,适配批量循环需求。 - 域名拼接:
!Join函数必须以数组形式传入参数,注意方括号内元素的逗号分隔和缩进一致性,这是避免格式错误的核心。 - 批量创建逻辑:通过
!ForEach遍历SubDomains数组,自动为每个子域名生成独立的AWS::Route53::RecordSet资源,无需手动逐个定义。 - 托管区配置:如果你的Route53托管区使用ID而非名称,可将
HostedZoneName替换为HostedZoneId并传入对应ID。
常见格式错误排查
- 确保
!Join的参数数组格式正确:# 正确写法 !Join ['.', [!Ref SubDomain, !FindInMap [DomainMap, CN, DomainName]]] # 错误写法(缩进或逗号缺失) !Join ['.', !Ref SubDomain !FindInMap [DomainMap, CN, DomainName] ] - 若使用旧版CloudFormation不支持
!ForEach,可改用AWS::Route53::RecordSetGroup实现批量创建:Route53RecordSetGroup: Type: AWS::Route53::RecordSetGroup Properties: HostedZoneName: !FindInMap [DomainMap, CN, DomainName] RecordSets: !ForEach SubDomain in !Ref SubDomains: - Name: !Join ['.', [!Ref SubDomain, !FindInMap [DomainMap, CN, DomainName]]] Type: A TTL: '300' ResourceRecords: - !Ref TargetIp
内容的提问来源于stack exchange,提问作者Markus
相关产品推荐
相关产品推荐

