4

要创建 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 的类不会产生除云端分发和基本负载均衡器之外的许多候选对象

4

4 回答 4

3

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

  1. 在您的 EBS 环境中将设置为cnamePrefix您喜欢的值(例如“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'});

于 2019-12-20T09:38:48.117 回答
2

targetprop 需要一个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
});

如果使用其他区域,请参阅AWS Elastic Beanstalk 终端节点和配额以获取托管区域 ID 的列表,或者在环境负载平衡时参阅Elastic Load Balancing 终端节点和配额。

更新 2018-05-28asAliasRecordTarget现在bindaws-cdk版本 0.32.0

于 2019-05-16T12:15:57.937 回答
1

除了@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
});
于 2019-05-16T14:46:44.220 回答
1

这是一种解决方法,可让您将请求转发到 EBS 环境 URL(而不是负载均衡器)。

import { ARecord, RecordTarget, HostedZone, AliasRecordTargetConfig } from '@aws-cdk/aws-route53';

// Environment URL for my EBS app.
const EBS_ENV_URL = 'mysampleenvironment.eba-8mmp67ym.us-east-1.elasticbeanstalk.com';

// Id of the hosted zone in the region your EBS environment is located.
const EBS_ENV_HOSTED_ZONE_ID = 'Z117KPS5GTRQ2G';

const aliasRecord = new ARecord(stack, 'AliasRecord', {
  recordName: DOMAIN,
  target: RecordTarget.fromAlias({
    bind: (): AliasRecordTargetConfig => ({
      dnsName: EBS_ENV_URL,
      hostedZoneId: EBS_ENV_HOSTED_ZONE_ID 
    })
  }),
  zone: HostedZone.fromLookup(stack, 'WebsiteHostedZone', {
    domainName: DOMAIN
  })
});

这种解决方法基本上是实现一个自定义IAliasRecordTarget.

  1. 将EBS 应用程序的环境 URL硬编码到dnsName道具中。
  2. 访问https://docs.aws.amazon.com/general/latest/gr/elasticbeanstalk.html并找到与 EBS 应用程序环境区域匹配的托管区域 ID。这个值需要在hostedZoneIdprop 中硬编码。
于 2021-08-31T20:48:58.990 回答