From 4e65de6074dd87b3be62bb7cc695e2a785e2f39e Mon Sep 17 00:00:00 2001 From: Nick Lynch Date: Mon, 24 Aug 2020 11:32:51 +0100 Subject: [PATCH] feat(s3): imported buckets can have an explicit region However, while this set the region on the object itself, it didn't adjust the various region-aware properties of imported buckets (e.g., regional domain names). This change makes the regional properties of the imported bucket use the correct region. fixes #9556 --- packages/@aws-cdk/aws-s3/README.md | 11 +++++++++++ packages/@aws-cdk/aws-s3/lib/bucket.ts | 2 +- packages/@aws-cdk/aws-s3/test/test.bucket.ts | 16 ++++++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/packages/@aws-cdk/aws-s3/README.md b/packages/@aws-cdk/aws-s3/README.md index 01165967f3dbc..335cdfd871f8a 100644 --- a/packages/@aws-cdk/aws-s3/README.md +++ b/packages/@aws-cdk/aws-s3/README.md @@ -135,6 +135,17 @@ const byName = Bucket.fromBucketName(this, 'BucketByName', 'my-bucket'); const byArn = Bucket.fromBucketArn(this, 'BucketByArn', 'arn:aws:s3:::my-bucket'); ``` +The bucket's region defaults to the current stack's region, but can also be explicitly set in cases where one of the bucket's +regional properties needs to contain the correct values. + +```ts +const myCrossRegionBucket = Bucket.fromBucketAttributes(this, 'CrossRegionImport', { + bucketArn: 'arn:aws:s3:::my-bucket', + region: 'us-east-1', +}); +// myCrossRegionBucket.bucketRegionalDomainName === 'my-bucket.s3.us-east-1.amazonaws.com' +``` + ### Bucket Notifications The Amazon S3 notification feature enables you to receive notifications when diff --git a/packages/@aws-cdk/aws-s3/lib/bucket.ts b/packages/@aws-cdk/aws-s3/lib/bucket.ts index d767011ecb5d3..d44f989ba267b 100644 --- a/packages/@aws-cdk/aws-s3/lib/bucket.ts +++ b/packages/@aws-cdk/aws-s3/lib/bucket.ts @@ -1125,7 +1125,7 @@ export class Bucket extends BucketBase { */ public static fromBucketAttributes(scope: Construct, id: string, attrs: BucketAttributes): IBucket { const stack = Stack.of(scope); - const region = stack.region; + const region = attrs.region ?? stack.region; const urlSuffix = stack.urlSuffix; const bucketName = parseBucketName(scope, attrs); diff --git a/packages/@aws-cdk/aws-s3/test/test.bucket.ts b/packages/@aws-cdk/aws-s3/test/test.bucket.ts index 4e2a8bb60e2aa..2c9e13c798e96 100644 --- a/packages/@aws-cdk/aws-s3/test/test.bucket.ts +++ b/packages/@aws-cdk/aws-s3/test/test.bucket.ts @@ -697,6 +697,22 @@ export = { test.done(); }, + + 'import can explicitly set bucket region'(test: Test) { + const stack = new cdk.Stack(undefined, undefined, { + env: { region: 'us-east-1' }, + }); + + const bucket = s3.Bucket.fromBucketAttributes(stack, 'ImportedBucket', { + bucketName: 'myBucket', + region: 'eu-west-1', + }); + + test.equals(bucket.bucketRegionalDomainName, `myBucket.s3.eu-west-1.${stack.urlSuffix}`); + test.equals(bucket.bucketWebsiteDomainName, `myBucket.s3-website-eu-west-1.${stack.urlSuffix}`); + + test.done(); + }, }, 'grantRead'(test: Test) {