From bdc7b84c7297585eed4ea370a4b3afbf6c35ba37 Mon Sep 17 00:00:00 2001 From: Luke Thompson Date: Thu, 4 Mar 2021 10:28:29 +0000 Subject: [PATCH 01/12] Add a Route53 Alias target for Global Accelerator --- .../lib/global-accelerator-target.ts | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 packages/@aws-cdk/aws-route53-targets/lib/global-accelerator-target.ts diff --git a/packages/@aws-cdk/aws-route53-targets/lib/global-accelerator-target.ts b/packages/@aws-cdk/aws-route53-targets/lib/global-accelerator-target.ts new file mode 100644 index 0000000000000..40d782696e5be --- /dev/null +++ b/packages/@aws-cdk/aws-route53-targets/lib/global-accelerator-target.ts @@ -0,0 +1,33 @@ +import { IAccelerator } from '@aws-cdk/aws-globalaccelerator'; +import { IRecordSet, IAliasRecordTarget, AliasRecordTargetConfig } from '@aws-cdk/aws-route53'; + +export class GlobalAcceleratorTarget implements IAliasRecordTarget { + /** + * The hosted zone Id if using an alias record in Route53. + * This value never changes. + * Ref: https://docs.aws.amazon.com/general/latest/gr/global_accelerator.html + */ + public static readonly GLOBAL_ACCELERATOR_ZONE_ID = 'Z2BJ6XQ5FK7U4H'; + + /** + * Create an Alias Target for a Global Accelerator. + * + * If passing a string value, it must be a valid DNS name for an existing Global Accelerator. e.g. xyz.awsglobalaccelerator.com + * If passing an instance of an accelerator created within CDK, the accelerator.dnsName property will be used as the target. + */ + constructor(private readonly accelerator: string | IAccelerator) { + } + + bind(record: IRecordSet): AliasRecordTargetConfig { + let acceleratorDomainName; + if (typeof this.accelerator === 'string') { + acceleratorDomainName = this.accelerator; + } else { + acceleratorDomainName = this.accelerator.dnsName; + } + return { + hostedZoneId: GlobalAcceleratorTarget.GLOBAL_ACCELERATOR_ZONE_ID, + dnsName: acceleratorDomainName, + }; + } +} From 733ebaffcb616003ccf163620334d093a7ddd00d Mon Sep 17 00:00:00 2001 From: Luke Thompson Date: Thu, 4 Mar 2021 11:13:52 +0000 Subject: [PATCH 02/12] Export the new alias --- packages/@aws-cdk/aws-route53-targets/lib/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/@aws-cdk/aws-route53-targets/lib/index.ts b/packages/@aws-cdk/aws-route53-targets/lib/index.ts index af574aa599519..5c8b86fb959c1 100644 --- a/packages/@aws-cdk/aws-route53-targets/lib/index.ts +++ b/packages/@aws-cdk/aws-route53-targets/lib/index.ts @@ -6,3 +6,4 @@ export * from './cloudfront-target'; export * from './load-balancer-target'; export * from './interface-vpc-endpoint-target'; export * from './userpool-domain'; +export * from './global-accelerator-target'; From cf24be0836e37b93679139af73c9e65181b9f56b Mon Sep 17 00:00:00 2001 From: Luke Thompson Date: Thu, 4 Mar 2021 11:14:39 +0000 Subject: [PATCH 03/12] Import the globalaccelerator package --- packages/@aws-cdk/aws-route53-targets/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/@aws-cdk/aws-route53-targets/package.json b/packages/@aws-cdk/aws-route53-targets/package.json index 08ea2cb9e91f4..d0a108be1852d 100644 --- a/packages/@aws-cdk/aws-route53-targets/package.json +++ b/packages/@aws-cdk/aws-route53-targets/package.json @@ -80,6 +80,7 @@ "@aws-cdk/aws-elasticloadbalancing": "0.0.0", "@aws-cdk/aws-elasticloadbalancingv2": "0.0.0", "@aws-cdk/aws-iam": "0.0.0", + "@aws-cdk/aws-globalaccelerator": "0.0.0", "@aws-cdk/aws-route53": "0.0.0", "@aws-cdk/aws-s3": "0.0.0", "@aws-cdk/core": "0.0.0", From 0e341df6a7fdb025fe1cb0384e58361b7d94f726 Mon Sep 17 00:00:00 2001 From: Luke Thompson Date: Thu, 4 Mar 2021 11:30:52 +0000 Subject: [PATCH 04/12] Fix tsc warnings --- .../aws-route53-targets/lib/global-accelerator-target.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/@aws-cdk/aws-route53-targets/lib/global-accelerator-target.ts b/packages/@aws-cdk/aws-route53-targets/lib/global-accelerator-target.ts index 40d782696e5be..18d97e20ef591 100644 --- a/packages/@aws-cdk/aws-route53-targets/lib/global-accelerator-target.ts +++ b/packages/@aws-cdk/aws-route53-targets/lib/global-accelerator-target.ts @@ -1,5 +1,5 @@ import { IAccelerator } from '@aws-cdk/aws-globalaccelerator'; -import { IRecordSet, IAliasRecordTarget, AliasRecordTargetConfig } from '@aws-cdk/aws-route53'; +import { IAliasRecordTarget, AliasRecordTargetConfig } from '@aws-cdk/aws-route53'; export class GlobalAcceleratorTarget implements IAliasRecordTarget { /** @@ -18,7 +18,7 @@ export class GlobalAcceleratorTarget implements IAliasRecordTarget { constructor(private readonly accelerator: string | IAccelerator) { } - bind(record: IRecordSet): AliasRecordTargetConfig { + bind(): AliasRecordTargetConfig { let acceleratorDomainName; if (typeof this.accelerator === 'string') { acceleratorDomainName = this.accelerator; From fcfc6905f17554e6671ba7b1fe8f6b46d44e7b3a Mon Sep 17 00:00:00 2001 From: Luke Thompson Date: Thu, 4 Mar 2021 11:31:42 +0000 Subject: [PATCH 05/12] Add peer dependency --- packages/@aws-cdk/aws-route53-targets/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/@aws-cdk/aws-route53-targets/package.json b/packages/@aws-cdk/aws-route53-targets/package.json index d0a108be1852d..d98999baaab6a 100644 --- a/packages/@aws-cdk/aws-route53-targets/package.json +++ b/packages/@aws-cdk/aws-route53-targets/package.json @@ -97,6 +97,7 @@ "@aws-cdk/aws-elasticloadbalancing": "0.0.0", "@aws-cdk/aws-elasticloadbalancingv2": "0.0.0", "@aws-cdk/aws-iam": "0.0.0", + "@aws-cdk/aws-globalaccelerator": "0.0.0", "@aws-cdk/aws-route53": "0.0.0", "@aws-cdk/aws-s3": "0.0.0", "@aws-cdk/core": "0.0.0", From 0c9db0d2c5a5e7318fe3847d961516a1e4c63fea Mon Sep 17 00:00:00 2001 From: Luke Thompson Date: Fri, 5 Mar 2021 08:46:04 +1100 Subject: [PATCH 06/12] Use the standard approach for imports rather than the more explicit individual classes for consistency with the rest of the codebase. Add documentation to the class. --- .../lib/global-accelerator-target.ts | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/packages/@aws-cdk/aws-route53-targets/lib/global-accelerator-target.ts b/packages/@aws-cdk/aws-route53-targets/lib/global-accelerator-target.ts index 18d97e20ef591..3437e0394a2a5 100644 --- a/packages/@aws-cdk/aws-route53-targets/lib/global-accelerator-target.ts +++ b/packages/@aws-cdk/aws-route53-targets/lib/global-accelerator-target.ts @@ -1,7 +1,10 @@ -import { IAccelerator } from '@aws-cdk/aws-globalaccelerator'; -import { IAliasRecordTarget, AliasRecordTargetConfig } from '@aws-cdk/aws-route53'; +import * as globalaccelerator from '@aws-cdk/aws-globalaccelerator'; +import * as route53 from '@aws-cdk/aws-route53'; -export class GlobalAcceleratorTarget implements IAliasRecordTarget { +/** + * Use a Global Accelerator domain name as an alias record target. + */ +export class GlobalAcceleratorTarget implements route53.IAliasRecordTarget { /** * The hosted zone Id if using an alias record in Route53. * This value never changes. @@ -12,13 +15,13 @@ export class GlobalAcceleratorTarget implements IAliasRecordTarget { /** * Create an Alias Target for a Global Accelerator. * - * If passing a string value, it must be a valid DNS name for an existing Global Accelerator. e.g. xyz.awsglobalaccelerator.com + * If passing a string value, it must be a valid domain name for an existing Global Accelerator. e.g. xyz.awsglobalaccelerator.com * If passing an instance of an accelerator created within CDK, the accelerator.dnsName property will be used as the target. */ - constructor(private readonly accelerator: string | IAccelerator) { + constructor(private readonly accelerator: string | globalaccelerator.IAccelerator) { } - bind(): AliasRecordTargetConfig { + bind(_record: route53.IRecordSet): route53.AliasRecordTargetConfig { let acceleratorDomainName; if (typeof this.accelerator === 'string') { acceleratorDomainName = this.accelerator; From d1e2110b4536646c602f3f3afd84b658e5dc38d0 Mon Sep 17 00:00:00 2001 From: Luke Thompson Date: Fri, 5 Mar 2021 10:20:00 +1100 Subject: [PATCH 07/12] Add tests --- .../test/global-accelerator-target.test.ts | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 packages/@aws-cdk/aws-route53-targets/test/global-accelerator-target.test.ts diff --git a/packages/@aws-cdk/aws-route53-targets/test/global-accelerator-target.test.ts b/packages/@aws-cdk/aws-route53-targets/test/global-accelerator-target.test.ts new file mode 100644 index 0000000000000..267760356eefe --- /dev/null +++ b/packages/@aws-cdk/aws-route53-targets/test/global-accelerator-target.test.ts @@ -0,0 +1,58 @@ +import '@aws-cdk/assert/jest'; +import * as globalaccelerator from '@aws-cdk/aws-globalaccelerator'; +import * as route53 from '@aws-cdk/aws-route53'; +import { Stack } from '@aws-cdk/core'; +import * as targets from '../lib'; + +test('GlobalAcceleratorTarget exposes a public constant of the zone id', () => { + expect(targets.GlobalAcceleratorTarget.GLOBAL_ACCELERATOR_ZONE_ID).toStrictEqual('Z2BJ6XQ5FK7U4H'); +}); + +test('GlobalAcceleratorTarget creates an alias resource with a string domain name', () => { + // GIVEN + const stack = new Stack(); + const zone = new route53.PublicHostedZone(stack, 'HostedZone', { zoneName: 'test.public' }); + + // WHEN + new route53.ARecord(stack, 'GlobalAcceleratorAlias', { + target: route53.RecordTarget.fromAlias(new targets.GlobalAcceleratorTarget('xyz.awsglobalaccelerator.com')), + recordName: 'test', + zone, + }); + + // THEN + expect(stack).toHaveResource('AWS::Route53::RecordSet', { + AliasTarget: { + DNSName: 'xyz.awsglobalaccelerator.com', + HostedZoneId: 'Z2BJ6XQ5FK7U4H', + }, + }); +}); + +test('GlobalAcceleratorTarget creates an alias resource with a Global Accelerator reference domain name', () => { + // GIVEN + const stack = new Stack(); + const accelerator = new globalaccelerator.Accelerator(stack, 'Accelerator'); + const logicalId = stack.getLogicalId(accelerator.node.defaultChild); + const zone = new route53.PublicHostedZone(stack, 'HostedZone', { zoneName: 'test.public' }); + + // WHEN + new route53.ARecord(stack, 'GlobalAcceleratorAlias', { + target: route53.RecordTarget.fromAlias(new targets.GlobalAcceleratorTarget(accelerator)), + recordName: 'test', + zone, + }); + + // THEN + expect(stack).toHaveResource('AWS::Route53::RecordSet', { + AliasTarget: { + DNSName: { + 'Fn::GetAtt': [ + logicalId, + 'DnsName' + ] + }, + HostedZoneId: 'Z2BJ6XQ5FK7U4H', + }, + }); +}); \ No newline at end of file From ad6f811d8a90200a39c22c88893391d941a1051a Mon Sep 17 00:00:00 2001 From: Luke Thompson Date: Fri, 5 Mar 2021 11:00:41 +1100 Subject: [PATCH 08/12] Add a README entry for the new Alias Target --- packages/@aws-cdk/aws-route53-targets/README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/packages/@aws-cdk/aws-route53-targets/README.md b/packages/@aws-cdk/aws-route53-targets/README.md index 5270482564ee8..b95f526414583 100644 --- a/packages/@aws-cdk/aws-route53-targets/README.md +++ b/packages/@aws-cdk/aws-route53-targets/README.md @@ -63,6 +63,19 @@ This library contains Route53 Alias Record targets for: For example, if the Amazon-provided DNS for the load balancer is `ALB-xxxxxxx.us-west-2.elb.amazonaws.com`, CDK will create alias target in Route 53 will be `dualstack.ALB-xxxxxxx.us-west-2.elb.amazonaws.com`. +* GlobalAccelerator + + ```ts + new route53.ARecord(stack, 'GlobalAcceleratorAlias', { + zone, + target: route53.RecordTarget.fromAlias(new targets.GlobalAcceleratorTarget(accelerator)), + // or - route53.RecordTarget.fromAlias(new targets.GlobalAcceleratorTarget('xyz.awsglobalaccelerator.com')), + }); + ``` + +**Important:** If you pass the global accelerator target a string rather than an instance of IAccelerator, ensure that the string is a valid domain name of an existing Global Accelerator instance. +See [the documentation on DNS addressing](https://docs.aws.amazon.com/global-accelerator/latest/dg/dns-addressing-custom-domains.dns-addressing.html) with Global Accelerator for more info. + * InterfaceVpcEndpoints **Important:** Based on the CFN docs for VPCEndpoints - [see here](attrDnsEntries) - the attributes returned for DnsEntries in CloudFormation is a combination of the hosted zone ID and the DNS name. The entries are ordered as follows: regional public DNS, zonal public DNS, private DNS, and wildcard DNS. This order is not enforced for AWS Marketplace services, and therefore this CDK construct is ONLY guaranteed to work with non-marketplace services. From 3975013220e98278e4ac242ffb0b9c3aebdf16a7 Mon Sep 17 00:00:00 2001 From: Luke Thompson Date: Fri, 5 Mar 2021 12:01:43 +1100 Subject: [PATCH 09/12] Add an integration test. Ran on personal AWS account and proved working. --- ...obalaccelerator-alias-target.expected.json | 52 +++++++++++++++++++ .../integ.globalaccelerator-alias-target.ts | 31 +++++++++++ 2 files changed, 83 insertions(+) create mode 100644 packages/@aws-cdk/aws-route53-targets/test/integ.globalaccelerator-alias-target.expected.json create mode 100644 packages/@aws-cdk/aws-route53-targets/test/integ.globalaccelerator-alias-target.ts diff --git a/packages/@aws-cdk/aws-route53-targets/test/integ.globalaccelerator-alias-target.expected.json b/packages/@aws-cdk/aws-route53-targets/test/integ.globalaccelerator-alias-target.expected.json new file mode 100644 index 0000000000000..e11d21275bbab --- /dev/null +++ b/packages/@aws-cdk/aws-route53-targets/test/integ.globalaccelerator-alias-target.expected.json @@ -0,0 +1,52 @@ +{ + "Resources": { + "Accelerator8EB0B6B1": { + "Type": "AWS::GlobalAccelerator::Accelerator", + "Properties": { + "Name": "aws-cdk-globalaccelerator-integ", + "Enabled": true + } + }, + "HostedZoneDB99F866": { + "Type": "AWS::Route53::HostedZone", + "Properties": { + "Name": "test.public." + } + }, + "LocalGlobalAcceleratorAlias18B4A87A": { + "Type": "AWS::Route53::RecordSet", + "Properties": { + "Name": "test-local.test.public.", + "Type": "A", + "AliasTarget": { + "DNSName": { + "Fn::GetAtt": [ + "Accelerator8EB0B6B1", + "DnsName" + ] + }, + "HostedZoneId": "Z2BJ6XQ5FK7U4H" + }, + "Comment": "Alias to the locally created Global Accelerator", + "HostedZoneId": { + "Ref": "HostedZoneDB99F866" + } + } + }, + "ExistingGlobalAcceleratorAlias7ACF888C": { + "Type": "AWS::Route53::RecordSet", + "Properties": { + "Name": "test-existing.test.public.", + "Type": "A", + "AliasTarget": { + "DNSName": "someexisting.awsglobalaccelerator.com", + "HostedZoneId": "Z2BJ6XQ5FK7U4H" + }, + "Comment": "Alias to the an existing Global Accelerator", + "HostedZoneId": { + "Ref": "HostedZoneDB99F866" + } + } + } + } + } \ No newline at end of file diff --git a/packages/@aws-cdk/aws-route53-targets/test/integ.globalaccelerator-alias-target.ts b/packages/@aws-cdk/aws-route53-targets/test/integ.globalaccelerator-alias-target.ts new file mode 100644 index 0000000000000..13faf44acb6c4 --- /dev/null +++ b/packages/@aws-cdk/aws-route53-targets/test/integ.globalaccelerator-alias-target.ts @@ -0,0 +1,31 @@ +#!/usr/bin/env node +import * as globalaccelerator from '@aws-cdk/aws-globalaccelerator'; +import * as route53 from '@aws-cdk/aws-route53'; +import * as cdk from '@aws-cdk/core'; +import * as targets from '../lib'; + +const app = new cdk.App(); +const stack = new cdk.Stack(app, 'aws-cdk-globalaccelerator-integ'); + +let accelerator = new globalaccelerator.Accelerator(stack, 'Accelerator', { + acceleratorName: `${stack.stackName}`, + enabled: true +}); + +const zone = new route53.PublicHostedZone(stack, 'HostedZone', { zoneName: 'test.public' }); + +new route53.ARecord(stack, 'LocalGlobalAcceleratorAlias', { + comment: 'Alias to the locally created Global Accelerator', + target: route53.RecordTarget.fromAlias(new targets.GlobalAcceleratorTarget(accelerator)), + recordName: 'test-local', + zone +}); + +new route53.ARecord(stack, 'ExistingGlobalAcceleratorAlias', { + comment: 'Alias to the an existing Global Accelerator', + target: route53.RecordTarget.fromAlias(new targets.GlobalAcceleratorTarget('someexisting.awsglobalaccelerator.com')), + recordName: 'test-existing', + zone +}); + +app.synth(); From 82aeb729678e8b10f3bc3d73e4e2397a0f258960 Mon Sep 17 00:00:00 2001 From: Luke Thompson Date: Fri, 5 Mar 2021 12:29:53 +1100 Subject: [PATCH 10/12] Make the alias record id consistent with the others in the README --- packages/@aws-cdk/aws-route53-targets/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/@aws-cdk/aws-route53-targets/README.md b/packages/@aws-cdk/aws-route53-targets/README.md index b95f526414583..8f7c5ae107fa2 100644 --- a/packages/@aws-cdk/aws-route53-targets/README.md +++ b/packages/@aws-cdk/aws-route53-targets/README.md @@ -66,7 +66,7 @@ For example, if the Amazon-provided DNS for the load balancer is `ALB-xxxxxxx.us * GlobalAccelerator ```ts - new route53.ARecord(stack, 'GlobalAcceleratorAlias', { + new route53.ARecord(stack, 'AliasRecord', { zone, target: route53.RecordTarget.fromAlias(new targets.GlobalAcceleratorTarget(accelerator)), // or - route53.RecordTarget.fromAlias(new targets.GlobalAcceleratorTarget('xyz.awsglobalaccelerator.com')), From df4b240000592e32eafe26eb8297a1a8814fcb94 Mon Sep 17 00:00:00 2001 From: Luke Thompson Date: Fri, 5 Mar 2021 12:37:15 +1100 Subject: [PATCH 11/12] Fix linting issues --- .../test/global-accelerator-target.test.ts | 4 ++-- .../integ.globalaccelerator-alias-target.ts | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/@aws-cdk/aws-route53-targets/test/global-accelerator-target.test.ts b/packages/@aws-cdk/aws-route53-targets/test/global-accelerator-target.test.ts index 267760356eefe..aad3a00c935f4 100644 --- a/packages/@aws-cdk/aws-route53-targets/test/global-accelerator-target.test.ts +++ b/packages/@aws-cdk/aws-route53-targets/test/global-accelerator-target.test.ts @@ -49,8 +49,8 @@ test('GlobalAcceleratorTarget creates an alias resource with a Global Accelerato DNSName: { 'Fn::GetAtt': [ logicalId, - 'DnsName' - ] + 'DnsName', + ], }, HostedZoneId: 'Z2BJ6XQ5FK7U4H', }, diff --git a/packages/@aws-cdk/aws-route53-targets/test/integ.globalaccelerator-alias-target.ts b/packages/@aws-cdk/aws-route53-targets/test/integ.globalaccelerator-alias-target.ts index 13faf44acb6c4..331ac7784eb13 100644 --- a/packages/@aws-cdk/aws-route53-targets/test/integ.globalaccelerator-alias-target.ts +++ b/packages/@aws-cdk/aws-route53-targets/test/integ.globalaccelerator-alias-target.ts @@ -9,23 +9,23 @@ const stack = new cdk.Stack(app, 'aws-cdk-globalaccelerator-integ'); let accelerator = new globalaccelerator.Accelerator(stack, 'Accelerator', { acceleratorName: `${stack.stackName}`, - enabled: true + enabled: true, }); const zone = new route53.PublicHostedZone(stack, 'HostedZone', { zoneName: 'test.public' }); new route53.ARecord(stack, 'LocalGlobalAcceleratorAlias', { - comment: 'Alias to the locally created Global Accelerator', - target: route53.RecordTarget.fromAlias(new targets.GlobalAcceleratorTarget(accelerator)), - recordName: 'test-local', - zone + comment: 'Alias to the locally created Global Accelerator', + target: route53.RecordTarget.fromAlias(new targets.GlobalAcceleratorTarget(accelerator)), + recordName: 'test-local', + zone, }); new route53.ARecord(stack, 'ExistingGlobalAcceleratorAlias', { - comment: 'Alias to the an existing Global Accelerator', - target: route53.RecordTarget.fromAlias(new targets.GlobalAcceleratorTarget('someexisting.awsglobalaccelerator.com')), - recordName: 'test-existing', - zone + comment: 'Alias to the an existing Global Accelerator', + target: route53.RecordTarget.fromAlias(new targets.GlobalAcceleratorTarget('someexisting.awsglobalaccelerator.com')), + recordName: 'test-existing', + zone, }); app.synth(); From 01e486994017951adf23a09fd56b079c48d91917 Mon Sep 17 00:00:00 2001 From: Luke Thompson Date: Sat, 6 Mar 2021 00:44:06 +1100 Subject: [PATCH 12/12] Switch from using a type union on the constructor to having two separate classes for the GlobalAcceleratorTarget --- .../@aws-cdk/aws-route53-targets/README.md | 4 +-- .../lib/global-accelerator-target.ts | 31 +++++++++++-------- .../test/global-accelerator-target.test.ts | 3 +- .../integ.globalaccelerator-alias-target.ts | 2 +- 4 files changed, 23 insertions(+), 17 deletions(-) diff --git a/packages/@aws-cdk/aws-route53-targets/README.md b/packages/@aws-cdk/aws-route53-targets/README.md index 8f7c5ae107fa2..ba9f1ea7e4831 100644 --- a/packages/@aws-cdk/aws-route53-targets/README.md +++ b/packages/@aws-cdk/aws-route53-targets/README.md @@ -69,11 +69,11 @@ For example, if the Amazon-provided DNS for the load balancer is `ALB-xxxxxxx.us new route53.ARecord(stack, 'AliasRecord', { zone, target: route53.RecordTarget.fromAlias(new targets.GlobalAcceleratorTarget(accelerator)), - // or - route53.RecordTarget.fromAlias(new targets.GlobalAcceleratorTarget('xyz.awsglobalaccelerator.com')), + // or - route53.RecordTarget.fromAlias(new targets.GlobalAcceleratorDomainTarget('xyz.awsglobalaccelerator.com')), }); ``` -**Important:** If you pass the global accelerator target a string rather than an instance of IAccelerator, ensure that the string is a valid domain name of an existing Global Accelerator instance. +**Important:** If you use GlobalAcceleratorDomainTarget, passing a string rather than an instance of IAccelerator, ensure that the string is a valid domain name of an existing Global Accelerator instance. See [the documentation on DNS addressing](https://docs.aws.amazon.com/global-accelerator/latest/dg/dns-addressing-custom-domains.dns-addressing.html) with Global Accelerator for more info. * InterfaceVpcEndpoints diff --git a/packages/@aws-cdk/aws-route53-targets/lib/global-accelerator-target.ts b/packages/@aws-cdk/aws-route53-targets/lib/global-accelerator-target.ts index 3437e0394a2a5..d80aaaa140b1b 100644 --- a/packages/@aws-cdk/aws-route53-targets/lib/global-accelerator-target.ts +++ b/packages/@aws-cdk/aws-route53-targets/lib/global-accelerator-target.ts @@ -1,10 +1,11 @@ import * as globalaccelerator from '@aws-cdk/aws-globalaccelerator'; import * as route53 from '@aws-cdk/aws-route53'; + /** * Use a Global Accelerator domain name as an alias record target. */ -export class GlobalAcceleratorTarget implements route53.IAliasRecordTarget { +export class GlobalAcceleratorDomainTarget implements route53.IAliasRecordTarget { /** * The hosted zone Id if using an alias record in Route53. * This value never changes. @@ -13,24 +14,28 @@ export class GlobalAcceleratorTarget implements route53.IAliasRecordTarget { public static readonly GLOBAL_ACCELERATOR_ZONE_ID = 'Z2BJ6XQ5FK7U4H'; /** - * Create an Alias Target for a Global Accelerator. - * - * If passing a string value, it must be a valid domain name for an existing Global Accelerator. e.g. xyz.awsglobalaccelerator.com - * If passing an instance of an accelerator created within CDK, the accelerator.dnsName property will be used as the target. + * Create an Alias Target for a Global Accelerator domain name. */ - constructor(private readonly accelerator: string | globalaccelerator.IAccelerator) { + constructor(private readonly acceleratorDomainName: string) { } bind(_record: route53.IRecordSet): route53.AliasRecordTargetConfig { - let acceleratorDomainName; - if (typeof this.accelerator === 'string') { - acceleratorDomainName = this.accelerator; - } else { - acceleratorDomainName = this.accelerator.dnsName; - } return { hostedZoneId: GlobalAcceleratorTarget.GLOBAL_ACCELERATOR_ZONE_ID, - dnsName: acceleratorDomainName, + dnsName: this.acceleratorDomainName, }; } } + +/** + * Use a Global Accelerator instance domain name as an alias record target. + */ +export class GlobalAcceleratorTarget extends GlobalAcceleratorDomainTarget { + + /** + * Create an Alias Target for a Global Accelerator instance. + */ + constructor(accelerator: globalaccelerator.IAccelerator) { + super(accelerator.dnsName); + } +} diff --git a/packages/@aws-cdk/aws-route53-targets/test/global-accelerator-target.test.ts b/packages/@aws-cdk/aws-route53-targets/test/global-accelerator-target.test.ts index aad3a00c935f4..07db27b92940e 100644 --- a/packages/@aws-cdk/aws-route53-targets/test/global-accelerator-target.test.ts +++ b/packages/@aws-cdk/aws-route53-targets/test/global-accelerator-target.test.ts @@ -6,6 +6,7 @@ import * as targets from '../lib'; test('GlobalAcceleratorTarget exposes a public constant of the zone id', () => { expect(targets.GlobalAcceleratorTarget.GLOBAL_ACCELERATOR_ZONE_ID).toStrictEqual('Z2BJ6XQ5FK7U4H'); + expect(targets.GlobalAcceleratorDomainTarget.GLOBAL_ACCELERATOR_ZONE_ID).toStrictEqual('Z2BJ6XQ5FK7U4H'); }); test('GlobalAcceleratorTarget creates an alias resource with a string domain name', () => { @@ -15,7 +16,7 @@ test('GlobalAcceleratorTarget creates an alias resource with a string domain nam // WHEN new route53.ARecord(stack, 'GlobalAcceleratorAlias', { - target: route53.RecordTarget.fromAlias(new targets.GlobalAcceleratorTarget('xyz.awsglobalaccelerator.com')), + target: route53.RecordTarget.fromAlias(new targets.GlobalAcceleratorDomainTarget('xyz.awsglobalaccelerator.com')), recordName: 'test', zone, }); diff --git a/packages/@aws-cdk/aws-route53-targets/test/integ.globalaccelerator-alias-target.ts b/packages/@aws-cdk/aws-route53-targets/test/integ.globalaccelerator-alias-target.ts index 331ac7784eb13..560e828accaa5 100644 --- a/packages/@aws-cdk/aws-route53-targets/test/integ.globalaccelerator-alias-target.ts +++ b/packages/@aws-cdk/aws-route53-targets/test/integ.globalaccelerator-alias-target.ts @@ -23,7 +23,7 @@ new route53.ARecord(stack, 'LocalGlobalAcceleratorAlias', { new route53.ARecord(stack, 'ExistingGlobalAcceleratorAlias', { comment: 'Alias to the an existing Global Accelerator', - target: route53.RecordTarget.fromAlias(new targets.GlobalAcceleratorTarget('someexisting.awsglobalaccelerator.com')), + target: route53.RecordTarget.fromAlias(new targets.GlobalAcceleratorDomainTarget('someexisting.awsglobalaccelerator.com')), recordName: 'test-existing', zone, });