AWS CDK:如何使用 Route53 别名记录定位 Elastic Beanstalk 环境
AWS CDK: how to target an Elastic Beanstalk Environment with a Route53 Alias Record
要创建 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 并没有产生很多候选者,除了云端分布和基本负载均衡器
target
属性需要一个带有 bind()
函数并返回 dnsName
、evaluateTargetHealth
和 hostedZoneId
的对象(参见 AWS::Route53::RecordSet AliasTarget and the implementation of AliasRecord
)。
您可以执行以下操作:
const record = new AliasRecord(this, 'ARecord', {
recordName: 'a-record',
target: {
bind: (): AliasRecordTargetProps => ({
dnsName: environment.attrEndpointUrl,
hostedZoneId: 'Z14LCN19Q5QHIC' // for us-east-2
})
},
zone: zone
});
环境为load-balanced时见AWS Elastic Beanstalk endpoints and quotas for a list of hosted zone IDs if using another region or Elastic Load Balancing endpoints and quotas。
更新 2018-05-28:asAliasRecordTarget
现在是 bind
aws-cdk
版本 0.32.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
});
对于正在寻找单实例环境下解决方案的人:
- 将 EBS 环境中的
cnamePrefix
设置为您喜欢的值(例如 'my-app')。这会导致 url 您稍后可以用作 dnsName
的一部分来创建 A 记录;
- 创建
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
})
};
- 创建
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'});
这里有一个解决方法,允许您将请求转发到 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
。
- 将 EBS app’s environment URL 硬编码到
dnsName
属性中。
- 访问 https://docs.aws.amazon.com/general/latest/gr/elasticbeanstalk.html 并找到与 EBS 应用程序环境区域相匹配的托管区域 ID。该值需要在
hostedZoneId
属性中进行硬编码。
要创建 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 并没有产生很多候选者,除了云端分布和基本负载均衡器
target
属性需要一个带有 bind()
函数并返回 dnsName
、evaluateTargetHealth
和 hostedZoneId
的对象(参见 AWS::Route53::RecordSet AliasTarget and the implementation of AliasRecord
)。
您可以执行以下操作:
const record = new AliasRecord(this, 'ARecord', {
recordName: 'a-record',
target: {
bind: (): AliasRecordTargetProps => ({
dnsName: environment.attrEndpointUrl,
hostedZoneId: 'Z14LCN19Q5QHIC' // for us-east-2
})
},
zone: zone
});
环境为load-balanced时见AWS Elastic Beanstalk endpoints and quotas for a list of hosted zone IDs if using another region or Elastic Load Balancing endpoints and quotas。
更新 2018-05-28:asAliasRecordTarget
现在是 bind
aws-cdk
版本 0.32.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
});
对于正在寻找单实例环境下解决方案的人:
- 将 EBS 环境中的
cnamePrefix
设置为您喜欢的值(例如 'my-app')。这会导致 url 您稍后可以用作dnsName
的一部分来创建 A 记录; - 创建
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
})
};
- 创建
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'});
这里有一个解决方法,允许您将请求转发到 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
。
- 将 EBS app’s environment URL 硬编码到
dnsName
属性中。 - 访问 https://docs.aws.amazon.com/general/latest/gr/elasticbeanstalk.html 并找到与 EBS 应用程序环境区域相匹配的托管区域 ID。该值需要在
hostedZoneId
属性中进行硬编码。