Giới thiệu quy tắt đặt tên
Mình sử dụng quy tắt đặt tên cho resource như sau.
ví dụ
Resources:
VPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.90.16.0/22
EnableDnsHostnames: true
EnableDnsSupport: true
InstanceTenancy: default
Tags:
- Key: Name
Value: cdk-learning-dev-network-vpc
bạn có thể thấy là trong tên của resource có kèm theo tên của môi trường, vậy thì làm thế nào mà chúng ta có thể cấu hình một cách linh hoạt, có rất nhiều ý tưởng để đạt được điều này?
sử dung biến môi trường
Trong JS để truy cập vào biến môi trường bạn có thể làm như sau.
console.log('ENV', process.env.ENV);
Sử dụng file cấu hình
bạn có thể taọ một file cấu hình riêng biệt sau đó fmooix khi sử dụng thì gọi nó.
export class EnvDevelop {
static StageName = 'dev';
static SystemName = 'network';
static ProjectName = 'cdk-learning';
}
Bối cảnh thời gian chạy CDK
chi tiết hơn bạn có thể tham khảo ở đây
Generate cấu hình
hiện tại mình tháy cách này là phù hợp đối với mình, mỗi khi dùng lệnh cdk mình sẽ thêm cờ -c config=dev|stg|prod để chọn cấu hình phù hợp với mỗi môi trường.
cấu hình mình mong muốn là
{
"projectOwner": "Quan.devopsify",
"projectName": "cdk-learning",
"costOwner": "huyntt.devopsify",
"environment" "dev || stg || prod"
}
cấu hình này mình sử dụng cho việc đánh tag resource… và dùng cho nhiều việc khác nữa, tùy vào nhu cầu của bạn.
MÌnh tạo một file config/build-config.ts trong thư mục dự án cdk
import * as cdk from "aws-cdk-lib";
// These values map to the keys in our cdk.json and make sure
// no values that aren't supported are passed in with the
// -c config=env flag
const supportedEnvironments = ["dev", "stg", "prod"] as const;
type SupportedEnvironments = typeof supportedEnvironments[number];
// This maps to the values you specified in your cdk.json file
// if you add any values to your cdk.json file, also add them here!
export type BuildConfig = {
environment: SupportedEnvironments;
projectOwner: string;
projectName: string;
costOwner: string;
};
// This function is used by your CDK app and pulls your config values
// from the context
export const getConfig = (app: cdk.App): BuildConfig => {
const env = app.node.tryGetContext("config");
if (!env) {
throw new Error(
"Environment variable must be passed to cdk: `yarn cdk -c config=XXX`"
);
}
if (!supportedEnvironments.includes(env)) {
throw new Error(
`${env} is not in supported environments: ${supportedEnvironments.join(
", "
)}`
);
}
// this contains the values in the context without being
// validated
const unparsedEnv = app.node.tryGetContext(env);
return {
environment: env,
projectOwner: ensureString(unparsedEnv, "projectOwner"),
projectName: ensureString(unparsedEnv, "projectName"),
costOwner: ensureString(unparsedEnv, "costOwner"),
};
};
// this function ensures that the value from the config is
// the correct type. If you have any types other than
// strings be sure to create a new validation function
function ensureString(
object: { [name: string]: any },
key: keyof BuildConfig
): string {
if (
!object[key] ||
typeof object[key] !== "string" ||
object[key].trim().length === 0
) {
throw new Error(key + " does not exist in cdk config");
}
return object[key];
}
file này dùng để generate ra file cấu hình như mình nói ở trên bằng cách đọc praram config=dev || stg || prod mà mình truyền vào, sau đó nó kết hợp cùng với một số common config mà mình sẽ khai báo nó trong cdk.json
Refactoring
mình nhận thấy mỗi resource mỗi khi khởi tạo đều cần đánh tag. Mình sẽ tạo ra một class để đưa ra quy tắt đặt tag, và các resource khác khi tạo sẽ kế thừa class này.
Tạo file lib/resources/abstract/index.ts trông thư mục dự án.
import { Construct } from 'constructs';
import * as cdk from "aws-cdk-lib";
export abstract class Resource {
constructor() {}
protected createTagName(scope: Construct, ProjectName: string, StageName: string, stackname: string, originalName: string): string {
return [
ProjectName,
StageName,
stackname,
originalName,
].join('-');
}
// protected Format(scope: Construct, name: string): string {
// return name
// .split('-')
// .map((name) => name[0].toUpperCase() + name.substring(1))
// .join('');
// }
// protected FomatId(scope: Construct, id: number): string {
// return ('00' + id).slice(-3);
// }
}
phần mình comment là tạm thời trong bài này chưa dùng đến,
class tạo vpc trong bài viết trước sẽ được chỉnh lại như sau
Mình sẽ import class Resource và sau đó extends trong Vpc. Và từ đây về sau mọi tag của resurce đều tuân theo quy tắt trên.
Trong file lib/hello-ckd-stack.ts chỉnh lại như sau.
Kiểm tra
Kiểm tra xem kết quả như thế nào.
chạy lệnh cdk synth -c config=dev
Như mong đợi
Bonus
lúc nãy mình tạo file cấu hình có nhiều cặp key value, những cặp key value đó mình dùng cho việc đánh tag ở cấp common dự án
trong file bin/hello-ckd.ts mình cấu hình như sau.