AWS CDK: как настроить API-интерфейс шлюза из Route53 - PullRequest
4 голосов
/ 13 июня 2019

У меня есть существующее доменное имя, зарегистрированное в AWS Route53, и я настроил собственное доменное имя в API Gateway.В консоли я могу настроить вещи так, чтобы xxxxxx.zenxxxxxxfoundry.com действительно достиг API-интерфейса шлюза и затем перешел к моим функциям Lambda.

Теперь я хочу добиться этого с помощью AWS CDK.

Я пробовал следующее:

    const zone = route53.HostedZone.fromHostedZoneId(this, 'ZenithWebFoundryZone', 'ZXXXXXX04V8134');
    new route53.AliasRecord(this, 'BlogAPIRecord', {
      zone: zone,
      recordName: 'xxxxxx.zenxxxxxxfoundry.com',
      target: {
        bind: (): route53.AliasRecordTargetProps => ({
          dnsName: 'd-xxxxxxy00g.execute-api.ap-southeast-2.amazonaws.com',
          hostedZoneId: 'ZXXXXXX04V8134'
        })
      }
    });

, который строит нормально npm run build, но когда я запускаю cdk synth, я получаю довольно тупую ошибку:

$ cdk synth
HostedZone.fromHostedZoneId doesn't support "zoneName"
Subprocess exited with error 1

Переключениена --trace особо не помогло: дополнительная информация:

Error: Subprocess exited with error 1
    at ChildProcess.proc.on.code (/Users/mikecoxon/.npm-packages/lib/node_modules/aws-cdk/lib/api/cxapp/exec.ts:108:23)
    at ChildProcess.emit (events.js:189:13)
    at ChildProcess.EventEmitter.emit (domain.js:441:20)
    at Process.ChildProcess._handle.onexit (internal/child_process.js:248:12)

Я просмотрел весь сценарий стека, и нигде нет ссылки на zoneName.Кто-нибудь знает, откуда эта ошибка?

Ответы [ 3 ]

1 голос
/ 14 июня 2019

С aws-cdk v0.34.0 должно быть в состоянии сделать следующее:

const zone = route53.HostedZone.fromHostedZoneAttributes(this, 'ZenithWebFoundryZone', {
  hostedZoneId: 'ZXXXXXX04V8134',
  zoneName: 'zenxxxxxxfoundry.com' // your zone name here
});
new route53.ARecord(this, 'BlogAPIRecord', {
  zone,
  recordName: 'xxxxxx.zenxxxxxxfoundry.com',
  target: route53.AddressRecordTarget.fromAlias({
    bind: (): route53.AliasRecordTargetConfig => ({
      dnsName: 'd-xxxxxxy00g.execute-api.ap-southeast-2.amazonaws.com', // Specify the applicable domain name for your API.
      hostedZoneId: 'XXXX', // Specify the hosted zone ID for your API.
    }),
  }),
});

Если ваш API находится в той же базе стека / кода, вы можете получить dnsName и hostedZoneId из него (это атрибут CF).

В противном случае обратитесь к DNSName и HostedZoneId в AWS :: Route53 :: RecordSet AliasTarget документации .

Примечание : hostedZoneId для вашей записи псевдонима не совпадает с идентификатором размещенной зоны вашей собственной зоны.

0 голосов
/ 03 июля 2019

В AWS CDK 0.36.1 вы можете использовать пакет @ aws-cdk / aws-route53-target для создания псевдонимов.

import { HostedZone, RecordSet, RecordType, RecordTarget } from '@aws-cdk/aws-route53'
import { ApiGatewayDomain } from '@aws-cdk/aws-route53-targets'
import { Certificate } from '@aws-cdk/aws-certificatemanager'

// ...

  const customDomain = new apigateway.DomainName(this, 'CustomDomain', {
    domainName: props.apiDomain,
    certificate: Certificate.fromCertificateArn(this, 'Certificate', props.certificateArn),
    endpointType: apigateway.EndpointType.EDGE,
  })

  const hostedZone = HostedZone.fromHostedZoneAttributes(this, 'HostedZone', {
    hostedZoneId: props.hostedZoneId,
    zoneName: props.hostedZoneName,
  })

  new RecordSet(this, 'ApiRecordSetA', {
    zone: hostedZone,
    recordType: RecordType.A,
    recordName: 'api',
    target: RecordTarget.fromAlias(new ApiGatewayDomain(customDomain))
  })

  new RecordSet(this, 'ApiRecordSetAAAA', {
    zone: hostedZone,
    recordType: RecordType.AAAA,
    recordName: 'api',
    target: RecordTarget.fromAlias(new ApiGatewayDomain(customDomain))
  })
0 голосов
/ 14 июня 2019

Я получил ту же ошибку со следующим:

const zone = route53.HostedZone.fromHostedZoneId(this, 'MyZone', 'ZXXXXXXXXXXXXX');

У меня в Route53 есть зона, подобная приведенной ниже:

Domain Name:    example.com.
Type:           Public Hosted Zone
Hosted Zone ID: ZXXXXXXXXXXXXX

Я изменил на следующее, и это сработало (CDK 0.34.0):

const zone = new route53.HostedZoneProvider(this,  {
  domainName: 'example.com',
}).findAndImport(this, 'MyZone');
...