diff --git a/src/common/base64.ts b/src/common/base64.ts index 828db54..92da7d4 100644 --- a/src/common/base64.ts +++ b/src/common/base64.ts @@ -1 +1,3 @@ export const encodeBase64 = (str: string) => Buffer.from(str, 'utf-8').toString('base64'); + +export const encodeBase64ForRosId = (str: string) => encodeBase64(str).replace(/=+$/, ''); diff --git a/src/parser/bucketParser.ts b/src/parser/bucketParser.ts index a6ce9ca..34b4175 100644 --- a/src/parser/bucketParser.ts +++ b/src/parser/bucketParser.ts @@ -25,6 +25,7 @@ export const parseBucket = (buckets: { website: bucket.website ? { code: bucket.website.code, + domain: bucket.website.domain, index: bucket.website.index ?? 'index.html', error_page: bucket.website.error_page ?? '404.html', error_code: bucket.website.error_code ?? 404, diff --git a/src/stack/rosStack/bucket.ts b/src/stack/rosStack/bucket.ts index ac63102..9f618b9 100644 --- a/src/stack/rosStack/bucket.ts +++ b/src/stack/rosStack/bucket.ts @@ -1,7 +1,7 @@ import { ActionContext, BucketAccessEnum, BucketDomain } from '../../types'; import * as oss from '@alicloud/ros-cdk-oss'; import * as ros from '@alicloud/ros-cdk-core'; -import { getAssets, replaceReference } from '../../common'; +import { encodeBase64ForRosId, getAssets, replaceReference } from '../../common'; import * as ossDeployment from '@alicloud/ros-cdk-ossdeployment'; import path from 'node:path'; import { RosRole } from '@alicloud/ros-cdk-ram'; @@ -86,5 +86,15 @@ export const resolveBuckets = ( true, ); } + if (bucket.website?.domain) { + new oss.Domain( + scope, + `${bucket.key}_custom_domain_${encodeBase64ForRosId(bucket.website.domain)}`, + { + bucketName: ossBucket.attrName, + domainName: replaceReference(bucket.website.domain, context), + }, + ); + } }); }; diff --git a/src/stack/rosStack/event.ts b/src/stack/rosStack/event.ts index 9805c61..afb6b91 100644 --- a/src/stack/rosStack/event.ts +++ b/src/stack/rosStack/event.ts @@ -1,7 +1,7 @@ import * as ros from '@alicloud/ros-cdk-core'; import { ActionContext, EventDomain, EventTypes, ServerlessIac } from '../../types'; import * as ram from '@alicloud/ros-cdk-ram'; -import { encodeBase64, replaceReference } from '../../common'; +import { encodeBase64ForRosId, replaceReference } from '../../common'; import * as agw from '@alicloud/ros-cdk-apigateway'; import { isEmpty } from 'lodash'; @@ -81,9 +81,9 @@ export const resolveEvents = ( apiGateway.forEach((event) => { event.triggers.forEach((trigger) => { - const key = encodeBase64( + const key = encodeBase64ForRosId( replaceReference(`${trigger.method}_${trigger.path}`, context), - ).replace(/=+$/, ''); + ); const api = new agw.RosApi( scope, diff --git a/src/types/domains/bucket.ts b/src/types/domains/bucket.ts index 70730bd..cb42ca7 100644 --- a/src/types/domains/bucket.ts +++ b/src/types/domains/bucket.ts @@ -15,6 +15,7 @@ export type BucketRaw = { }; website?: { code: string; + domain?: string; index?: string; error_page?: string; error_code?: number; @@ -45,6 +46,7 @@ export type BucketDomain = { }; website?: { index: string; + domain?: string; code: string; error_page: string; error_code: number; diff --git a/src/validator/bucketSchema.ts b/src/validator/bucketSchema.ts index 80b8cc4..00fd284 100644 --- a/src/validator/bucketSchema.ts +++ b/src/validator/bucketSchema.ts @@ -50,6 +50,9 @@ export const bucketSchema = { code: { type: 'string', }, + domain: { + type: 'string', + }, index: { type: 'string', }, diff --git a/tests/fixtures/deployFixture.ts b/tests/fixtures/deployFixture.ts index 33e9427..da541f2 100644 --- a/tests/fixtures/deployFixture.ts +++ b/tests/fixtures/deployFixture.ts @@ -1289,6 +1289,7 @@ export const bucketWithWebsiteIac = { name: 'my-bucket', website: { code: 'tests/fixtures/artifacts/large-artifact.zip', + domain: 'my-bucket.com', index: 'index.html', error_page: '404.html', error_code: 404, @@ -1398,6 +1399,15 @@ export const bucketWithWebsiteRos = { }, Type: 'ALIYUN::OSS::Bucket', }, + my_bucket_custom_domain_bXktYnVja2V0LmNvbQ: { + Properties: { + BucketName: { + 'Fn::GetAtt': ['my_bucket', 'Name'], + }, + DomainName: 'my-bucket.com', + }, + Type: 'ALIYUN::OSS::Domain', + }, si_auto_my_bucket_bucket_code_deployment: { Properties: { Parameters: { diff --git a/tests/stack/deploy.test.ts b/tests/stack/deploy.test.ts index d6ebd5f..9096a51 100644 --- a/tests/stack/deploy.test.ts +++ b/tests/stack/deploy.test.ts @@ -197,7 +197,7 @@ describe('Unit tests for stack deployment', () => { ]); }); - it('should deploy bucket as a website when website field is provided', async () => { + it('should deploy bucket as a website when website field is provided', async () => { const stackName = 'my-website-bucket-stack'; mockedRosStackDeploy.mockResolvedValue(stackName);