Skip to content

Commit dce83ce

Browse files
authored
feat: enable support for custom domain (#46)
feat: enable support to specify a custom domain for a website bucket Refs: #36 Signed-off-by: seven <[email protected]>
1 parent e339da5 commit dce83ce

File tree

8 files changed

+33
-5
lines changed

8 files changed

+33
-5
lines changed

src/common/base64.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
export const encodeBase64 = (str: string) => Buffer.from(str, 'utf-8').toString('base64');
2+
3+
export const encodeBase64ForRosId = (str: string) => encodeBase64(str).replace(/=+$/, '');

src/parser/bucketParser.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ export const parseBucket = (buckets: {
2525
website: bucket.website
2626
? {
2727
code: bucket.website.code,
28+
domain: bucket.website.domain,
2829
index: bucket.website.index ?? 'index.html',
2930
error_page: bucket.website.error_page ?? '404.html',
3031
error_code: bucket.website.error_code ?? 404,

src/stack/rosStack/bucket.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { ActionContext, BucketAccessEnum, BucketDomain } from '../../types';
22
import * as oss from '@alicloud/ros-cdk-oss';
33
import * as ros from '@alicloud/ros-cdk-core';
4-
import { getAssets, replaceReference } from '../../common';
4+
import { encodeBase64ForRosId, getAssets, replaceReference } from '../../common';
55
import * as ossDeployment from '@alicloud/ros-cdk-ossdeployment';
66
import path from 'node:path';
77
import { RosRole } from '@alicloud/ros-cdk-ram';
@@ -86,5 +86,15 @@ export const resolveBuckets = (
8686
true,
8787
);
8888
}
89+
if (bucket.website?.domain) {
90+
new oss.Domain(
91+
scope,
92+
`${bucket.key}_custom_domain_${encodeBase64ForRosId(bucket.website.domain)}`,
93+
{
94+
bucketName: ossBucket.attrName,
95+
domainName: replaceReference(bucket.website.domain, context),
96+
},
97+
);
98+
}
8999
});
90100
};

src/stack/rosStack/event.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import * as ros from '@alicloud/ros-cdk-core';
22
import { ActionContext, EventDomain, EventTypes, ServerlessIac } from '../../types';
33
import * as ram from '@alicloud/ros-cdk-ram';
4-
import { encodeBase64, replaceReference } from '../../common';
4+
import { encodeBase64ForRosId, replaceReference } from '../../common';
55
import * as agw from '@alicloud/ros-cdk-apigateway';
66
import { isEmpty } from 'lodash';
77

@@ -81,9 +81,9 @@ export const resolveEvents = (
8181

8282
apiGateway.forEach((event) => {
8383
event.triggers.forEach((trigger) => {
84-
const key = encodeBase64(
84+
const key = encodeBase64ForRosId(
8585
replaceReference(`${trigger.method}_${trigger.path}`, context),
86-
).replace(/=+$/, '');
86+
);
8787

8888
const api = new agw.RosApi(
8989
scope,

src/types/domains/bucket.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export type BucketRaw = {
1515
};
1616
website?: {
1717
code: string;
18+
domain?: string;
1819
index?: string;
1920
error_page?: string;
2021
error_code?: number;
@@ -45,6 +46,7 @@ export type BucketDomain = {
4546
};
4647
website?: {
4748
index: string;
49+
domain?: string;
4850
code: string;
4951
error_page: string;
5052
error_code: number;

src/validator/bucketSchema.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,9 @@ export const bucketSchema = {
5050
code: {
5151
type: 'string',
5252
},
53+
domain: {
54+
type: 'string',
55+
},
5356
index: {
5457
type: 'string',
5558
},

tests/fixtures/deployFixture.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1289,6 +1289,7 @@ export const bucketWithWebsiteIac = {
12891289
name: 'my-bucket',
12901290
website: {
12911291
code: 'tests/fixtures/artifacts/large-artifact.zip',
1292+
domain: 'my-bucket.com',
12921293
index: 'index.html',
12931294
error_page: '404.html',
12941295
error_code: 404,
@@ -1398,6 +1399,15 @@ export const bucketWithWebsiteRos = {
13981399
},
13991400
Type: 'ALIYUN::OSS::Bucket',
14001401
},
1402+
my_bucket_custom_domain_bXktYnVja2V0LmNvbQ: {
1403+
Properties: {
1404+
BucketName: {
1405+
'Fn::GetAtt': ['my_bucket', 'Name'],
1406+
},
1407+
DomainName: 'my-bucket.com',
1408+
},
1409+
Type: 'ALIYUN::OSS::Domain',
1410+
},
14011411
si_auto_my_bucket_bucket_code_deployment: {
14021412
Properties: {
14031413
Parameters: {

tests/stack/deploy.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ describe('Unit tests for stack deployment', () => {
197197
]);
198198
});
199199

200-
it('should deploy bucket as a website when website field is provided', async () => {
200+
it('should deploy bucket as a website when website field is provided', async () => {
201201
const stackName = 'my-website-bucket-stack';
202202
mockedRosStackDeploy.mockResolvedValue(stackName);
203203

0 commit comments

Comments
 (0)