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) {