From cfda0cba4597e94f16bbf13c93b17de6705c99c2 Mon Sep 17 00:00:00 2001 From: Kazuho CryerShinozuka Date: Thu, 18 Jan 2024 21:04:46 +0900 Subject: [PATCH 1/6] feat: add multiValueAnswer --- .../aws-cdk-lib/aws-route53/lib/record-set.ts | 29 ++++++++- .../aws-route53/test/record-set.test.ts | 65 ++++++++++++++++++- 2 files changed, 89 insertions(+), 5 deletions(-) diff --git a/packages/aws-cdk-lib/aws-route53/lib/record-set.ts b/packages/aws-cdk-lib/aws-route53/lib/record-set.ts index 8564aedae843a..f99cca9f9187e 100644 --- a/packages/aws-cdk-lib/aws-route53/lib/record-set.ts +++ b/packages/aws-cdk-lib/aws-route53/lib/record-set.ts @@ -215,6 +215,13 @@ export interface RecordSetOptions { */ readonly region?: string; + /** + * Whether to return multiple values, such as IP addresses for your web servers, in response to DNS queries. + * + * @default false + */ + readonly multiValueAnswer?: boolean; + /** * A string used to distinguish between different records with the same combination of DNS name and type. * It can only be set when either weight or geoLocation is defined. @@ -284,6 +291,7 @@ export class RecordSet extends Resource implements IRecordSet { private readonly geoLocation?: GeoLocation; private readonly weight?: number; private readonly region?: string; + private readonly multiValueAnswer?: boolean; constructor(scope: Construct, id: string, props: RecordSetProps) { super(scope, id); @@ -294,18 +302,27 @@ export class RecordSet extends Resource implements IRecordSet { if (props.setIdentifier && (props.setIdentifier.length < 1 || props.setIdentifier.length > 128)) { throw new Error(`setIdentifier must be between 1 and 128 characters long, got: ${props.setIdentifier.length}`); } - if (props.setIdentifier && !props.weight && !props.geoLocation && !props.region) { + if (props.setIdentifier && !props.weight && !props.geoLocation && !props.region && !props.multiValueAnswer) { throw new Error('setIdentifier can only be specified for non-simple routing policies'); } + if (props.multiValueAnswer && props.target.aliasTarget) { + throw new Error('multiValueAnswer cannot be specified for alias record'); + } - let nonSimpleRoutingPolicies = [props.geoLocation, props.region, props.weight].filter((variable) => variable !== undefined).length; + const nonSimpleRoutingPolicies = [ + props.geoLocation, + props.region, + props.weight, + props.multiValueAnswer, + ].filter((variable) => variable !== undefined).length; if (nonSimpleRoutingPolicies > 1) { - throw new Error('Only one of region, weight, or geoLocation can be defined'); + throw new Error('Only one of region, weight, multiValueAnswer or geoLocation can be defined'); } this.geoLocation = props.geoLocation; this.weight = props.weight; this.region = props.region; + this.multiValueAnswer = props.multiValueAnswer; const ttl = props.target.aliasTarget ? undefined : ((props.ttl && props.ttl.toSeconds()) ?? 1800).toString(); @@ -324,6 +341,7 @@ export class RecordSet extends Resource implements IRecordSet { countryCode: props.geoLocation.countryCode, subdivisionCode: props.geoLocation.subdivisionCode, } : undefined, + multiValueAnswer: props.multiValueAnswer, setIdentifier: props.setIdentifier ?? this.configureSetIdentifier(), weight: props.weight, region: props.region, @@ -397,6 +415,11 @@ export class RecordSet extends Resource implements IRecordSet { return this.createIdentifier(idPrefix); } + if (this.multiValueAnswer) { + const idPrefix = 'MVA_ID_'; + return this.createIdentifier(idPrefix); + } + return undefined; } diff --git a/packages/aws-cdk-lib/aws-route53/test/record-set.test.ts b/packages/aws-cdk-lib/aws-route53/test/record-set.test.ts index 7f6c990af4955..9c128fe02186c 100644 --- a/packages/aws-cdk-lib/aws-route53/test/record-set.test.ts +++ b/packages/aws-cdk-lib/aws-route53/test/record-set.test.ts @@ -3,6 +3,11 @@ import { Template } from '../../assertions'; import * as iam from '../../aws-iam'; import { Duration, RemovalPolicy, Stack } from '../../core'; import * as route53 from '../lib'; +import * as targets from '../../aws-route53-targets'; +import * as cloudfront from '../../aws-cloudfront'; +import * as origins from '../../aws-cloudfront-origins'; +import { Resource } from '../../../@aws-cdk/cloudformation-diff/lib/diff/types'; +import { Type } from '../../assertions/lib/private/type'; describe('record set', () => { test('with default ttl', () => { @@ -1170,7 +1175,10 @@ describe('record set', () => { { weight: 20, geoLocation: route53.GeoLocation.continent(route53.Continent.EUROPE) }, { weight: 20, region: 'us-east-1' }, { geoLocation: route53.GeoLocation.continent(route53.Continent.EUROPE), region: 'us-east-1' }, - { weight: 20, geoLocation: route53.GeoLocation.continent(route53.Continent.EUROPE), region: 'us-east-1' }, + { multiValueAnswer: true, geoLocation: route53.GeoLocation.continent(route53.Continent.EUROPE) }, + { multiValueAnswer: true, region: 'us-east-1' }, + { multiValueAnswer: true, weight: 20 }, + { weight: 20, geoLocation: route53.GeoLocation.continent(route53.Continent.EUROPE), region: 'us-east-1', multiValueAnswer: true }, ])('throw error for the simultaneous definition of weight, geoLocation and region', (props) => { // GIVEN const stack = new Stack(); @@ -1185,7 +1193,7 @@ describe('record set', () => { target: route53.RecordTarget.fromValues('zzz'), setIdentifier: 'uniqueId', ...props, - })).toThrow('Only one of region, weight, or geoLocation can be defined'); + })).toThrow('Only one of region, weight, multiValueAnswer or geoLocation can be defined'); }); test('throw error for the definition of setIdentifier without weight, geoLocation or region', () => { @@ -1203,4 +1211,57 @@ describe('record set', () => { setIdentifier: 'uniqueId', })).toThrow('setIdentifier can only be specified for non-simple routing policies'); }); + + test('with multiValueAnswer', () => { + // GIVEN + const stack = new Stack(); + + const zone = new route53.HostedZone(stack, 'HostedZone', { zoneName: 'myzone' }); + + // WHEN + new route53.RecordSet(stack, 'RecordSet', { + zone, + recordName: 'www', + recordType: route53.RecordType.CNAME, + target: route53.RecordTarget.fromValues('zzz'), + multiValueAnswer: true, + }); + + // THEN + Template.fromStack(stack).hasResourceProperties('AWS::Route53::RecordSet', { + HostedZoneId: { + Ref: 'HostedZoneDB99F866', + }, + MultiValueAnswer: true, + Name: 'www.myzone.', + ResourceRecords: [ + 'zzz', + ], + SetIdentifier: 'MVA_ID_RecordSet', + TTL: '1800', + Type: 'CNAME', + }); + }); + + test('throw error for the definition of multiValueAnswer for alias record', () => { + // GIVEN + const stack = new Stack(); + + const distribution = new cloudfront.Distribution(stack, 'Distribution', { + defaultBehavior: { + origin: new origins.HttpOrigin('www.example.com'), + }, + }); + const zone = new route53.HostedZone(stack, 'HostedZone', { zoneName: 'myzone' }); + + // THEN + expect(() => new route53.RecordSet(stack, 'Basic', { + zone, + recordName: 'www', + recordType: route53.RecordType.A, + target: route53.RecordTarget.fromAlias(new targets.CloudFrontTarget(distribution)), + multiValueAnswer: true, + })).toThrow('multiValueAnswer cannot be specified for alias record'); + }); }); + From 428b1e199c1fcdd323385e9ae5a94c5a23c9859d Mon Sep 17 00:00:00 2001 From: Kazuho CryerShinozuka Date: Fri, 19 Jan 2024 02:55:11 +0900 Subject: [PATCH 2/6] test: integ test --- ...efaultTestDeployAssert2794160C.assets.json | 19 +++ ...aultTestDeployAssert2794160C.template.json | 36 ++++ .../cdk.out | 1 + .../integ.json | 12 ++ .../manifest.json | 119 +++++++++++++ .../multi-value-answer-routing.assets.json | 19 +++ .../multi-value-answer-routing.template.json | 59 +++++++ .../tree.json | 158 ++++++++++++++++++ .../test/integ.multi-value-answer-routing.ts | 29 ++++ 9 files changed, 452 insertions(+) create mode 100644 packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/Route53MultiValueAnswerRoutingIntegDefaultTestDeployAssert2794160C.assets.json create mode 100644 packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/Route53MultiValueAnswerRoutingIntegDefaultTestDeployAssert2794160C.template.json create mode 100644 packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/cdk.out create mode 100644 packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/integ.json create mode 100644 packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/manifest.json create mode 100644 packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/multi-value-answer-routing.assets.json create mode 100644 packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/multi-value-answer-routing.template.json create mode 100644 packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/tree.json create mode 100644 packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.ts diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/Route53MultiValueAnswerRoutingIntegDefaultTestDeployAssert2794160C.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/Route53MultiValueAnswerRoutingIntegDefaultTestDeployAssert2794160C.assets.json new file mode 100644 index 0000000000000..0a1fe28614685 --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/Route53MultiValueAnswerRoutingIntegDefaultTestDeployAssert2794160C.assets.json @@ -0,0 +1,19 @@ +{ + "version": "36.0.0", + "files": { + "21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": { + "source": { + "path": "Route53MultiValueAnswerRoutingIntegDefaultTestDeployAssert2794160C.template.json", + "packaging": "file" + }, + "destinations": { + "current_account-current_region": { + "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", + "objectKey": "21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22.json", + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" + } + } + } + }, + "dockerImages": {} +} \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/Route53MultiValueAnswerRoutingIntegDefaultTestDeployAssert2794160C.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/Route53MultiValueAnswerRoutingIntegDefaultTestDeployAssert2794160C.template.json new file mode 100644 index 0000000000000..ad9d0fb73d1dd --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/Route53MultiValueAnswerRoutingIntegDefaultTestDeployAssert2794160C.template.json @@ -0,0 +1,36 @@ +{ + "Parameters": { + "BootstrapVersion": { + "Type": "AWS::SSM::Parameter::Value", + "Default": "/cdk-bootstrap/hnb659fds/version", + "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]" + } + }, + "Rules": { + "CheckBootstrapVersion": { + "Assertions": [ + { + "Assert": { + "Fn::Not": [ + { + "Fn::Contains": [ + [ + "1", + "2", + "3", + "4", + "5" + ], + { + "Ref": "BootstrapVersion" + } + ] + } + ] + }, + "AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI." + } + ] + } + } +} \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/cdk.out new file mode 100644 index 0000000000000..1f0068d32659a --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/cdk.out @@ -0,0 +1 @@ +{"version":"36.0.0"} \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/integ.json new file mode 100644 index 0000000000000..88f912c56ea02 --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/integ.json @@ -0,0 +1,12 @@ +{ + "version": "36.0.0", + "testCases": { + "Route53MultiValueAnswerRoutingInteg/DefaultTest": { + "stacks": [ + "multi-value-answer-routing" + ], + "assertionStack": "Route53MultiValueAnswerRoutingInteg/DefaultTest/DeployAssert", + "assertionStackName": "Route53MultiValueAnswerRoutingIntegDefaultTestDeployAssert2794160C" + } + } +} \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/manifest.json new file mode 100644 index 0000000000000..8a5b27273df3e --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/manifest.json @@ -0,0 +1,119 @@ +{ + "version": "36.0.0", + "artifacts": { + "multi-value-answer-routing.assets": { + "type": "cdk:asset-manifest", + "properties": { + "file": "multi-value-answer-routing.assets.json", + "requiresBootstrapStackVersion": 6, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version" + } + }, + "multi-value-answer-routing": { + "type": "aws:cloudformation:stack", + "environment": "aws://unknown-account/unknown-region", + "properties": { + "templateFile": "multi-value-answer-routing.template.json", + "terminationProtection": false, + "validateOnSynth": false, + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", + "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/9bf2d61e49270dac65486b2f37167f99bf1fdb9cc75c9b02886fa5fec98cdbe2.json", + "requiresBootstrapStackVersion": 6, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", + "additionalDependencies": [ + "multi-value-answer-routing.assets" + ], + "lookupRole": { + "arn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-lookup-role-${AWS::AccountId}-${AWS::Region}", + "requiresBootstrapStackVersion": 8, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version" + } + }, + "dependencies": [ + "multi-value-answer-routing.assets" + ], + "metadata": { + "/multi-value-answer-routing/HostedZone/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "HostedZoneDB99F866" + } + ], + "/multi-value-answer-routing/MultiValueAnswerRouting/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "MultiValueAnswerRoutingF3C1E535" + } + ], + "/multi-value-answer-routing/BootstrapVersion": [ + { + "type": "aws:cdk:logicalId", + "data": "BootstrapVersion" + } + ], + "/multi-value-answer-routing/CheckBootstrapVersion": [ + { + "type": "aws:cdk:logicalId", + "data": "CheckBootstrapVersion" + } + ] + }, + "displayName": "multi-value-answer-routing" + }, + "Route53MultiValueAnswerRoutingIntegDefaultTestDeployAssert2794160C.assets": { + "type": "cdk:asset-manifest", + "properties": { + "file": "Route53MultiValueAnswerRoutingIntegDefaultTestDeployAssert2794160C.assets.json", + "requiresBootstrapStackVersion": 6, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version" + } + }, + "Route53MultiValueAnswerRoutingIntegDefaultTestDeployAssert2794160C": { + "type": "aws:cloudformation:stack", + "environment": "aws://unknown-account/unknown-region", + "properties": { + "templateFile": "Route53MultiValueAnswerRoutingIntegDefaultTestDeployAssert2794160C.template.json", + "terminationProtection": false, + "validateOnSynth": false, + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", + "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22.json", + "requiresBootstrapStackVersion": 6, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", + "additionalDependencies": [ + "Route53MultiValueAnswerRoutingIntegDefaultTestDeployAssert2794160C.assets" + ], + "lookupRole": { + "arn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-lookup-role-${AWS::AccountId}-${AWS::Region}", + "requiresBootstrapStackVersion": 8, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version" + } + }, + "dependencies": [ + "Route53MultiValueAnswerRoutingIntegDefaultTestDeployAssert2794160C.assets" + ], + "metadata": { + "/Route53MultiValueAnswerRoutingInteg/DefaultTest/DeployAssert/BootstrapVersion": [ + { + "type": "aws:cdk:logicalId", + "data": "BootstrapVersion" + } + ], + "/Route53MultiValueAnswerRoutingInteg/DefaultTest/DeployAssert/CheckBootstrapVersion": [ + { + "type": "aws:cdk:logicalId", + "data": "CheckBootstrapVersion" + } + ] + }, + "displayName": "Route53MultiValueAnswerRoutingInteg/DefaultTest/DeployAssert" + }, + "Tree": { + "type": "cdk:tree", + "properties": { + "file": "tree.json" + } + } + } +} \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/multi-value-answer-routing.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/multi-value-answer-routing.assets.json new file mode 100644 index 0000000000000..4e4760097908c --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/multi-value-answer-routing.assets.json @@ -0,0 +1,19 @@ +{ + "version": "36.0.0", + "files": { + "9bf2d61e49270dac65486b2f37167f99bf1fdb9cc75c9b02886fa5fec98cdbe2": { + "source": { + "path": "multi-value-answer-routing.template.json", + "packaging": "file" + }, + "destinations": { + "current_account-current_region": { + "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", + "objectKey": "9bf2d61e49270dac65486b2f37167f99bf1fdb9cc75c9b02886fa5fec98cdbe2.json", + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" + } + } + } + }, + "dockerImages": {} +} \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/multi-value-answer-routing.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/multi-value-answer-routing.template.json new file mode 100644 index 0000000000000..d52d2d870527f --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/multi-value-answer-routing.template.json @@ -0,0 +1,59 @@ +{ + "Resources": { + "HostedZoneDB99F866": { + "Type": "AWS::Route53::HostedZone", + "Properties": { + "Name": "cdk.dev." + } + }, + "MultiValueAnswerRoutingF3C1E535": { + "Type": "AWS::Route53::RecordSet", + "Properties": { + "HostedZoneId": { + "Ref": "HostedZoneDB99F866" + }, + "Name": "www.cdk.dev.", + "ResourceRecords": [ + "1.2.3.4", + "2.3.4.5" + ], + "TTL": "1800", + "Type": "A" + } + } + }, + "Parameters": { + "BootstrapVersion": { + "Type": "AWS::SSM::Parameter::Value", + "Default": "/cdk-bootstrap/hnb659fds/version", + "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]" + } + }, + "Rules": { + "CheckBootstrapVersion": { + "Assertions": [ + { + "Assert": { + "Fn::Not": [ + { + "Fn::Contains": [ + [ + "1", + "2", + "3", + "4", + "5" + ], + { + "Ref": "BootstrapVersion" + } + ] + } + ] + }, + "AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI." + } + ] + } + } +} \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/tree.json new file mode 100644 index 0000000000000..8762fe0f02f6b --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/tree.json @@ -0,0 +1,158 @@ +{ + "version": "tree-0.1", + "tree": { + "id": "App", + "path": "", + "children": { + "multi-value-answer-routing": { + "id": "multi-value-answer-routing", + "path": "multi-value-answer-routing", + "children": { + "HostedZone": { + "id": "HostedZone", + "path": "multi-value-answer-routing/HostedZone", + "children": { + "Resource": { + "id": "Resource", + "path": "multi-value-answer-routing/HostedZone/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::Route53::HostedZone", + "aws:cdk:cloudformation:props": { + "name": "cdk.dev." + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_route53.CfnHostedZone", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_route53.PublicHostedZone", + "version": "0.0.0" + } + }, + "MultiValueAnswerRouting": { + "id": "MultiValueAnswerRouting", + "path": "multi-value-answer-routing/MultiValueAnswerRouting", + "children": { + "Resource": { + "id": "Resource", + "path": "multi-value-answer-routing/MultiValueAnswerRouting/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::Route53::RecordSet", + "aws:cdk:cloudformation:props": { + "hostedZoneId": { + "Ref": "HostedZoneDB99F866" + }, + "name": "www.cdk.dev.", + "resourceRecords": [ + "1.2.3.4", + "2.3.4.5" + ], + "ttl": "1800", + "type": "A" + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_route53.CfnRecordSet", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_route53.ARecord", + "version": "0.0.0" + } + }, + "BootstrapVersion": { + "id": "BootstrapVersion", + "path": "multi-value-answer-routing/BootstrapVersion", + "constructInfo": { + "fqn": "aws-cdk-lib.CfnParameter", + "version": "0.0.0" + } + }, + "CheckBootstrapVersion": { + "id": "CheckBootstrapVersion", + "path": "multi-value-answer-routing/CheckBootstrapVersion", + "constructInfo": { + "fqn": "aws-cdk-lib.CfnRule", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.Stack", + "version": "0.0.0" + } + }, + "Route53MultiValueAnswerRoutingInteg": { + "id": "Route53MultiValueAnswerRoutingInteg", + "path": "Route53MultiValueAnswerRoutingInteg", + "children": { + "DefaultTest": { + "id": "DefaultTest", + "path": "Route53MultiValueAnswerRoutingInteg/DefaultTest", + "children": { + "Default": { + "id": "Default", + "path": "Route53MultiValueAnswerRoutingInteg/DefaultTest/Default", + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.3.0" + } + }, + "DeployAssert": { + "id": "DeployAssert", + "path": "Route53MultiValueAnswerRoutingInteg/DefaultTest/DeployAssert", + "children": { + "BootstrapVersion": { + "id": "BootstrapVersion", + "path": "Route53MultiValueAnswerRoutingInteg/DefaultTest/DeployAssert/BootstrapVersion", + "constructInfo": { + "fqn": "aws-cdk-lib.CfnParameter", + "version": "0.0.0" + } + }, + "CheckBootstrapVersion": { + "id": "CheckBootstrapVersion", + "path": "Route53MultiValueAnswerRoutingInteg/DefaultTest/DeployAssert/CheckBootstrapVersion", + "constructInfo": { + "fqn": "aws-cdk-lib.CfnRule", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.Stack", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "@aws-cdk/integ-tests-alpha.IntegTestCase", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "@aws-cdk/integ-tests-alpha.IntegTest", + "version": "0.0.0" + } + }, + "Tree": { + "id": "Tree", + "path": "Tree", + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.3.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.App", + "version": "0.0.0" + } + } +} \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.ts b/packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.ts new file mode 100644 index 0000000000000..1f4e5609443e4 --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.ts @@ -0,0 +1,29 @@ +import { App, Stack, StackProps } from 'aws-cdk-lib'; +import { Construct } from 'constructs'; +import * as route53 from 'aws-cdk-lib/aws-route53'; +import { IntegTest } from '@aws-cdk/integ-tests-alpha'; + +class TestStack extends Stack { + constructor(scope: Construct, id: string, props?: StackProps) { + super(scope, id, props); + + const hostedZone = new route53.PublicHostedZone(this, 'HostedZone', { + zoneName: 'cdk.dev', + }); + + new route53.ARecord(this, 'MultiValueAnswerRouting', { + zone: hostedZone, + recordName: 'www', + target: route53.RecordTarget.fromIpAddresses('1.2.3.4'), + multiValueAnswer: true, + }); + } +} + +const app = new App(); +const stack = new TestStack(app, 'multi-value-answer-routing'); + +new IntegTest(app, 'Route53MultiValueAnswerRoutingInteg', { + testCases: [stack], +}); +app.synth(); From 7d52097c75143aefbfc80637ca419eca7feef707 Mon Sep 17 00:00:00 2001 From: Kazuho CryerShinozuka Date: Wed, 31 Jan 2024 23:07:25 +0900 Subject: [PATCH 3/6] fix: import order --- packages/aws-cdk-lib/aws-route53/test/record-set.test.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/aws-cdk-lib/aws-route53/test/record-set.test.ts b/packages/aws-cdk-lib/aws-route53/test/record-set.test.ts index 9c128fe02186c..4f04cdea52eaf 100644 --- a/packages/aws-cdk-lib/aws-route53/test/record-set.test.ts +++ b/packages/aws-cdk-lib/aws-route53/test/record-set.test.ts @@ -1,13 +1,11 @@ import { testDeprecated } from '@aws-cdk/cdk-build-tools'; import { Template } from '../../assertions'; +import * as cloudfront from '../../aws-cloudfront'; +import * as origins from '../../aws-cloudfront-origins'; import * as iam from '../../aws-iam'; +import * as targets from '../../aws-route53-targets'; import { Duration, RemovalPolicy, Stack } from '../../core'; import * as route53 from '../lib'; -import * as targets from '../../aws-route53-targets'; -import * as cloudfront from '../../aws-cloudfront'; -import * as origins from '../../aws-cloudfront-origins'; -import { Resource } from '../../../@aws-cdk/cloudformation-diff/lib/diff/types'; -import { Type } from '../../assertions/lib/private/type'; describe('record set', () => { test('with default ttl', () => { From 23322be5b2d659e498a10c4769cd97a4d2610241 Mon Sep 17 00:00:00 2001 From: Kazuho CryerShinozuka Date: Wed, 31 Jan 2024 23:10:22 +0900 Subject: [PATCH 4/6] docs: update readme --- packages/aws-cdk-lib/aws-route53/README.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/packages/aws-cdk-lib/aws-route53/README.md b/packages/aws-cdk-lib/aws-route53/README.md index 34727074040a4..0645cd9cb1ca5 100644 --- a/packages/aws-cdk-lib/aws-route53/README.md +++ b/packages/aws-cdk-lib/aws-route53/README.md @@ -175,6 +175,20 @@ new route53.ARecord(this, 'ARecordLatency1', { }); ``` +To enable [multivalue answer routing](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-policy-multivalue.html), use the `multivalueAnswer` parameter: + +```ts +declare const myZone: route53.HostedZone; + +new route53.ARecord(this, 'ARecordMultiValue1', { + zone: myZone, + target: route53.RecordTarget.fromIpAddresses('1.2.3.4'), + multivalueAnswer: true, +}); +``` + +```ts + To specify a unique identifier to differentiate among multiple resource record sets that have the same combination of name and type, use the `setIdentifier` parameter: ```ts From f867d2dec4c416a3963ef5d238e9dd21b3a3044a Mon Sep 17 00:00:00 2001 From: Kazuho CryerShinozuka Date: Wed, 31 Jan 2024 23:48:07 +0900 Subject: [PATCH 5/6] test: update integ test --- .../manifest.json | 2 +- .../multi-value-answer-routing.assets.json | 4 ++-- .../multi-value-answer-routing.template.json | 5 +++-- .../integ.multi-value-answer-routing.js.snapshot/tree.json | 5 +++-- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/manifest.json index 8a5b27273df3e..d8af099f641fb 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/manifest.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/manifest.json @@ -18,7 +18,7 @@ "validateOnSynth": false, "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", - "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/9bf2d61e49270dac65486b2f37167f99bf1fdb9cc75c9b02886fa5fec98cdbe2.json", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/5c60ad8e64c38973dd1cc5e54223ae028790f47a024db222e0fda2f60d8bf8d5.json", "requiresBootstrapStackVersion": 6, "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", "additionalDependencies": [ diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/multi-value-answer-routing.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/multi-value-answer-routing.assets.json index 4e4760097908c..9f5d3dec0377e 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/multi-value-answer-routing.assets.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/multi-value-answer-routing.assets.json @@ -1,7 +1,7 @@ { "version": "36.0.0", "files": { - "9bf2d61e49270dac65486b2f37167f99bf1fdb9cc75c9b02886fa5fec98cdbe2": { + "5c60ad8e64c38973dd1cc5e54223ae028790f47a024db222e0fda2f60d8bf8d5": { "source": { "path": "multi-value-answer-routing.template.json", "packaging": "file" @@ -9,7 +9,7 @@ "destinations": { "current_account-current_region": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", - "objectKey": "9bf2d61e49270dac65486b2f37167f99bf1fdb9cc75c9b02886fa5fec98cdbe2.json", + "objectKey": "5c60ad8e64c38973dd1cc5e54223ae028790f47a024db222e0fda2f60d8bf8d5.json", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" } } diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/multi-value-answer-routing.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/multi-value-answer-routing.template.json index d52d2d870527f..7a17bbb776e44 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/multi-value-answer-routing.template.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/multi-value-answer-routing.template.json @@ -12,11 +12,12 @@ "HostedZoneId": { "Ref": "HostedZoneDB99F866" }, + "MultiValueAnswer": true, "Name": "www.cdk.dev.", "ResourceRecords": [ - "1.2.3.4", - "2.3.4.5" + "1.2.3.4" ], + "SetIdentifier": "MVA_ID_multivalueanswerroutingMultiValueAnswerRoutingD94947BD", "TTL": "1800", "Type": "A" } diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/tree.json index 8762fe0f02f6b..f2129b90b1b2e 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/tree.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-route53/test/integ.multi-value-answer-routing.js.snapshot/tree.json @@ -45,11 +45,12 @@ "hostedZoneId": { "Ref": "HostedZoneDB99F866" }, + "multiValueAnswer": true, "name": "www.cdk.dev.", "resourceRecords": [ - "1.2.3.4", - "2.3.4.5" + "1.2.3.4" ], + "setIdentifier": "MVA_ID_multivalueanswerroutingMultiValueAnswerRoutingD94947BD", "ttl": "1800", "type": "A" } From c81e744184b8692667671137aceb48938a59e140 Mon Sep 17 00:00:00 2001 From: Kazuho CryerShinozuka Date: Thu, 1 Feb 2024 12:08:07 +0900 Subject: [PATCH 6/6] fix: readme --- packages/aws-cdk-lib/aws-route53/README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/aws-cdk-lib/aws-route53/README.md b/packages/aws-cdk-lib/aws-route53/README.md index 0645cd9cb1ca5..2f7737d65a3b5 100644 --- a/packages/aws-cdk-lib/aws-route53/README.md +++ b/packages/aws-cdk-lib/aws-route53/README.md @@ -183,12 +183,10 @@ declare const myZone: route53.HostedZone; new route53.ARecord(this, 'ARecordMultiValue1', { zone: myZone, target: route53.RecordTarget.fromIpAddresses('1.2.3.4'), - multivalueAnswer: true, + multiValueAnswer: true, }); ``` -```ts - To specify a unique identifier to differentiate among multiple resource record sets that have the same combination of name and type, use the `setIdentifier` parameter: ```ts