AWS CDK:如何使用Route53别名记录作为弹性Beanstalk环境的目标

时间:2019-05-16 08:30:16

标签: amazon-web-services amazon-elastic-beanstalk aws-cdk

要创建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
});

如何使用环境作为目标?在aws-cdk存储库中寻找实现IAliasRecordTarget的类,除了云前端分布和基本负载平衡器之外,不会产生很多候选对象。

3 个答案:

答案 0 :(得分:1)

target道具期望一个带有bind()函数的对象返回dnsNameevaluateTargetHealthhostedZoneId(请参阅AWS::Route53::RecordSet AliasTarget和{{ 3}})。

您可以执行以下操作:

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

有关使用托管区域ID的列表,请参见implementation of AliasRecord

更新2018-05-28 asAliasRecordTargetbind版本0.32.0中现已aws-cdk

答案 1 :(得分:0)

除了@jogold发布的解决方案和评论之外, 使用HostedZoneProvider返回您自己的托管区域,并 使用Elastic Beanstalk托管区域的区域ID作为目标

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
});

答案 2 :(得分:0)

对于那些在单实例环境中寻求解决方案的人:

  1. 在EBS环境中将cnamePrefix设置为您喜欢的值(例如“ my-app”)。这样会产生一个网址,您以后可以将其用作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'});