AWS CDK에서 배포 시점에 값을 동적으로 주입하는 방법은 크게 Context와 Parameters 두 가지가 있다. 두 방싱은 값을 주입하는 시점과 철학에 큰 차이가 있다.
| 구분 | Context (컨텍스트) | Parameters (파라미터) |
|---|---|---|
| 결정 시점 | 합성(Synthesis) 시점 | 배포(Deployment) 시점 |
| 저장 위치 | cdk.json 또는 명령행 인수 | CloudFormation 템플릿의 Parameters 섹션 |
| 주요 용도 | 환경별 설정 (dev/prod 구분) | 배포 시 사용자로부터 직접 값을 입력받을 때 |
| 특징 | 코드 내에서 조건문 분기가 자유로움 | AWS 콘솔이나 CLI에서 배포 직전에 값 변경 가능 |
| 권장 여부 | 강력 권장 (결정론적 인프라) | 특수한 경우 외엔 권장하지 않음 |
Context는 합성(Synth)가 일어날 때 (코드가 템플릿으로 변환될 때) 값을 주입하는 방식이다. cdk.json파일에 저장하거나, 명령행에서 -c옵션으로 전달한다.
node.tryGetContext 메서드를 사용하여 값을 가져온다.
public class MyStack extends Stack {
public MyStack(final Construct scope, final String id, final StackProps props) {
super(scope, id, props);
// 'env'라는 키로 전달된 컨텍스트 값을 읽어온다.
String env = (String) this.getNode().tryGetContext("env");
if ("prod".equals(env)) {
// 운영 환경일 때의 로직
System.out.println("운영 환경 배포 중...");
} else {
// 개발 환경일 때의 로직
System.out.println("개발 환경 배포 중...");
}
}
}
명령행에서 -c옵션을 통해 직접 값을 주입한다.
cdk synth -c env=prod
cdk deploy -c env=dev
Parameters는 CloudFormation의 기능을 그대로 활용하는 방식이다. 템플릿이 이미 생성된 후 AWS에 배포되는 단계에서 값을 결정한다.
CfnParameter객체를 사용하여 정의한다.
public class MyStack extends Stack {
public MyStack(final Construct scope, final String id, final StackProps props) {
super(scope, id, props);
// 배포 시점에 입력받을 파라미터 정의
CfnParameter bucketNameParam = CfnParameter.Builder.create(this, "BucketName")
.type("String")
.description("생성할 버킷의 이름을 입력하세요")
.build();
// 파라미터 값 사용 (배포 전까지는 실제 값을 알 수 없음)
Bucket.Builder.create(this, "MyBucket")
.bucketName(bucketNameParam.getValueAsString())
.build();
}
}
cdk deploy --parameters BucketName=my-unique-bucket-name-123
CDK의 핵심 철학 중 하나는 코드가 생성하는 결과물은 항상 예측 가능해야 한다는 것이다.
if-else문을 사용하여 리소스 구조 자체를 바꿀 수 있다. 반면 Parameters는 리소스의 속성값만 바꿀 수 있을 뿐 리소스의 존재 유무를 제어하기는 매우 까다롭다.cdk.json에 환경별 설정을 적어두면 누가 배포하더라도 동일한 인프라가 생성됨을 보장할 수 있다.