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) Не обнаружена размещенная зона с идентификатором: Z2XXX6BQ9TEB5H (служба: AmazonRoute53; код состояния: 404; код ошибки: NoSuchHostedZone; идентификатор запроса:

Я не знаю, откуда берется ID Z2XXX6BQ9TEB5H, его нет в моем шаблоне, и у меня нет размещенной зоны с этим идентификатором. Оба генерируют .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 генерирует "HostedZoneId": "Z1XXXXXXXXXXS1" в template.json, но в любом случае deploy не находит размещенную зону. Однако это, похоже, предполагает, что synth находит размещенную зону в порядке, и записи cdk context создаются там также synth.

Я также попытался получить размещенную зону через from_hosted_zone_id и from_hosted_zone_attributes, которые также вызывают ошибки, но я понимаю, что они на самом деле ничего не ищут в моей учетной записи.

Кстати, создание новой размещенной зоны с помощью CDK работает и содержит запись псевдонима.

Как я могу отладить это дальше? Должен ли я использовать другой механизм для предоставления или поиска моей размещенной зоны?


person ikkjo    schedule 28.08.2019    source источник
comment
Я не уверен в python, но в TS он работает, просто имея это: _1 _ $ {stackName} -hosted-zone, { hostedZoneId: staticSiteArgs.HostedZoneId, zoneName: staticSiteArgs.HostedZoneName }); Затем создайте запись: _3 _ $ {stackName} -dns-record, { zone: zone, recordName: fullDnsRecordName, target: routing.AddressRecordTarget.fromAlias(target), ttl: cdk.Duration.minutes(staticSiteArgs.DnsTTLMinutes) });   -  person charlybones    schedule 02.09.2019
comment
@charlybones, большое спасибо за подтверждение вашего рабочего ts-кода. Я считаю, что мой код Python почти идентичен. Следуя вашему примеру, я теперь также пробовал использовать PublicHostedZone, а не HostedZone. К сожалению, я получаю такое же сообщение об ошибке. Может быть, я подниму вопрос в гитхабе CDK.   -  person ikkjo    schedule 03.09.2019


Ответы (2)


Приносим извинения за то, что этого не было в 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',
};
person john-shaskin    schedule 19.11.2019
comment
Привет, большое спасибо за то, что поделились. Раньше я тоже пробовал соответствующий код Python. Проблема заключалась в том, что если я передал что-то в качестве зоны, которая не была создана как часть стека, но уже существовала, поиск не удался во время развертывания, и у меня не было возможности обновить существующую зону. Как вы получаете / настраиваете myHostedZone в своем примере? - person ikkjo; 02.12.2019
comment
Привет, @ikkjo, я импортирую размещенную зону из той же учетной записи AWS, в которой развертываюсь, через импорт CDK, аналогично тому, что вы описали. Приведенный выше ответ был отредактирован и теперь включает код импорта размещенной зоны. Первоначально я реализовал это в CDK 1.8.0, и, похоже, он все еще работает с 1.18.0. Если ваша версия CDK относительно свежая, и вы уверены, что значения идентификатора зоны и имени верны, возможно, существует какая-то проблема, связанная с питоном. - person john-shaskin; 11.12.2019
comment
Привет @ john-shaskin, большое спасибо за подтверждение! Я также пробовал с 1.16.0 и имел те же проблемы. Думаю, вы правы, и это может быть проблема конкретного языка. Для справки я открыл github.com/aws/aws-cdk/issues/3913 и кажется, что люди из CDK согласны с этим, поскольку это было отсортировано от руководства к ошибке. - person ikkjo; 12.12.2019

Возможно, это не совсем решит вашу проблему, но 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)

работал у меня.

person Tom Greenwood    schedule 01.04.2020
comment
Спасибо! Попробую еще раз. Как я сказал в вопросе, я пытался в то время, и это не сработало, возможно, прошло достаточно времени, и некоторые исправления ошибок заставляют эту работу работать сейчас. по крайней мере, хорошо знать, что это может сработать. - person ikkjo; 09.04.2020