AWS CDK,为Route53中的现有托管区域创建别名记录

时间:2019-08-28 11:44:16

标签: python amazon-web-services amazon-route53 aws-cdk

我正在使用AWS CDK(以Python作为部署语言),并且试图将现有Cloudfront发行版本的别名记录添加到现有托管区域。虽然我可以使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:

我不知道ID Z2XXX6BQ9TEB5H的来源不在我的模板中,并且我没有此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",而from_hosted_zone_attributes在template.json中生成"HostedZoneId": "Z1XXXXXXXXXXS1",但是无论哪种方式deploy都找不到托管区域。但是,这似乎表明synth找到了托管区域,并且cdk context也在其中创建了运行synth条目。

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

另一方面,可以使用CDK创建一个新的托管区域,并且其中包含别名记录。

如何进一步调试?我是否应该使用其他机制来提供或查找托管区域?

2 个答案:

答案 0 :(得分:0)

很抱歉在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',
};

答案 1 :(得分:0)

这可能无法完全解决您的问题,但是from_hosted_zone_id在python中似乎可以正常工作。

zone = route53.HostedZone.from_hosted_zone_id(self, "existing-zone", 
       hosted_zone_id = MyHostedZoneId)


record = route53.ARecord(self, 'AliasRecord',
            record_name = MyRecordName,
            target = route53.RecordTarget(alias_target = target), zone = zone)

为我工作。