티스토리 뷰

CDK로 스택을 배포 할 때 Dev / Test / Prod 등의 환경으로 배포 하기 위해 여러가지 방법이 있다.

여러 가지 방법 중 핵심이 되는 것은 결국 '스택의 아이디를 배포 환경에 맞추어 바꾸어 준다'는 것이다.

예를 들어 FooStack이 있을 경우

new FooStack(app, `FooStack-${env}`);

와 같은 형태로 Stack의 ID를 정해놓고, env값을 dev, test, prod 로 각각 배포하면

FooStack-dev
FooStack-test
FooStack-prod

이렇게 3개의 스택이 생성된다. (당연히 스택 내의 리소스 생성시 리소스의 name을 배포 환경에 관계 없이 고정하는 행위는 절대 하지 말것... 예를 들면 Lambda Function의 이름이라던지 S3의 이름 같은 것을 고정해 버리면 arn 이 중복되고, 배포에 실패하게 된다.)

결국 이 env 값을 어떻게 정할 수 있게 해주느냐?가 관건이다.
(참고로 env 이름을 dev-v1 과 같은 형태로 하면 FooStack-dev-v1 으로 스택이 배포 되기 때문에 versioning 하기에도 좋다.)

첫번째 방법은 cdk.json을 활용 하는 것이다.
cdk.json의 context에 environment 같은걸 추가 후 이걸 읽어와서 사용 하는 방법인데.. 너무 번거롭다

두번째 방법은 아래와 같은 형태의 .ts 파일을 하나 만드는 것이다.
이후 typescript에서 해당 ts파일을 로드하여 사용 하는 것이다.

// manifest.ts
export enum AppConfig {
  VERSION = '1.0',
  DEPLOYMENT = 'dev' //real, qa
}

이후 해당 manifest.ts를 import 하면 AppConfig.DEPLOYMENT 같은 방식으로 해당 변수를 읽어서 사용 할 수 있다.
꽤 괜찮은 방법인데 git으로 파일 관리 하기가 번거롭다.

세번째 방법은 -c 옵션을 사용 하는 것이다.
cdk deploy -c env=prod 와 같이 하는 경우 app.node.tryGetContext("env")에 값이 들어온다.
따라서 아래와 같은 형태로 bin에 코딩 할 수 있다.

const app = new cdk.App();
const env = app.node.tryGetContext("env")==undefined?'dev':app.node.tryGetContext("env");

new FooStack(app, `FooStack-${env}`);

위처럼 해놓고

나는 개인적으로 세번째 방법인 -c를 사용하는 걸 가장 선호한다.

$ cdk deploy FooStack-dev -c env=dev
또는 (스택이 하나 밖에 없는 경우)
$ cdk deploy -c env=dev

와 같이 하면 배포가 된다.
각 환경 별로 다른 변수가 필요할 경우
config-$env.json 같은거 만든 다음에, 각 환경에서 해당 json 읽어서 처리하도록 하면 환경 별 변수 관리도 깔끔하다.

각자 자기한테 맞는 방법을 쓰면 되겠다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함