diff --git a/.changeset/ninety-suns-accept.md b/.changeset/ninety-suns-accept.md new file mode 100644 index 0000000000..1ee7b98987 --- /dev/null +++ b/.changeset/ninety-suns-accept.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-common': patch +--- + +Fixed the AwsS3UrlReader host regex and host to allow the S3 reading for CN AWS domain diff --git a/packages/backend-common/src/reading/AwsS3UrlReader.test.ts b/packages/backend-common/src/reading/AwsS3UrlReader.test.ts index b37a052c1d..e3247f190b 100644 --- a/packages/backend-common/src/reading/AwsS3UrlReader.test.ts +++ b/packages/backend-common/src/reading/AwsS3UrlReader.test.ts @@ -53,6 +53,39 @@ describe('parseUrl', () => { bucket: 'my.bucket-3', region: 'us-east-1', }); + expect( + parseUrl('https://s3.amazonaws.com.cn/my.bucket-3/a/puppy.jpg', { + host: 'amazonaws.com', + }), + ).toEqual({ + path: 'a/puppy.jpg', + bucket: 'my.bucket-3', + region: 'us-east-1', + }); + expect( + parseUrl( + 'https://ec-backstage-staging.s3.cn-north-1.amazonaws.com.cn/payments-prod-oas30.json', + { + host: 'amazonaws.com', + }, + ), + ).toEqual({ + path: 'payments-prod-oas30.json', + bucket: 'ec-backstage-staging', + region: 'cn-north-1', + }); + expect( + parseUrl( + 'https://ec-backstage-staging.s3.cn-north-1.amazonaws.com.cn/payments-prod-oas30.json', + { + host: 'amazonaws.com.cn', + }, + ), + ).toEqual({ + path: 'payments-prod-oas30.json', + bucket: 'ec-backstage-staging', + region: 'cn-north-1', + }); expect( parseUrl('https://s3.us-west-2.amazonaws.com/my.bucket-3/a/puppy.jpg', { host: 'amazonaws.com', diff --git a/packages/backend-common/src/reading/AwsS3UrlReader.ts b/packages/backend-common/src/reading/AwsS3UrlReader.ts index 4d4c28071f..23ef0f7b27 100644 --- a/packages/backend-common/src/reading/AwsS3UrlReader.ts +++ b/packages/backend-common/src/reading/AwsS3UrlReader.ts @@ -69,9 +69,9 @@ export function parseUrl( const host = parsedUrl.host; // Treat Amazon hosted separately because it has special region logic - if (config.host === 'amazonaws.com') { + if (config.host === 'amazonaws.com' || config.host === 'amazonaws.com.cn') { const match = host.match( - /^(?:([a-z0-9.-]+)\.)?s3(?:[.-]([a-z0-9-]+))?\.amazonaws\.com$/, + /^(?:([a-z0-9.-]+)\.)?s3(?:[.-]([a-z0-9-]+))?\.amazonaws\.com(\.cn)?$/, ); if (!match) { throw new Error(`Invalid AWS S3 URL ${url}`);