Skip to content

Commit aedc888

Browse files
authoredSep 7, 2022
fix(route53): vpc region in template overridden by stack region (#20530)
Fixes #20496 This PR implements the proposed change in #20496 - When a region is set in the vpc it is used in the CloudFormation template. Otherwise the region from the respective stack is used. ---- ### All Submissions: * [x] Have you followed the guidelines in our [Contributing guide?](https://github.com/aws/aws-cdk/blob/master/CONTRIBUTING.md) ### Adding new Unconventional Dependencies: * [ ] This PR adds new unconventional dependencies following the process described [here](https://github.com/aws/aws-cdk/blob/master/CONTRIBUTING.md/#adding-new-unconventional-dependencies) ### New Features * [x] Have you added the new feature to an [integration test](https://github.com/aws/aws-cdk/blob/master/INTEGRATION_TESTS.md)? * [x] Did you use `yarn integ` to deploy the infrastructure and generate the snapshot (i.e. `yarn integ` without `--dry-run`)? *By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license*
1 parent b0ba52e commit aedc888

17 files changed

+1064
-6
lines changed
 

‎packages/@aws-cdk/aws-ec2/lib/vpc.ts

+14-3
Original file line numberDiff line numberDiff line change
@@ -763,6 +763,13 @@ export interface VpcAttributes {
763763
* VPN gateway's identifier
764764
*/
765765
readonly vpnGatewayId?: string;
766+
767+
/**
768+
* The region the VPC is in
769+
*
770+
* @default - The region of the stack where the VPC belongs to
771+
*/
772+
readonly region?: string;
766773
}
767774

768775
export interface SubnetAttributes {
@@ -1203,7 +1210,7 @@ export class Vpc extends VpcBase {
12031210
dummyValue: undefined,
12041211
}).value;
12051212

1206-
return new LookedUpVpc(scope, id, attributes || DUMMY_VPC_PROPS, attributes === undefined);
1213+
return new LookedUpVpc(scope, id, attributes ?? DUMMY_VPC_PROPS, attributes === undefined);
12071214

12081215
/**
12091216
* Prefixes all keys in the argument with `tag:`.`
@@ -2008,7 +2015,9 @@ class ImportedVpc extends VpcBase {
20082015
private readonly cidr?: string | undefined;
20092016

20102017
constructor(scope: Construct, id: string, props: VpcAttributes, isIncomplete: boolean) {
2011-
super(scope, id);
2018+
super(scope, id, {
2019+
region: props.region,
2020+
});
20122021

20132022
this.vpcId = props.vpcId;
20142023
this.vpcArn = Arn.format({
@@ -2058,7 +2067,9 @@ class LookedUpVpc extends VpcBase {
20582067
private readonly cidr?: string | undefined;
20592068

20602069
constructor(scope: Construct, id: string, props: cxapi.VpcContextResponse, isIncomplete: boolean) {
2061-
super(scope, id);
2070+
super(scope, id, {
2071+
region: props.region,
2072+
});
20622073

20632074
this.vpcId = props.vpcId;
20642075
this.vpcArn = Arn.format({
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import * as cdk from '@aws-cdk/core';
2+
import { IntegTest } from '@aws-cdk/integ-tests';
3+
import * as ec2 from '../lib';
4+
5+
const appWithVpc = new cdk.App();
6+
const stack = new cdk.Stack(appWithVpc, 'StackWithVpc', {
7+
env: {
8+
region: 'eu-west-1',
9+
account: '123456',
10+
},
11+
});
12+
13+
const testVpc = new ec2.Vpc(stack, 'MyVpc', {
14+
vpcName: 'my-vpc-name',
15+
});
16+
17+
const appUnderTest = new cdk.App();
18+
const stackLookup = new cdk.Stack(appUnderTest, 'StackUnderTest', {
19+
env: {
20+
region: 'us-east-2',
21+
account: '123456',
22+
},
23+
});
24+
25+
const vpcFromVpcAttributes = ec2.Vpc.fromVpcAttributes(stackLookup, 'VpcFromVpcAttributes', {
26+
region: 'eu-west-1',
27+
availabilityZones: ['eu-west-1a'],
28+
vpcId: testVpc.vpcId,
29+
});
30+
31+
const vpcFromLookup = ec2.Vpc.fromLookup(stack, 'VpcFromLookup', {
32+
region: 'eu-west-1',
33+
vpcName: 'my-vpc-name',
34+
});
35+
36+
new cdk.CfnOutput(stackLookup, 'OutputFromVpcAttributes', {
37+
value: `Region fromVpcAttributes: ${vpcFromVpcAttributes.env.region}`,
38+
});
39+
40+
new cdk.CfnOutput(stackLookup, 'OutputFromLookup', {
41+
value: `Region fromLookup: ${vpcFromLookup.env.region}`,
42+
});
43+
44+
new IntegTest(appUnderTest, 'ArchiveTest', {
45+
testCases: [stackLookup],
46+
});
47+
appWithVpc.synth();
48+
appUnderTest.synth();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
{
2+
"version": "21.0.0",
3+
"files": {
4+
"21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": {
5+
"source": {
6+
"path": "ArchiveTestDefaultTestDeployAssert3405726A.template.json",
7+
"packaging": "file"
8+
},
9+
"destinations": {
10+
"current_account-current_region": {
11+
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
12+
"objectKey": "21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22.json",
13+
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
14+
}
15+
}
16+
}
17+
},
18+
"dockerImages": {}
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
{
2+
"Parameters": {
3+
"BootstrapVersion": {
4+
"Type": "AWS::SSM::Parameter::Value<String>",
5+
"Default": "/cdk-bootstrap/hnb659fds/version",
6+
"Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]"
7+
}
8+
},
9+
"Rules": {
10+
"CheckBootstrapVersion": {
11+
"Assertions": [
12+
{
13+
"Assert": {
14+
"Fn::Not": [
15+
{
16+
"Fn::Contains": [
17+
[
18+
"1",
19+
"2",
20+
"3",
21+
"4",
22+
"5"
23+
],
24+
{
25+
"Ref": "BootstrapVersion"
26+
}
27+
]
28+
}
29+
]
30+
},
31+
"AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI."
32+
}
33+
]
34+
}
35+
}
36+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{
2+
"version": "21.0.0",
3+
"files": {
4+
"cfac1423efb7c99cadc3f40367c753fe5b1527d9a6950c096ba326fabac4c89f": {
5+
"source": {
6+
"path": "StackUnderTest.template.json",
7+
"packaging": "file"
8+
},
9+
"destinations": {
10+
"123456-us-east-2": {
11+
"bucketName": "cdk-hnb659fds-assets-123456-us-east-2",
12+
"objectKey": "cfac1423efb7c99cadc3f40367c753fe5b1527d9a6950c096ba326fabac4c89f.json",
13+
"region": "us-east-2",
14+
"assumeRoleArn": "arn:${AWS::Partition}:iam::123456:role/cdk-hnb659fds-file-publishing-role-123456-us-east-2"
15+
}
16+
}
17+
}
18+
},
19+
"dockerImages": {}
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
{
2+
"Outputs": {
3+
"OutputFromVpcAttributes": {
4+
"Value": "Region fromVpcAttributes: eu-west-1"
5+
},
6+
"OutputFromLookup": {
7+
"Value": "Region fromLookup: eu-west-1"
8+
}
9+
},
10+
"Parameters": {
11+
"BootstrapVersion": {
12+
"Type": "AWS::SSM::Parameter::Value<String>",
13+
"Default": "/cdk-bootstrap/hnb659fds/version",
14+
"Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]"
15+
}
16+
},
17+
"Rules": {
18+
"CheckBootstrapVersion": {
19+
"Assertions": [
20+
{
21+
"Assert": {
22+
"Fn::Not": [
23+
{
24+
"Fn::Contains": [
25+
[
26+
"1",
27+
"2",
28+
"3",
29+
"4",
30+
"5"
31+
],
32+
{
33+
"Ref": "BootstrapVersion"
34+
}
35+
]
36+
}
37+
]
38+
},
39+
"AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI."
40+
}
41+
]
42+
}
43+
}
44+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{
2+
"version": "21.0.0",
3+
"files": {
4+
"628a32283150d3af24efb3a11967996306884a3835ac731ab35822da2ce7e9ff": {
5+
"source": {
6+
"path": "StackWithVpc.template.json",
7+
"packaging": "file"
8+
},
9+
"destinations": {
10+
"123456-eu-west-1": {
11+
"bucketName": "cdk-hnb659fds-assets-123456-eu-west-1",
12+
"objectKey": "628a32283150d3af24efb3a11967996306884a3835ac731ab35822da2ce7e9ff.json",
13+
"region": "eu-west-1",
14+
"assumeRoleArn": "arn:${AWS::Partition}:iam::123456:role/cdk-hnb659fds-file-publishing-role-123456-eu-west-1"
15+
}
16+
}
17+
}
18+
},
19+
"dockerImages": {}
20+
}

‎packages/@aws-cdk/aws-ec2/test/vpc-lookup.integ.snapshot/StackWithVpc.template.json

+564
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"version":"21.0.0"}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"version": "21.0.0",
3+
"testCases": {
4+
"ArchiveTest/DefaultTest": {
5+
"stacks": [
6+
"StackUnderTest"
7+
],
8+
"assertionStack": "ArchiveTest/DefaultTest/DeployAssert",
9+
"assertionStackName": "ArchiveTestDefaultTestDeployAssert3405726A"
10+
}
11+
}
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
{
2+
"version": "21.0.0",
3+
"artifacts": {
4+
"Tree": {
5+
"type": "cdk:tree",
6+
"properties": {
7+
"file": "tree.json"
8+
}
9+
},
10+
"StackUnderTest.assets": {
11+
"type": "cdk:asset-manifest",
12+
"properties": {
13+
"file": "StackUnderTest.assets.json",
14+
"requiresBootstrapStackVersion": 6,
15+
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version"
16+
}
17+
},
18+
"StackUnderTest": {
19+
"type": "aws:cloudformation:stack",
20+
"environment": "aws://123456/us-east-2",
21+
"properties": {
22+
"templateFile": "StackUnderTest.template.json",
23+
"validateOnSynth": false,
24+
"assumeRoleArn": "arn:${AWS::Partition}:iam::123456:role/cdk-hnb659fds-deploy-role-123456-us-east-2",
25+
"cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::123456:role/cdk-hnb659fds-cfn-exec-role-123456-us-east-2",
26+
"stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-123456-us-east-2/cfac1423efb7c99cadc3f40367c753fe5b1527d9a6950c096ba326fabac4c89f.json",
27+
"requiresBootstrapStackVersion": 6,
28+
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
29+
"additionalDependencies": [
30+
"StackUnderTest.assets"
31+
],
32+
"lookupRole": {
33+
"arn": "arn:${AWS::Partition}:iam::123456:role/cdk-hnb659fds-lookup-role-123456-us-east-2",
34+
"requiresBootstrapStackVersion": 8,
35+
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version"
36+
}
37+
},
38+
"dependencies": [
39+
"StackUnderTest.assets"
40+
],
41+
"metadata": {
42+
"/StackUnderTest/OutputFromVpcAttributes": [
43+
{
44+
"type": "aws:cdk:logicalId",
45+
"data": "OutputFromVpcAttributes"
46+
}
47+
],
48+
"/StackUnderTest/OutputFromLookup": [
49+
{
50+
"type": "aws:cdk:logicalId",
51+
"data": "OutputFromLookup"
52+
}
53+
],
54+
"/StackUnderTest/BootstrapVersion": [
55+
{
56+
"type": "aws:cdk:logicalId",
57+
"data": "BootstrapVersion"
58+
}
59+
],
60+
"/StackUnderTest/CheckBootstrapVersion": [
61+
{
62+
"type": "aws:cdk:logicalId",
63+
"data": "CheckBootstrapVersion"
64+
}
65+
]
66+
},
67+
"displayName": "StackUnderTest"
68+
},
69+
"ArchiveTestDefaultTestDeployAssert3405726A.assets": {
70+
"type": "cdk:asset-manifest",
71+
"properties": {
72+
"file": "ArchiveTestDefaultTestDeployAssert3405726A.assets.json",
73+
"requiresBootstrapStackVersion": 6,
74+
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version"
75+
}
76+
},
77+
"ArchiveTestDefaultTestDeployAssert3405726A": {
78+
"type": "aws:cloudformation:stack",
79+
"environment": "aws://unknown-account/unknown-region",
80+
"properties": {
81+
"templateFile": "ArchiveTestDefaultTestDeployAssert3405726A.template.json",
82+
"validateOnSynth": false,
83+
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}",
84+
"cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}",
85+
"stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22.json",
86+
"requiresBootstrapStackVersion": 6,
87+
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
88+
"additionalDependencies": [
89+
"ArchiveTestDefaultTestDeployAssert3405726A.assets"
90+
],
91+
"lookupRole": {
92+
"arn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-lookup-role-${AWS::AccountId}-${AWS::Region}",
93+
"requiresBootstrapStackVersion": 8,
94+
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version"
95+
}
96+
},
97+
"dependencies": [
98+
"ArchiveTestDefaultTestDeployAssert3405726A.assets"
99+
],
100+
"metadata": {
101+
"/ArchiveTest/DefaultTest/DeployAssert/BootstrapVersion": [
102+
{
103+
"type": "aws:cdk:logicalId",
104+
"data": "BootstrapVersion"
105+
}
106+
],
107+
"/ArchiveTest/DefaultTest/DeployAssert/CheckBootstrapVersion": [
108+
{
109+
"type": "aws:cdk:logicalId",
110+
"data": "CheckBootstrapVersion"
111+
}
112+
]
113+
},
114+
"displayName": "ArchiveTest/DefaultTest/DeployAssert"
115+
}
116+
}
117+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
{
2+
"version": "tree-0.1",
3+
"tree": {
4+
"id": "App",
5+
"path": "",
6+
"children": {
7+
"Tree": {
8+
"id": "Tree",
9+
"path": "Tree",
10+
"constructInfo": {
11+
"fqn": "constructs.Construct",
12+
"version": "10.1.92"
13+
}
14+
},
15+
"StackUnderTest": {
16+
"id": "StackUnderTest",
17+
"path": "StackUnderTest",
18+
"children": {
19+
"VpcFromVpcAttributes": {
20+
"id": "VpcFromVpcAttributes",
21+
"path": "StackUnderTest/VpcFromVpcAttributes",
22+
"constructInfo": {
23+
"fqn": "@aws-cdk/core.Resource",
24+
"version": "0.0.0"
25+
}
26+
},
27+
"OutputFromVpcAttributes": {
28+
"id": "OutputFromVpcAttributes",
29+
"path": "StackUnderTest/OutputFromVpcAttributes",
30+
"constructInfo": {
31+
"fqn": "@aws-cdk/core.CfnOutput",
32+
"version": "0.0.0"
33+
}
34+
},
35+
"OutputFromLookup": {
36+
"id": "OutputFromLookup",
37+
"path": "StackUnderTest/OutputFromLookup",
38+
"constructInfo": {
39+
"fqn": "@aws-cdk/core.CfnOutput",
40+
"version": "0.0.0"
41+
}
42+
}
43+
},
44+
"constructInfo": {
45+
"fqn": "@aws-cdk/core.Stack",
46+
"version": "0.0.0"
47+
}
48+
},
49+
"ArchiveTest": {
50+
"id": "ArchiveTest",
51+
"path": "ArchiveTest",
52+
"children": {
53+
"DefaultTest": {
54+
"id": "DefaultTest",
55+
"path": "ArchiveTest/DefaultTest",
56+
"children": {
57+
"Default": {
58+
"id": "Default",
59+
"path": "ArchiveTest/DefaultTest/Default",
60+
"constructInfo": {
61+
"fqn": "constructs.Construct",
62+
"version": "10.1.92"
63+
}
64+
},
65+
"DeployAssert": {
66+
"id": "DeployAssert",
67+
"path": "ArchiveTest/DefaultTest/DeployAssert",
68+
"constructInfo": {
69+
"fqn": "@aws-cdk/core.Stack",
70+
"version": "0.0.0"
71+
}
72+
}
73+
},
74+
"constructInfo": {
75+
"fqn": "@aws-cdk/integ-tests.IntegTestCase",
76+
"version": "0.0.0"
77+
}
78+
}
79+
},
80+
"constructInfo": {
81+
"fqn": "@aws-cdk/integ-tests.IntegTest",
82+
"version": "0.0.0"
83+
}
84+
}
85+
},
86+
"constructInfo": {
87+
"fqn": "@aws-cdk/core.App",
88+
"version": "0.0.0"
89+
}
90+
}
91+
}

‎packages/@aws-cdk/aws-ec2/test/vpc.from-lookup.test.ts

+20
Original file line numberDiff line numberDiff line change
@@ -268,12 +268,32 @@ describe('vpc from lookup', () => {
268268

269269
restoreContextProvider(previous);
270270
});
271+
272+
test('passes region to LookedUpVpc correctly', () => {
273+
const previous = mockVpcContextProviderWith({
274+
vpcId: 'vpc-1234',
275+
subnetGroups: [],
276+
region: 'region-1234',
277+
}, options => {
278+
expect(options.region).toEqual('region-1234');
279+
});
280+
281+
const stack = new Stack();
282+
const vpc = Vpc.fromLookup(stack, 'Vpc', {
283+
vpcId: 'vpc-1234',
284+
region: 'region-1234',
285+
});
286+
287+
expect(vpc.env.region).toEqual('region-1234');
288+
restoreContextProvider(previous);
289+
});
271290
});
272291
});
273292

274293
interface MockVcpContextResponse {
275294
readonly vpcId: string;
276295
readonly subnetGroups: cxapi.VpcSubnetGroup[];
296+
readonly region?: string;
277297
}
278298

279299
function mockVpcContextProviderWith(

‎packages/@aws-cdk/aws-ec2/test/vpc.test.ts

+17
Original file line numberDiff line numberDiff line change
@@ -1220,6 +1220,23 @@ describe('vpc', () => {
12201220

12211221

12221222
});
1223+
1224+
test('fromVpcAttributes passes region correctly', () => {
1225+
// GIVEN
1226+
const stack = getTestStack();
1227+
1228+
const vpcId = Fn.importValue('myVpcId');
1229+
1230+
// WHEN
1231+
const vpc = Vpc.fromVpcAttributes(stack, 'VPC', {
1232+
vpcId,
1233+
availabilityZones: ['region-12345a', 'region-12345b', 'region-12345c'],
1234+
region: 'region-12345',
1235+
});
1236+
1237+
// THEN
1238+
expect(vpc.env.region).toEqual('region-12345');
1239+
});
12231240
});
12241241

12251242
describe('NAT instances', () => {

‎packages/@aws-cdk/aws-route53/lib/hosted-zone.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ export class HostedZone extends Resource implements IHostedZone {
181181
* @param vpc the other VPC to add.
182182
*/
183183
public addVpc(vpc: ec2.IVpc) {
184-
this.vpcs.push({ vpcId: vpc.vpcId, vpcRegion: Stack.of(vpc).region });
184+
this.vpcs.push({ vpcId: vpc.vpcId, vpcRegion: vpc.env.region ?? Stack.of(vpc).region });
185185
}
186186
}
187187

‎packages/@aws-cdk/aws-route53/test/hosted-zone.test.ts

+33-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
import { Template } from '@aws-cdk/assertions';
1+
import { Match, Template } from '@aws-cdk/assertions';
2+
import * as ec2 from '@aws-cdk/aws-ec2';
23
import * as iam from '@aws-cdk/aws-iam';
34
import * as cdk from '@aws-cdk/core';
4-
import { HostedZone, PublicHostedZone } from '../lib';
5+
import { HostedZone, PrivateHostedZone, PublicHostedZone } from '../lib';
56

67
describe('hosted zone', () => {
78
describe('Hosted Zone', () => {
@@ -192,3 +193,33 @@ describe('hosted zone', () => {
192193
}).toThrow(/Cannot use undefined value for attribute `domainName`/);
193194
});
194195
});
196+
197+
describe('Vpc', () => {
198+
test('different region in vpc and hosted zone', () => {
199+
// GIVEN
200+
const stack = new cdk.Stack(undefined, 'TestStack', {
201+
env: { account: '123456789012', region: 'us-east-1' },
202+
});
203+
204+
// WHEN
205+
new PrivateHostedZone(stack, 'HostedZone', {
206+
vpc: ec2.Vpc.fromVpcAttributes(stack, 'Vpc', {
207+
vpcId: '1234',
208+
availabilityZones: ['region-12345a', 'region-12345b', 'region-12345c'],
209+
region: 'region-12345',
210+
}),
211+
zoneName: 'SomeZone',
212+
});
213+
214+
// THEN
215+
Template.fromStack(stack).hasResourceProperties('AWS::Route53::HostedZone', {
216+
VPCs: [
217+
{
218+
VPCId: '1234',
219+
VPCRegion: 'region-12345',
220+
},
221+
],
222+
Name: Match.anyValue(),
223+
});
224+
});
225+
});

‎packages/@aws-cdk/cx-api/lib/context/vpc.ts

+7
Original file line numberDiff line numberDiff line change
@@ -161,4 +161,11 @@ export interface VpcContextResponse {
161161
* @default - no subnet groups will be returned unless {@link VpcContextQuery.returnAsymmetricSubnets} is true
162162
*/
163163
readonly subnetGroups?: VpcSubnetGroup[];
164+
165+
/**
166+
* The region in which the VPC is in.
167+
*
168+
* @default - Region of the parent stack
169+
*/
170+
readonly region?: string;
164171
}

0 commit comments

Comments
 (0)
Please sign in to comment.