AWS CDK: как настроить таргетинг на среду Elastic Beanstalk с помощью записи псевдонима Route53

Для создания приложения и среды Elastic Beanstalk у меня есть следующий код:

// this: the class instance extending Construct

const application = new CfnApplication(this, 'Application', {
  applicationName: 'some-name'
});
const environment = new CfnEnvironment(this, 'Environment', {
  environmentName: 'production',
  applicationName: application.applicationName,
  platformArn: 'arn::of::plaform',
  solutionStackName: 'a-valid-stack-name'
});

Для создания записи псевдонима в Route53 требуется цель, реализующая IAliasRecordTarget

const record = new AliasRecord(this, 'ARecord', {
 recordName: 'a-record',
 target: ?
 zone: zone
});

Как я могу использовать среду в качестве цели? Поиск классов, реализующих IAliasRecordTarget в репозитории aws-cdk, не дает большого количества кандидатов, кроме облачного распределения и базового балансировщика нагрузки.


person Arjan    schedule 16.05.2019    source источник
comment
beanstalk также создает балансировщик нагрузки, вы можете использовать его или просто использовать имя DNS beanstalk,   -  person James Dean    schedule 16.05.2019


Ответы (3)


Свойство target ожидает объект с функцией bind(), возвращающей dnsName, evaluateTargetHealth и hostedZoneId (см. AWS :: Route53 :: RecordSet AliasTarget и реализация AliasRecord).

Вы можете сделать следующее:

const record = new AliasRecord(this, 'ARecord', {
  recordName: 'a-record',
  target: {
    bind: (): AliasRecordTargetProps => ({
      dnsName: environment.attrEndpointUrl,
      hostedZoneId: 'Z14LCN19Q5QHIC' // for us-east-2
    })
  },
  zone: zone
});

Список размещенных идентификаторы зон при использовании другого региона или конечных точек и квот эластичной балансировки нагрузки когда среда сбалансирована по нагрузке.

ОБНОВЛЕНИЕ 28 мая 2018 г.: asAliasRecordTarget теперь bind в aws-cdk версии 0.32.0

person jogold    schedule 16.05.2019
comment
Ссылка вообще не предоставляет идентификатор размещенной зоны. Может изменилось? Как мы можем поступить сейчас? - person Hugo Mallet; 18.06.2020
comment
Редактирование моего предыдущего комментария: Для таких людей, как я, изо всех сил пытающихся найти таблицу: docs.aws.amazon.com/general/latest/gr/elasticbeanstalk.html. Также не определено environment.environmentEndpointUrl. Если мы используем environment.attrEndpointUrl, конечной точкой будет точка elb (а не точка beanstalk). Поэтому вы должны использовать hostedZoneId для elb в соответствующем регионе: docs.amazonaws .cn / en_us / general / latest / gr / elb.html - person Hugo Mallet; 19.06.2020

Для тех, кто ищет решение в случае одноэкземплярной среды:

  1. Установите cnamePrefix в среде EBS на желаемое значение (например, «my-app»). В результате получается URL-адрес, который вы можете использовать позже как часть dnsName для создания A-записи;
  2. Создайте AliasRecordTarget:
const record: IAliasRecordTarget = {
                bind: (): AliasRecordTargetConfig => ({
                  dnsName: `${cnamePrefix}.${this.region}.elasticbeanstalk.com`,
                  hostedZoneId: 'Z2NYPWQ7DFZAZH' // Lookup ID or create a mapper: https://www.rubydoc.info/gems/roadworker/Aws/Route53 
                })
              };
  1. Создайте A-record:
// Route53 alias record for the EBS app
new ARecord(this, 'ebs-alias-record', {
              recordName: `my-app.mydomain.com.`,
              target: RecordTarget.fromAlias(record),
              zone: hostedZone
            })

** Редактировать **

Чтобы получить значение переменной hostedZone, вы можете найти свою зону, используя:

HostedZone.fromLookup(this, 'zone-lookup', {domainName: 'my-app.mydomain.com'});

person GuyT    schedule 20.12.2019

В дополнение к решению и комментарию, опубликованному @jogold, с использованием HostedZoneProvider для получения вашей собственной размещенной зоны и использования идентификатора зоны размещенной зоны Elastic Beanstalk в качестве цели

const zone = new HostedZoneProvider(this, {
            domainName: props.domainName
}).findAndImport(this, 'a-hosted-zone');

const ebsRegionHostedZoneId = 'Z117KPS5GTRQ2G' // us-east-1

const record = new AliasRecord(this, 'ARecord', {
  recordName: 'a-record',
  target: {
    asAliasRecordTarget: (): AliasRecordTargetProps => ({
      dnsName: environment.environmentEndpointUrl,
      // the id of the hosted zone in your region
      hostedZoneId: ebsRegionHostedZoneId
    })
  },
  // your hosted zone
  zone: zone
});
person Arjan    schedule 16.05.2019
comment
Не уверен, что это даст вам постоянный идентификатор зоны хостинга, используемый Elastic Beanstalk Service (docs.aws.amazon.com/general/latest/gr/), это запрос идентификатора размещенной зоны в вашей учетной записи. - person jogold; 16.05.2019
comment
@jogold, действительно, это имеет смысл, есть два URL-адреса в двух размещенных зонах: запись псевдонима связывает URL-адрес в размещенной зоне клиента с URL-адресом в размещенной зоне эластичного beanstalk - person Arjan; 17.05.2019