Blog

AWS CDK 알아보기 (1)

인프라도 코드로 관리한다: IaC

IaC = Infrastrcuture As Code
처음 AWS를 다루게 되면 보통 AWS Management Console ( GUI )에서 생성하고 확인하게 된다.
이는 소규모일 땐 크게 부담스럽지 않고 빠르고 편하게 인프라를 관리할 수 있다.
하지만 서비스를 운영하다 보면 점점 더 규모가 커지게 되고, 다양한 서비스들을 이용하게 된다. ( e.g. ECS, Beantalk, SQS, SNS, ElastiCache, RDS 등 )
또한 기존에 담당하던 사람들의 변동이 생길 경우 히스토리를 관리하는 것에 대한 한계가 생긴다.
이러한 문제점들을 해결하기 위해 인프라를 코드로 관리하는 것이다.

인프라 관리의 불편 사례

1. 웹 환경의 변화

Management Console을 이용할 때는 다른 사람들도 따라서 만들 수 있도록 화면을 캡처하고 관련 내용을 남기게 된다.
하지만 Management Console은 웹 환경이기 때문에 변화가 생길 수 있고, 이런 경우 높은 확률로 미리 만들어둔 가이드와 새로운 UI의 차이가 생기게 된다.
(구) 관리 화면
(신) 관리 화면

2. 예기치 않은 비용 청구

Management Console에서 테스트를 위해 다양한 서비스들을 사용한 후 리소스들을 제거해줘야 비용이 청구되지 않는다.
하지만 작업하다 보면 어떤 리소스들을 생성했고 사용했는지 전부 기억하는 게 쉽지 않고, 실수로 놓치는 부분이 생길 수 있다.

3. 관리되지 않는 히스토리

인프라를 담당자가 바뀌거나, 시간이 오래 지난 뒤 기존 서비스들을 업데이트하려면 가장 먼저 막막함을 느끼게 된다.
( 이걸 왜 이렇게 구성했지?, 이건 어디서 필요한 거지?, 사용하지 않는 거 같은데 삭제해도 되나?, 짜증 나는데 다 지워버릴까? )
단순히 컴퓨터 몇 대를 관리하는 수준을 벗어난 상황에서 히스토리 관리가 되지 않는다는 것은 담당하는 사람에게는 매우 큰 스트레스로 다가오게 된다.
또한 새로운 서비스를 추가하거나 변경할 때 기존 인프라 환경을 정확히 알 수 없기 때문에 기존 규칙을 계속해서 따라가게 만든다.

4. 동일한 환경 구성의 어려움

운영 환경 ( Production )을 구성하고 나면 반드시 테스트 환경 ( Test ) 이 필요하다.
신규 기능을 추가하거나 기존 버그를 수정하거나 했을 때 반드시 먼저 테스트해 볼 환경이 필요하다.
정확한 테스트를 하기 위해서는 운영 환경과 동일하게 환경을 구성할 필요가 있다.
EC2 서버 1~2대 정도는 가볍게 띄울 수 있더라도 사용하는 서비스가 많아지면 많아질수록 동일한 환경을 구성하기 어렵다.

CDK 를 사용하면 뭐가 좋은가?

CDK = Cloud Development Kit
CDK 는 내부적으로 AWS CLI와 Cloud Formation 을 사용하여 인프라를 코드로 관리할 수 있게 해준다.
CDK 를 사용하면 위에서 언급한 4가지 사례를 쉽게 해결할 수 있다.
1.
웹환경의 변화
Management Console은 웹 환경이기 때문에 변경될 수 있지만, 일반적으로 CDK 의 인터페이스가 변화될 일은 많지 않다.
AWS CDK 의 인터페이스가 변화된 경우 backward compatibility 을 지켜주며, 설령 변경된다고 하더라도 코드에서 일부만 수정하면 된다.
2.
예기치 않은 비용 청구
CDK 로 배포한 경우 삭제 명령어를 통해 배포된 리소스들을 한 번에 깔끔하게 정리해 주기 때문에 불필요한 요금이 청구될 일이 없어진다
3.
관리되지 않은 히스토리
코드로 관리하기 때문에 버전 관리를 하게 되면 변경 이력을 쉽게 확인할 수 있다.
4.
동일한 환경 구성의 어려움
구성한 코드들이 있으면 명령 한 번에 인프라를 프로비저닝 할 수 있기 때문에 손쉽게 동일한 환경을 구성할 수 있다.

CDK 대안은 없는가?

CloudFormation ( cfn )
AWS 리소스들을 JSON 혹은 YAML 파일로 작성할 수 있다.
JSON, YAML 에 모든 리소스를 다 정의해야 하므로 사용하기가 쉽지 않다.
Designer 라는 기능을 지원해주긴 하지만, 코드로 작성하는 것보다는 어렵다 ( 개인적인 차이가 있을 수 있음 )
Serverless 프레임워크는 개인적으로 많이 이용하는 프레임워크이지만, 전체적인 인프라를 관리하는 데는 적합하지 않다.
Terraform
Terraform은 HashiCorp 에서 개발한 도구로 이 분야의 강자이다.
독자적인 HCL 문법을 사용하여 인프라를 리소스를 선언한다.
AWS뿐만 아니라 GCP, Azure, Mongo Atlas 등 다양한 클라우드 프로바이더를 제공한다.
CDK
AWS에서 직접 개발한 도구이며, 다양한 언어 ( Java, Python, TypeScript, C# 등 )으로 제공된다.
TypeScript로 작성하는 경우 타입을 검사를 제공하기 때문에 개발 및 유지 보수에 용이하다.
AWS 변화에 대해 가장 반영이 빠르다.
많은 개발자가 Terraform vs CDK 를 비교한다.
개인적인 의견으로는 둘 다 정말 좋은 도구이며, 상황에 따라 사용하는 게 좋다고 생각한다.
멀티 클라우드를 사용하는 경우 Terraform을 사용하겠지만, 그렇지 않은 경우에는 CDK 를 사용하는게 좋다고 생각한다.

참고