관리 메뉴

가끔 보자, 하늘.

CDK로 AWS 인프라 구축하기 - #마지막 본문

개발 이야기/인프라 구축 및 운영

CDK로 AWS 인프라 구축하기 - #마지막

가온아 2022. 6. 28. 12:40

원래 #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,
});

이상입니다. 도움이 되셨기를 ... 

반응형