diff --git a/src/url-shortener/redirect.edge-lambda.ts b/src/url-shortener/redirect.edge-lambda.ts index 1de759b0..c7cf1f56 100644 --- a/src/url-shortener/redirect.edge-lambda.ts +++ b/src/url-shortener/redirect.edge-lambda.ts @@ -10,12 +10,16 @@ export async function handler(event: AWSLambda.CloudFrontRequestEvent): Promise< throw new Error('No S3 origin'); } - const s3Client = new S3Client({ region: s3Origin.region }); - const bucket = s3Origin.domainName.replace(new RegExp(`.s3.${s3Origin.region}.amazonaws.com$`), ''); + const s3details = extractS3Details(s3Origin.domainName); + if (!s3details) { + throw new Error('No S3 details'); + } + + const s3Client = new S3Client({ region: s3details.region }); const key = request.uri.substring(1); // remove first slash const data = await s3Client.send(new GetObjectCommand({ - Bucket: bucket, + Bucket: s3details.bucket, Key: key, })); @@ -44,3 +48,16 @@ export async function handler(event: AWSLambda.CloudFrontRequestEvent): Promise< }; } } + +const S3_HOSTNAME_REGEX = /^(.*)\.s3\.(.*)\.amazonaws\.com$/; + +function extractS3Details(hostname: string): { bucket: string; region: string } | undefined { + const match = hostname.match(S3_HOSTNAME_REGEX); + + if (match) { + const [, bucket, region] = match; + return { bucket, region }; + } + + return undefined; +} diff --git a/test/url-shortener/__snapshots__/url-shortener.test.ts.snap b/test/url-shortener/__snapshots__/url-shortener.test.ts.snap index a7dc1ac3..bbbfc6f0 100644 --- a/test/url-shortener/__snapshots__/url-shortener.test.ts.snap +++ b/test/url-shortener/__snapshots__/url-shortener.test.ts.snap @@ -469,7 +469,7 @@ exports[`UrlShortener 1`] = ` "DeletionPolicy": "Delete", "Properties": { "ParameterName": "/cdk/EdgeFunctionArn/eu-west-1/Stack/UrlShortener/Redirect", - "RefreshToken": "RedirectCurrentVersion479E25ECda849a4c7ccf6efe08941f8fce999820", + "RefreshToken": "RedirectCurrentVersion479E25EC24b64a7773cbeb64effb476e4f6473e9", "Region": "us-east-1", "ServiceToken": { "Fn::GetAtt": [ @@ -1471,7 +1471,7 @@ exports[`UrlShortener with API gateway endpoint 1`] = ` "DeletionPolicy": "Delete", "Properties": { "ParameterName": "/cdk/EdgeFunctionArn/eu-west-1/Stack/UrlShortener/Redirect", - "RefreshToken": "RedirectCurrentVersion479E25ECda849a4c7ccf6efe08941f8fce999820", + "RefreshToken": "RedirectCurrentVersion479E25EC24b64a7773cbeb64effb476e4f6473e9", "Region": "us-east-1", "ServiceToken": { "Fn::GetAtt": [ @@ -2819,7 +2819,7 @@ exports[`UrlShortener with CORS 1`] = ` "DeletionPolicy": "Delete", "Properties": { "ParameterName": "/cdk/EdgeFunctionArn/eu-west-1/Stack/UrlShortener/Redirect", - "RefreshToken": "RedirectCurrentVersion479E25ECda849a4c7ccf6efe08941f8fce999820", + "RefreshToken": "RedirectCurrentVersion479E25EC24b64a7773cbeb64effb476e4f6473e9", "Region": "us-east-1", "ServiceToken": { "Fn::GetAtt": [ @@ -3896,7 +3896,7 @@ exports[`UrlShortener with IAM authorization 1`] = ` "DeletionPolicy": "Delete", "Properties": { "ParameterName": "/cdk/EdgeFunctionArn/eu-west-1/Stack/UrlShortener/Redirect", - "RefreshToken": "RedirectCurrentVersion479E25ECda849a4c7ccf6efe08941f8fce999820", + "RefreshToken": "RedirectCurrentVersion479E25EC24b64a7773cbeb64effb476e4f6473e9", "Region": "us-east-1", "ServiceToken": { "Fn::GetAtt": [ @@ -4846,7 +4846,7 @@ exports[`UrlShortener with authorizer 1`] = ` "DeletionPolicy": "Delete", "Properties": { "ParameterName": "/cdk/EdgeFunctionArn/eu-west-1/Stack/UrlShortener/Redirect", - "RefreshToken": "RedirectCurrentVersion479E25ECda849a4c7ccf6efe08941f8fce999820", + "RefreshToken": "RedirectCurrentVersion479E25EC24b64a7773cbeb64effb476e4f6473e9", "Region": "us-east-1", "ServiceToken": { "Fn::GetAtt": [ @@ -5814,7 +5814,7 @@ exports[`UrlShortener with record name 1`] = ` "DeletionPolicy": "Delete", "Properties": { "ParameterName": "/cdk/EdgeFunctionArn/eu-west-1/Stack/UrlShortener/Redirect", - "RefreshToken": "RedirectCurrentVersion479E25ECda849a4c7ccf6efe08941f8fce999820", + "RefreshToken": "RedirectCurrentVersion479E25EC24b64a7773cbeb64effb476e4f6473e9", "Region": "us-east-1", "ServiceToken": { "Fn::GetAtt": [ diff --git a/test/url-shortener/url-shortener.integ.snapshot/edge-lambda-stack-c8e731c8ad0787291628b399d525c90dc78319b7d7.assets.json b/test/url-shortener/url-shortener.integ.snapshot/edge-lambda-stack-c8e731c8ad0787291628b399d525c90dc78319b7d7.assets.json index bf03021b..5f697133 100644 --- a/test/url-shortener/url-shortener.integ.snapshot/edge-lambda-stack-c8e731c8ad0787291628b399d525c90dc78319b7d7.assets.json +++ b/test/url-shortener/url-shortener.integ.snapshot/edge-lambda-stack-c8e731c8ad0787291628b399d525c90dc78319b7d7.assets.json @@ -1,31 +1,31 @@ { "version": "48.0.0", "files": { - "ef50eada816754194800ebd82b6d5459ee1af84a5fbdfcb142b289e893b6fa07": { + "6a82e28623ac1fb92344ebebb3a3f9b9379074e0a374ce4f9e6f2242765e87d7": { "displayName": "Redirect/Code", "source": { - "path": "asset.ef50eada816754194800ebd82b6d5459ee1af84a5fbdfcb142b289e893b6fa07.edge-lambda", + "path": "asset.6a82e28623ac1fb92344ebebb3a3f9b9379074e0a374ce4f9e6f2242765e87d7.edge-lambda", "packaging": "zip" }, "destinations": { - "current_account-us-east-1-18e1a286": { + "current_account-us-east-1-3b08019a": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1", - "objectKey": "ef50eada816754194800ebd82b6d5459ee1af84a5fbdfcb142b289e893b6fa07.zip", + "objectKey": "6a82e28623ac1fb92344ebebb3a3f9b9379074e0a374ce4f9e6f2242765e87d7.zip", "region": "us-east-1", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-us-east-1" } } }, - "d2ab57caeb7f8091f5291b4d42cc8154899de3d50abfa7174654a1b11d1bbf5c": { + "d044a4ee00a3bcef90047c2c3758bb500041bd4cc20b942a67848f1236c92a7d": { "displayName": "edge-lambda-stack-c8e731c8ad0787291628b399d525c90dc78319b7d7 Template", "source": { "path": "edge-lambda-stack-c8e731c8ad0787291628b399d525c90dc78319b7d7.template.json", "packaging": "file" }, "destinations": { - "current_account-us-east-1-53ca69e4": { + "current_account-us-east-1-f6b60acd": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1", - "objectKey": "d2ab57caeb7f8091f5291b4d42cc8154899de3d50abfa7174654a1b11d1bbf5c.json", + "objectKey": "d044a4ee00a3bcef90047c2c3758bb500041bd4cc20b942a67848f1236c92a7d.json", "region": "us-east-1", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-us-east-1" } diff --git a/test/url-shortener/url-shortener.integ.snapshot/edge-lambda-stack-c8e731c8ad0787291628b399d525c90dc78319b7d7.template.json b/test/url-shortener/url-shortener.integ.snapshot/edge-lambda-stack-c8e731c8ad0787291628b399d525c90dc78319b7d7.template.json index bf778ac8..c3cabf06 100644 --- a/test/url-shortener/url-shortener.integ.snapshot/edge-lambda-stack-c8e731c8ad0787291628b399d525c90dc78319b7d7.template.json +++ b/test/url-shortener/url-shortener.integ.snapshot/edge-lambda-stack-c8e731c8ad0787291628b399d525c90dc78319b7d7.template.json @@ -95,7 +95,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1" }, - "S3Key": "ef50eada816754194800ebd82b6d5459ee1af84a5fbdfcb142b289e893b6fa07.zip" + "S3Key": "6a82e28623ac1fb92344ebebb3a3f9b9379074e0a374ce4f9e6f2242765e87d7.zip" }, "Description": "src/url-shortener/redirect.edge-lambda.ts", "Handler": "index.handler", @@ -112,7 +112,7 @@ "RedirectServiceRole39B6C513" ] }, - "RedirectCurrentVersion479E25ECda849a4c7ccf6efe08941f8fce999820": { + "RedirectCurrentVersion479E25EC24b64a7773cbeb64effb476e4f6473e9": { "Type": "AWS::Lambda::Version", "Properties": { "FunctionName": { @@ -129,7 +129,7 @@ "Name": "/cdk/EdgeFunctionArn/eu-west-1/url-shortener-integ/UrlShortener/Redirect", "Type": "String", "Value": { - "Ref": "RedirectCurrentVersion479E25ECda849a4c7ccf6efe08941f8fce999820" + "Ref": "RedirectCurrentVersion479E25EC24b64a7773cbeb64effb476e4f6473e9" } } } diff --git a/test/url-shortener/url-shortener.integ.snapshot/url-shortener-integ.assets.json b/test/url-shortener/url-shortener.integ.snapshot/url-shortener-integ.assets.json index 133e09ff..f067e271 100644 --- a/test/url-shortener/url-shortener.integ.snapshot/url-shortener-integ.assets.json +++ b/test/url-shortener/url-shortener.integ.snapshot/url-shortener-integ.assets.json @@ -46,16 +46,16 @@ } } }, - "d67dc00290eadaf204923d9d7ca97a66ebddf4724436fb483da8f7261978db7c": { + "e7a33b7557c45411d0e4a42149a0a2c182cc970267dfb9e3416f03b90e06286a": { "displayName": "url-shortener-integ Template", "source": { "path": "url-shortener-integ.template.json", "packaging": "file" }, "destinations": { - "current_account-eu-west-1-fd32efc5": { + "current_account-eu-west-1-70a388a8": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-eu-west-1", - "objectKey": "d67dc00290eadaf204923d9d7ca97a66ebddf4724436fb483da8f7261978db7c.json", + "objectKey": "e7a33b7557c45411d0e4a42149a0a2c182cc970267dfb9e3416f03b90e06286a.json", "region": "eu-west-1", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-eu-west-1" } diff --git a/test/url-shortener/url-shortener.integ.snapshot/url-shortener-integ.template.json b/test/url-shortener/url-shortener.integ.snapshot/url-shortener-integ.template.json index 6357f306..65dc02db 100644 --- a/test/url-shortener/url-shortener.integ.snapshot/url-shortener-integ.template.json +++ b/test/url-shortener/url-shortener.integ.snapshot/url-shortener-integ.template.json @@ -160,7 +160,7 @@ }, "Region": "us-east-1", "ParameterName": "/cdk/EdgeFunctionArn/eu-west-1/url-shortener-integ/UrlShortener/Redirect", - "RefreshToken": "RedirectCurrentVersion479E25ECda849a4c7ccf6efe08941f8fce999820" + "RefreshToken": "RedirectCurrentVersion479E25EC24b64a7773cbeb64effb476e4f6473e9" }, "UpdateReplacePolicy": "Delete", "DeletionPolicy": "Delete"