如何解决使用 AWS CloudFormation 创建 Route 53 记录集时遇到的错误?
我想解决我在使用 AWS CloudFormation 创建 Amazon Route 53 资源记录集时遇到的错误。
解决方法
以下是您在尝试使用 AWS CloudFormation 模板创建 Route 53 记录集时可能会遇到的一些常见错误。要解决问题,请遵循针对每个错误提供的指南。
**注意:**如果在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误消息,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
错误: “No hosted zones named "domain.com" found”(未找到名为 “domain.com” 的托管区)
当 CloudFormation 无法识别为 HostedZoneName 属性定义的托管区名称时,就会出现此错误。要解决此错误,请检查以下步骤:
-
检查传递给 HostedZoneName 属性的值,并确保它包含尾随句点 (.)。托管区名称(例如 domain.com)需要包含尾随句点才能有效。
例如:SampleRecordSet: Type: AWS::Route53::RecordSet Properties: HostedZoneName: "domain.com." #note trailing dot Name: image1.domain.com Type: CNAME TTL: '60' ResourceRecords: - new.example
如果托管区名称已经包含尾随句点,请检查您的 AWS 账户中是否已经存在使用该名称的托管区。在尝试创建记录集之前,使用以下 AWS CLI 命令来验证托管区名称是否可用。
aws route53 list-hosted-zones \ --query 'HostedZones[?Name==`YOUR-HOSTED-ZONE-NAME`]'
**注意:**将上述命令中的 YOUR-HOSTED-ZONE-NAME 替换为传递给 CloudFormation 堆栈中 HostedZoneName 属性的值。
-
如果上述命令未返回任何记录,则该托管区在您的账户中不可用。要解决此错误,请在创建 RecordSet 之前创建托管区。
错误: “RRSet with DNS name a.domain.com is not permitted in zone domain-test.com.”(不允许在托管区 domain-test.com 中使用 DNS 名称为 a.domain.com 的 RRSet。)
如果传递给 AWS::Route53::RecordSet 资源的 Name 属性的 DNS 值与托管区不匹配,则会收到此错误消息。要解决此问题,请检查以下选项。
- 传递给 AWS::Route53::RecordSet 资源中的 Name 属性的值必须是完全限定域名。检查您是否为自己的 DNS 记录集传递了完全限定域名。例如,如果您的域名是 domain.com,则完全限定域名必须类似于 a.domain.com。仅传递“a”可能会导致失败并出现错误,因为它不是完全限定域名。
- DNS 名称必须是托管区的子域。例如,如果托管区名称为 domain-test.com,则您的记录集的 Name 属性必须类似于 xxxxx.domain-test.com。
错误: “No hosted zone found with ID: Z1234567XXXXXXXXXX”(未找到具有以下 ID 的托管区:Z1234567XXXXXXXXXX)
如果传递给 HostedZoneId 属性的值并没有跟您的账户相关联,则会看到此错误消息。要解决此错误,请检查以下选项:
-
验证提供给堆栈的 AWS::Route53::RecordSet 资源的托管区 ID 值是否正确且存在于您的 AWS 账户中。
-
使用以下 AWS CLI 命令来检查托管区 ID 在您的账户中是否可用:
aws route53 get-hosted-zone --id Z1234567XXXXXXXXXX
-
如果上述命令返回错误,则托管区 ID 在您的 AWS 账户中不可用。尝试将有效的托管区 ID 值传递给 AWS::Route53::RecordSet 资源的 HostedZoneId 属性,再次创建堆栈。这会将记录集与 Route 53 中实际存在的托管区相关联。
错误: “Duplicate hosted zones for hosted zone name domain.com.”(名为 domain.com 的托管区存在重复的托管区。)
您可以在 Route 53 中创建多个同名托管区。尝试通过传递 HostedZoneName 属性来创建 AWS::Route53::RecordSet 资源。但是,如果有多个同名的托管区,则会收到一条错误消息。
要修复此错误,请不要为 AWS::Route53::RecordSet 资源定义 HostedZoneName 属性。相反,应定义 HostedZoneId 属性。然后,在创建记录集时传递托管区 ID。例如:
SampleRecordSet: Type: AWS::Route53::RecordSet Properties: HostedZoneId: "Z1234567XXXXXXXXXX" Name: image1.domain.com Type: CNAME TTL: '60' ResourceRecords: - new.example
错误: “Expected exactly one of [AliasTarget, all of [TTL, and ResourceRecords], or TrafficPolicyInstanceId], but found none in Change with [Action=CREATE, Name=a.domain.com., Type=A, SetIdentifier=null]”(本来应该是 [AliasTarget, all of [TTL, and ResourceRecords], or TrafficPolicyInstanceId] 中的一个,但是在 Change 中找不到任何一个带有 [Action=CREATE, Name=a.domain.com., Type=A, SetIdentifier=null])
如果您没有在模板中定义 AWS::Route53::RecordSet 资源的所有必需属性,就会看到此错误消息。每个 Route 53 RecordSet 资源都要求您设置特定的配置属性。当您的模板中缺少这些必需的属性时,就会出现错误。要解决此错误,请检查以下选项:
-
为 AWS::Route53::RecordSet 资源定义 AliasTarget 属性或同时定义 TTL 和 ResourceRecords 属性。
-
如果您为 AWS::Route53::RecordSet 定义了 AliasTarget 属性,则不要在同一个资源中定义 TTL 或 ResourceRecords 属性。
请参阅以下示例,仅定义 AliasTarget 属性,而不定义 TTL 和 ResourceRecords 属性:
SampleR53AliasRecord: Type: AWS::Route53::RecordSet Properties: Name: 'abc.domain.com' Type: A AliasTarget: DNSName: !GetAtt MyELB.DNSName HostedZoneId: !GetAtt MyELB.CanonicalHostedZoneNameID HostedZoneId: "Z1234567XXXXXXXXXX"
-
如果您没有定义 AliasTarget 属性,请检查您是否同时定义了 TTL 和 ResourceRecords 属性。
-
如果只定义其中一个属性,也会出现错误。如果您定义了 ResourceRecords 属性,则还必须在模板中定义 TTL 属性。同样,如果您定义了 TTL,则还必须定义 ResourceRecords。
以下示例向您展示如何仅定义 TTL 和 ResourceRecords 属性:
SampleRecordSet: Type: AWS::Route53::RecordSet Properties: HostedZoneId: "Z1234567XXXXXXXXXX" Name: image1.domain.com Type: CNAME TTL: '60' ResourceRecords: - new.example
错误: “Tried to create resource record set [name='a.domain.com.', type='A', set-identifier='null'] but it already exists”(尝试创建资源记录集 [name='a.domain.com.', type='A', set-identifier='null'],但它已经存在)
您尝试在已包含同名别名记录集的托管区中创建别名记录集。要解决此错误,请检查以下选项
- 检查您是否在正确的托管区内创建别名记录集。验证托管区 ID 或名称是否与您要创建别名记录集的托管区相匹配。
- 检查您尝试使用 CloudFormation 创建的 A 或 CNAME 记录类型是否已存在于托管区中。您可以使用以下 AWS CLI 命令来验证资源记录是否已在托管区中可用:
**注意:**将上述命令中的 YOUR-HOSTED-ZONE-NAME、YOUR-RESOURCE-RECORD-NAME 和 YOUR-TYPE-OF-RECORD 替换为与错误消息中列出值完全一致的值。aws route53 list-resource-record-sets \ --hosted-zone-id YOUR-HOSTED-ZONE-NAME \ --query 'ResourceRecordSets[?(Name==`YOUR-RESOURCE-RECORD-NAME` && Type==`YOUR-TYPE-OF-RECORD`)]
- 如果上述命令返回一个值,则在创建该记录之前,使用 CloudFormation 将其从您的托管区中删除。在从托管区手动删除此记录之前,对您的应用程序进行影响评估。在采取该步骤之前,请仔细考虑移除此记录会对您的应用程序产生怎样的影响。
相关信息
相关内容
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前