CDK로 AWS 인프라 구축하기 - #마지막
원래 #5로 끝났지만 주의할 사항들이 몇 있어 간단히 정리하고 정말 마무리 하려 합니다.
1. 여러 스택을 정의한 경우
> cdk deploy/destroy stack01 // 이렇게 명시해서 특정 스택만 배포/삭제
> cdk deploy/destroy --all // 정의된 모든 스택을 배포/삭제
2. 분기 처리 방법
local의 config, env 파일 등에 정의한 내용을 활용하여 내부 분기처리를 할수 있습니다. 예를들면 config.json 파일에 배포할 지역을 정의하고 이를 읽어 처리할 수 있습니다
// config.json 의 예
{
"regions" : ["us-east-2", "ap-northeast-2"]
}
혹은 위와 같은 내용은 ddb에 업데이트하고 deploy/destroy 시 이를 읽어 진행할 수도 있을 겁니다.
.
.
const AWS = require('aws-sdk')
AWS.config.update({region: 'us-east-2'});
var ddb = new AWS.DynamoDB.DocumentClient();
.
.
var params = {
TableName: "your_table_name"
Key : {
name : "region_list"
}
}
ddb.get(params, (err:any, data:any) => {
if(!err){
if(data.Item.regions){
var regions = data.Item.regions.split(','); // "ap-northeast-2 , us-east-2" 이와 같이 ,로 구분되어 입력되었다고 가정
for(var idx in regions){
let region = regions[idx].trim();
new RegionStack(app, 'stack-'+region, { // stack이름이 같으면 안된다. region명으로 구분한다고 가정
env: { account: 'your_account_id', region: region },
});
}
}else{
console.log("No regions. Check your table!");
}
}
});
.
.
--------------
(* region이 복수일 수 있으므로 실행 시 --all 옵션이 필요합니다.)
위에 든 예시 외에도 필요한 환경에 따라 다양한 방법을 도입할 수 있습니다.
3. 변경되는 이름 주의
리소스를 생성할 때 id를 지정하는데 일부는 지정한 id 자체로 명명되지만 (예, VPC) 대부분은 어떤 값이 추가되어 생성됩니다. (예, DynamoDB - DynamoDB 생성 시 TableName은 지정한 이름에 일별로 정해지는 별도의 텍스트가 추가되어 생성됩니다.) 이를 방지하기 위해서는 props 중 실제이름을 지정할 수 있는 속성값을 설정하세요.
4. 중복 생성 주의
예를들어 dynamodb를 아래와 같이 생성하면...
const ddb_main = new dynamodb.Table(this, "testTable", {
partitionKey: {name: "name", type:dynamodb.AttributeType.STRING},
billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,
});
처음은 정상적으로 생성되며, 바로 이어 다시 deploy를 시도하면
✅ testTable(no changes)
위와 같은 메세지가 출력되면서 중복 생성되지 않습니다. 하지만 다음 날 시도하면 새로운 테이블이 생성됩니다.
CDK에서 리소스를 생성 시 사용자가 지정한 id 뒤에 랜덤하게 붙는 텍스트(3번 참고)가 있습니다. deploy 혹은 destroy 시 TOKEN으로 명명된 랜덤 텍스트가 추가되는데 이게 일일 별로 변경되고 있어 발생하는 문제인 듯 합니다. 이를 방지하기 위해서는 props에 "tableName"값을 추가하여 테이블명을 명시하시기 바랍니다.
DynamoDB 외에도 S3 등도 이와 유사한 이슈들이 있으니 참고하세요.
5. DynamoDB가 Destroy 시 삭제되지 않는 이슈
데이터 손실을 방지하기 위해 dynamodb의 테이블은 삭제되지 않습니다. 대신 stack에서는 분리됩니다. 이를 자동 삭제하기 위해서는 removePolicy를 아래와 같이 설정하면 되지만 추천하지는 않습니다.
const ddb_main = new dynamodb.Table(this, "testTable", {
removalPolicy: cdk.RemovalPolicy.DESTROY,
partitionKey: {name: "name", type:dynamodb.AttributeType.STRING},
billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,
});
이상입니다. 도움이 되셨기를 ...