使用AWS re:Post即您表示您同意 AWS re:Post 使用条款

如何解决使用 AWS CloudFormation 创建 Route 53 记录集时遇到的错误?

3 分钟阅读
0

我想解决我在使用 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 属性或同时定义 TTLResourceRecords 属性。

  • 如果您为 AWS::Route53::RecordSet 定义了 AliasTarget 属性,则不要在同一个资源中定义 TTLResourceRecords 属性。

    请参阅以下示例,仅定义 AliasTarget 属性,而不定义 TTLResourceRecords 属性:

    SampleR53AliasRecord:
        Type: AWS::Route53::RecordSet
        Properties:
          Name: 'abc.domain.com'
          Type: A
          AliasTarget:
            DNSName: !GetAtt MyELB.DNSName
            HostedZoneId: !GetAtt MyELB.CanonicalHostedZoneNameID
          HostedZoneId: "Z1234567XXXXXXXXXX"
  • 如果您没有定义 AliasTarget 属性,请检查您是否同时定义了 TTLResourceRecords 属性。

  • 如果只定义其中一个属性,也会出现错误。如果您定义了 ResourceRecords 属性,则还必须在模板中定义 TTL 属性。同样,如果您定义了 TTL,则还必须定义 ResourceRecords

    以下示例向您展示如何仅定义 TTLResourceRecords 属性:

    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 命令来验证资源记录是否已在托管区中可用:
    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`)]
    **注意:**将上述命令中的 YOUR-HOSTED-ZONE-NAME、YOUR-RESOURCE-RECORD-NAME 和 YOUR-TYPE-OF-RECORD 替换为与错误消息中列出值完全一致的值。
  • 如果上述命令返回一个值,则在创建该记录之前,使用 CloudFormation 将其从您的托管区中删除。在从托管区手动删除此记录之前,对您的应用程序进行影响评估。在采取该步骤之前,请仔细考虑移除此记录会对您的应用程序产生怎样的影响。

相关信息

错误

AWS::Route53::RecordSet

AWS 官方
AWS 官方已更新 10 个月前