首页 > 解决方案 > AWS CDK,为 Route53 中的现有托管区域创建别名记录

问题描述

我正在使用 AWS CDK(使用 Python 作为我的部署语言),并且正在尝试将现有云端分发的别名记录添加到现有托管区域。虽然我可以开始cdk synth工作,cdk deploy但找不到托管区域。

我使用 AWS CDK 版本 1.5.0(构建 c020efa)和 1.6.0(构建 3a0cde0)进行了测试。

我试着像这样找到区域:

zone = route53.HostedZone.from_hosted_zone_attributes(
    self,
    'MyHostedZone',
    zone_name = props.domainName,
    hosted_zone_id = 'Z1XXXXXXXXXS1'
)

就像这样:

zone = route53.HostedZone.from_lookup(
    self,
    'MyHostedZone',
    domain_name = props.domainName
)

并使用它(如果创建了新的托管区域,则可以使用):

route53.ARecord(
    self,
    'SiteAliasRecord',
    record_name = siteDomain,
    target = route53.RecordTarget(alias_target=target),
    zone = zone
)

在这两种情况下,错误消息都是:

StaticSiteHTTPS/SiteAliasRecord (StaticSiteHTTPSSiteAliasRecord9BXXXXX) 未找到 ID 为 Z2XXX6BQ9TEB5H 的托管区域(服务:AmazonRoute53;状态代码:404;错误代码:NoSuchHostedZone;请求 ID:

我不知道 IDZ2XXX6BQ9TEB5H来自哪里,它不在我的模板中,而且我没有具有此 ID 的托管区域。两者都生成一个 .template.json ,其中包含:

"StaticSiteHTTPSSiteAliasRecord9BXXXXX": {
  "Type": "AWS::Route53::RecordSet",
  "Properties": {
    "Name": "dev.mydomain.com.",
    "Type": "A",
    "AliasTarget": {
      "DNSName": {
        "Fn::GetAtt": [
          "StaticSiteHTTPSSiteDistributionCFDistribution3BXXXXX",
          "DomainName"
        ]
      },
      "HostedZoneId": "Z2YYYYYYYYYW2"
    },
    "HostedZoneId": "Z1XXXXXXXXXXS1"
  },

from_lookup生成"HostedZoneId": "/hostedzone/Z1XXXXXXXXXXS1",而在 template.json 中生成,但无论哪种方式from_hosted_zone_attributes都找不到托管区域。但是,这似乎表明找到托管区域 OK,运行条目也是由 在那里创建的。"HostedZoneId": "Z1XXXXXXXXXXS1"deploysynthcdk contextsynth

我还尝试通过它获取托管区域from_hosted_zone_idfrom_hosted_zone_attributes这也会引发错误,但我的理解是它们实际上并没有在我的帐户中查找任何内容。

附带说明一下,使用 CDK 创建一个新的托管区域是可行的,它包含别名记录。

我该如何进一步调试呢?我应该使用不同的机制来提供或查找我的托管区域吗?

标签: pythonamazon-web-servicesamazon-route53aws-cdk

解决方案


很抱歉在 Python 中没有这个功能,但我之前已经获得了一个 Route53 别名来为 CloudFront 分配工作。

我会尝试通过首先导入 Route53 目标模块来创建您的别名记录目标:

...
import route53 = require('@aws-cdk/aws-route53');
import targets = require('@aws-cdk/aws-route53-targets');

然后,当您实例化您的分配时,您可以使用以下命令创建别名记录目标:

const hostedZoneId; // get from props or SSM lookup (Z****)
const zoneName; // get from props or SSM lookup (mydomain.com)
const myHostedZone = route53.HostedZone.fromHostedZoneAttributes(this, 'MyImportedHostedZone', {
  hostedZoneId,
  zoneName,
});

aliasRecord = new route53.ARecord(this, 'MyAliasRecord', {
  target: route53.RecordTarget.fromAlias(new targets.CloudFrontTarget(distribution)),
  zone: myHostedZone,
  recordName: 'SiteAliasRecord',
};

推荐阅读