AWS CDK: 환경별 구성 패턴
소개 👋
종종 프로젝트는 배포된 각 환경에 대해 서로 다른 구성 값을 갖습니다. 기능 토글, 타사 서비스의 URL 또는 기타 변수가 될 수 있습니다.
AWS CDK를 사용하면 구성이 간단합니다. 이 문제에 대한 몇 가지 다른 접근 방식을 보았습니다. 이 블로그에서는 TypeScript에서 사용하기에 적합한 몇 가지를 공유할 것입니다.
방법 1️⃣: 스택 구성 기능
이 접근 방식은 매퍼 기능을 사용하여 구성을 반환합니다. EnvironmentConfig
인터페이스에 단일 구성 속성이 정의되어 있음을 알 수 있습니다.
interface IEnvironmentConfig {
readonly myEnvSpecificApiEndpoint: string;
}
const environmentConfig = (environment: string): IEnvironmentConfig => {
const environmentMapper: {
[environment: string]: {
myEnvSpecificApiEndpoint: string;
};
} = {
local: {
myEnvSpecificApiEndpoint: 'https://dev.google.com/api',
},
test: {
myEnvSpecificApiEndpoint: 'https://test.google.com/api',
},
production: {
myEnvSpecificApiEndpoint: 'https://google.com/api',
},
};
return environmentMapper[environmentName];
};
이 함수는 다음과 같이 스택에서 호출됩니다. process.env.ENV_NAME
는 환경 이름(선택한 CI/CD 파이프라인의 환경 이름 변수로 대체)에 해당하거나 정의되지 않은 경우 기본값은 로컬입니다.
const environment: string = process.env.ENV_NAME || 'local';
const envConfig: IEnvironmentConfig = environmentConfig(environment);
그런 다음 다음과 같이 구성에 액세스할 수 있습니다.
const apiEndpoint: string = envConfig.myEnvSpecificApiEndpoint;
apiEndpoint
변수는 이제 스택에서 사용할 준비가 되었습니다.
방법 2️⃣: CDK 런타임 컨텍스트
CDK Context 값은 스택 또는 구성과 연결할 수 있는 키-값 쌍입니다. 이러한 값을 구성하는 방법에는 여러 가지가 있습니다. 이에 대한 자세한 내용은 위의 설명서 링크를 참조하십시오.
이 예에서는 CDK 프로젝트의 루트에 있는 cdk.context.json
파일을 사용하여 스택을 구성하겠습니다.
다음은 예입니다cdk.context.json
.
{
"local":{
"myEnvSpecificApiEndpoint":"https://dev.google.com/api"
},
"test":{
"myEnvSpecificApiEndpoint":"https://test.google.com/api"
},
"production":{
"myEnvSpecificApiEndpoint":"https://google.com/api"
}
}
예상되는 구성 데이터 유형을 정의하기 위해 인터페이스를 생성할 수도 있습니다.
interface IEnvironmentConfig {
readonly myEnvSpecificApiEndpoint: string;
}
이러한 값은 다음과 같이 액세스할 수 있습니다.
const environment: string = process.env.ENV_NAME || 'local';
const envConfig: IEnvironmentConfig = scope.node.tryGetContext(environment);
const apiEndpoint: string = envConfig.myEnvSpecificApiEndpoint;
방법 3️⃣: StackProps 확장
AWS CDKStackProps 인터페이스를 확장하여 구성 속성을 추가할 수 있습니다. 이 예제에서는 AWS CDK 인터페이스를 확장하여 myEnvSpecificApiEndpoint
라는 속성을 추가합니다.
interface IEnvironmentConfig extends StackProps {
readonly myEnvSpecificApiEndpoint: string;
}
이제 스택 초기화 파일(bin
디렉토리에 있음)에서 이것을 전달할 수 있습니다.
const app = new cdk.App();
new TheScheduledLambdaStack(app, 'TheScheduledLambdaStack',{
myEnvSpecificApiEndpoint: 'https://dev.google.com/api'
});
이제 이것의 한 가지 단점은 환경별로 구성하기 위해 여전히 방법 1 또는 2와 같은 것을 구현해야 한다는 것입니다. 방법 1의 경우 다음과 같습니다.
new TheScheduledLambdaStack(app, 'TheScheduledLambdaStack',{
myEnvSpecificApiEndpoint: envConfig.myEnvSpecificApiEndpoint;
});
결론 🤌
세 가지 방법을 모두 볼 때 저는 개인적으로 방법 2를 좋아합니다. 최근까지 저는 CDK가 이미 이 문제를 '해결'했다는 사실을 모르고 있었습니다.
나는 '코드는 책임이다'라는 말에 따라 생활합니다. 즉, 관리하는 코드가 적을수록 좋습니다.
당신은..
이 접근 방식은 매퍼 기능을 사용하여 구성을 반환합니다.
EnvironmentConfig
인터페이스에 단일 구성 속성이 정의되어 있음을 알 수 있습니다.interface IEnvironmentConfig {
readonly myEnvSpecificApiEndpoint: string;
}
const environmentConfig = (environment: string): IEnvironmentConfig => {
const environmentMapper: {
[environment: string]: {
myEnvSpecificApiEndpoint: string;
};
} = {
local: {
myEnvSpecificApiEndpoint: 'https://dev.google.com/api',
},
test: {
myEnvSpecificApiEndpoint: 'https://test.google.com/api',
},
production: {
myEnvSpecificApiEndpoint: 'https://google.com/api',
},
};
return environmentMapper[environmentName];
};
이 함수는 다음과 같이 스택에서 호출됩니다.
process.env.ENV_NAME
는 환경 이름(선택한 CI/CD 파이프라인의 환경 이름 변수로 대체)에 해당하거나 정의되지 않은 경우 기본값은 로컬입니다.const environment: string = process.env.ENV_NAME || 'local';
const envConfig: IEnvironmentConfig = environmentConfig(environment);
그런 다음 다음과 같이 구성에 액세스할 수 있습니다.
const apiEndpoint: string = envConfig.myEnvSpecificApiEndpoint;
apiEndpoint
변수는 이제 스택에서 사용할 준비가 되었습니다.방법 2️⃣: CDK 런타임 컨텍스트
CDK Context 값은 스택 또는 구성과 연결할 수 있는 키-값 쌍입니다. 이러한 값을 구성하는 방법에는 여러 가지가 있습니다. 이에 대한 자세한 내용은 위의 설명서 링크를 참조하십시오.
이 예에서는 CDK 프로젝트의 루트에 있는 cdk.context.json
파일을 사용하여 스택을 구성하겠습니다.
다음은 예입니다cdk.context.json
.
{
"local":{
"myEnvSpecificApiEndpoint":"https://dev.google.com/api"
},
"test":{
"myEnvSpecificApiEndpoint":"https://test.google.com/api"
},
"production":{
"myEnvSpecificApiEndpoint":"https://google.com/api"
}
}
예상되는 구성 데이터 유형을 정의하기 위해 인터페이스를 생성할 수도 있습니다.
interface IEnvironmentConfig {
readonly myEnvSpecificApiEndpoint: string;
}
이러한 값은 다음과 같이 액세스할 수 있습니다.
const environment: string = process.env.ENV_NAME || 'local';
const envConfig: IEnvironmentConfig = scope.node.tryGetContext(environment);
const apiEndpoint: string = envConfig.myEnvSpecificApiEndpoint;
방법 3️⃣: StackProps 확장
AWS CDKStackProps 인터페이스를 확장하여 구성 속성을 추가할 수 있습니다. 이 예제에서는 AWS CDK 인터페이스를 확장하여 myEnvSpecificApiEndpoint
라는 속성을 추가합니다.
interface IEnvironmentConfig extends StackProps {
readonly myEnvSpecificApiEndpoint: string;
}
이제 스택 초기화 파일(bin
디렉토리에 있음)에서 이것을 전달할 수 있습니다.
const app = new cdk.App();
new TheScheduledLambdaStack(app, 'TheScheduledLambdaStack',{
myEnvSpecificApiEndpoint: 'https://dev.google.com/api'
});
이제 이것의 한 가지 단점은 환경별로 구성하기 위해 여전히 방법 1 또는 2와 같은 것을 구현해야 한다는 것입니다. 방법 1의 경우 다음과 같습니다.
new TheScheduledLambdaStack(app, 'TheScheduledLambdaStack',{
myEnvSpecificApiEndpoint: envConfig.myEnvSpecificApiEndpoint;
});
결론 🤌
세 가지 방법을 모두 볼 때 저는 개인적으로 방법 2를 좋아합니다. 최근까지 저는 CDK가 이미 이 문제를 '해결'했다는 사실을 모르고 있었습니다.
나는 '코드는 책임이다'라는 말에 따라 생활합니다. 즉, 관리하는 코드가 적을수록 좋습니다.
당신은..
{
"local":{
"myEnvSpecificApiEndpoint":"https://dev.google.com/api"
},
"test":{
"myEnvSpecificApiEndpoint":"https://test.google.com/api"
},
"production":{
"myEnvSpecificApiEndpoint":"https://google.com/api"
}
}
interface IEnvironmentConfig {
readonly myEnvSpecificApiEndpoint: string;
}
const environment: string = process.env.ENV_NAME || 'local';
const envConfig: IEnvironmentConfig = scope.node.tryGetContext(environment);
const apiEndpoint: string = envConfig.myEnvSpecificApiEndpoint;
AWS CDKStackProps 인터페이스를 확장하여 구성 속성을 추가할 수 있습니다. 이 예제에서는 AWS CDK 인터페이스를 확장하여
myEnvSpecificApiEndpoint
라는 속성을 추가합니다.interface IEnvironmentConfig extends StackProps {
readonly myEnvSpecificApiEndpoint: string;
}
이제 스택 초기화 파일(
bin
디렉토리에 있음)에서 이것을 전달할 수 있습니다.const app = new cdk.App();
new TheScheduledLambdaStack(app, 'TheScheduledLambdaStack',{
myEnvSpecificApiEndpoint: 'https://dev.google.com/api'
});
이제 이것의 한 가지 단점은 환경별로 구성하기 위해 여전히 방법 1 또는 2와 같은 것을 구현해야 한다는 것입니다. 방법 1의 경우 다음과 같습니다.
new TheScheduledLambdaStack(app, 'TheScheduledLambdaStack',{
myEnvSpecificApiEndpoint: envConfig.myEnvSpecificApiEndpoint;
});
결론 🤌
세 가지 방법을 모두 볼 때 저는 개인적으로 방법 2를 좋아합니다. 최근까지 저는 CDK가 이미 이 문제를 '해결'했다는 사실을 모르고 있었습니다.
나는 '코드는 책임이다'라는 말에 따라 생활합니다. 즉, 관리하는 코드가 적을수록 좋습니다.
당신은..
댓글로 알려주세요!
Reference
이 문제에 관하여(AWS CDK: 환경별 구성 패턴), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/aws-builders/aws-cdk-per-environment-configuration-patterns-48m6텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)