AWS CDK를 사용한 Daas 인프라 구축 및 사용 팁 1

Dongkyu Ko
딜리버스
Published in
8 min readOct 26, 2021

이 글은 딜리버스의 Daas AWS CDK 인프라 및 구조, AWS CDK 사용 팁에 대해 다룹니다.

아래의 글을 보기 전 AWS CDK 사용 환경 구성에 대한 글을 참고해주세요.

!!AWS CDK v2를 사용했습니다!!

Delivus AWS CDK example

Daas 인프라 구축에 만들었던 소스코드를 공개할 수 없어서 AWS CDK로 간단하게 구현해 볼 수 있는 예제 소스코드를 만들었습니다. 많이 부족하지만 이쁘게 봐주시고 추가하고 싶거나 수정할 내용이 있으면 언제든지 Issue를 생성하거나 dongkyu@delivus.co.kr 또는 kokospapa@delivus.co.kr로 문의해주세요.

Architecture

Daas 인프라 구조는 더 복잡합니다. 예제를 위해 코어한 부분을 제외하고 만들었고 제외한 부분은 presentation layer, business logic layer, database layer입니다.

Delivus AWS CDK example Architecture

Github 링크

지속적으로 dataops, devops, pushops, mlops layer도 릴리즈 할 예정이니 많은 관심부탁드립니다.

Daas AWS 인프라 및 CDK 구조

Dass AWS 인프라

딜리버스는 소수의 멤버로 효율적인 운영을 하기 위하여 관리 포인트를 줄일 수 있는 서버리스(Serverless)를 지향하고 있습니다.

유지보수 목적으로 Redis, AWS RDS에 접근하기 위한 Bastion EC2를 제외하고 Daas 인프라는 모두 서버리스 기반의 AWS 서비스(ECS, Lambda, Amplify, API Gateway 등)를 적극 사용하고 있습니다.

현재 운영하고 있는 Daas 인프라 구조는 더 복잡하지만 빠른 이해를 위해 직관적으로 만들었습니다. (VPC 구조같은 핵심적인 내용 배제)

Daas Infra Architecture

Dass AWS CDK 구조 (Lambda는 SAM으로 관리)

제가 한것이 답이 아닙니다. (저도 삽질을 하면서 하는 중입니다.) 더 좋은 의견이 있다면 언제든지 피드백 부탁드립니다. 🙂

Daas CDK Stack (서비스 기준)
  • 각 스택에 대한 간단한 설명
    - alb_target_group_stack → ALB에 대한 Stack
    - amplify_build_specs → Amplify 빌드 시 필요한 Yaml 정의
    - amplify_stack → Amplify에 대한 Stack
    - bastion_ec2_stack → EC2 Bastion Instance에 대한 Stack
    - cloudwatch_log_stack → Cloudwatch log에 대한 Stack
    - 000_app_stack → 전체 stack의 실행 순서를 정하고 실행 (AWS CDK를 실행하는 app.py에서 불러오는 stack)
    - ecr_stack → ECR에 대한 Stack
    - ecs_stack → ECS에 대한 stack
    - iam_custom_policies → IAM Custom Policies에 대한 정의
    - iam_role_stack → IAM에 대한 Stack
    - rds_stack → RDS에 대한 Stack
    - redis_stack → Redis에 대한 Stack
    - route53_acm_stack → Route53에 대한 Stack
    - s3_stack → S3에 대한 Stack
    - security_group_stack → SG에 대한 Stack
    - ssm_parameter_stack → SSM Parameter Store에 대한 Stack
    - vpc_subnet_stack → VPC, Subnets에 대한 Stack

— —

Stack 실행 순서

실행 순서를 정해주지 않으면 각 스택이 동시에 실행되기 때문에 에러가 발생해서 stack 마다 dependency을 설정해줘서 CDK 배포 시 에러가 나지 않도록 설정했습니다.

순서
1. iam_role_stack
2. vpc_subnet_stack
3. security_group_stack
4. s3_stack
5. ecr_stack
6. cloudwatch_log_stack
7. alb_target_group_stack
8. route53_acm_stack
9. bastion_ec2_stack
10. rds_stack
11. redis_stack
12. ecs_stack
13. amplify_stack

AWS CDK 사용 팁

AWS CDK로 처음 IaC를 하다보니 우여곡절이 정말 정말 많았습니다.

사용 팁 2탄

아직 많이 부족하지만 다른분들은 AWS CDK 사용하면서 조금이나마 덜 삽집을 하기바라며, 지금까지 삽질 했던 부분에 대한 사용 팁을 간략하게 정리해봤습니다. (개발한 AWS CDK를 공개하고 싶지만 내부 자료라 공개하기 어려워 해당 주제를 준비했으니 도움이 되었으면 좋겠습니다.)

— —

ec2.CfnInstance에서 userdata 사용법

EC2 Bastion Instance에 Squid 설정을 위해 userdata를 설정하는 예제입니다.

참고

— —

ECS 컨테이너 실행 순서(상태 확인 후) 정해주기

여러개의 ECS 컨테이너를 실행할 경우 컨테이너의 순서가 정해져야 할 때와 먼저 실행된 컨테이너의 상태를 보고 다음 실행할 컨테이너를 실행하는 방법에 대한 예제입니다.

— —

L1(Cfn000)으로 선언한 리소스 실행 순서 정해주기 (필수)

L2의 경우 리소스의 생성 순서를 꼭 정해주지 않아도 되지만 L1의 경우 리소스가 동시에 생성되기 때문에 순서를 정해주어야 합니다.(저의 경우 RDS, Redis 생성할 때 서브넷 그룹과 인스턴스가 동시에 만들어져서 에러가 발생했습니다.)

아래의 예제 코드는 Redis를 예제로 한 코드입니다.

— —

amplify.CfnAPP의 oauth_token은 parameter store(secure string)을 지원을 하지 않음

ECS, RDS에서는 parameter store(secure string)을 지원합니다.

중요한 정보를 담고 있는 문자열은 코드에 직접 삽입할 수 없기 때문에 SSM Parameter Store에 보관되어 있는 보안 문자열을 가져오려고 했지만 지원하지 않았습니다.

해당 문제는 고민하다가 os.environ으로 대체했습니다. (하루 빨리 업데이트 되기를 바랍니다.)

  • ssm secure string 대신 os.environ으로 대체
  • cdk version v2는 amplify.app(L2)을 지원하지 않아 ssm secure string을 사용할 수 없음
에러 발생

— —

AWS CDK Docs 문서 효율적(잘?)으로 보는 방법

해결해야할 문제가 있으면 자연스럽게 항상 구박사님에게 질문을 했지만 생각보다 구박사님도 레퍼런스가 거의 없어서 삽질을 많이했고 AWS CDK Docs에 의존을 많이했습니다.

자연스럽게 문서를 많이 보다보니 문서를 보다보면 각 API Reference 하위 문서에 “Package Overview”가 있는데 예제도 많고 좋은 내용이 많았습니다. API를 사용하기 전에 읽기를 권장합니다.
(가끔 “Package Overview” 내용이 없는 경우도 있습니다.)

config 관련 문서

글을 마무리하며

AWS CDK 사용 환경 구성부터 지금 보고 계시는 블로그까지 AWS CDK 사용 방법, 사용 팁, Daas 인프라 및 CDK 구성을 볼 수 있었습니다.

다음 블로그 주제는 “Github action을 사용해 AWS CDK CD(Continuous Delivery), ECS CD를 구성하는 방법에 대해 다뤄보겠습니다.

많이 부족한 긴글을 읽어주시느라 너무 감사합니다.

--

--