AWS CDK는 클라우드 인프라를 코드로 정의할 수 있도록 만든(IaC) 오픈소스 소프트웨어 개발 프레임워크로 AWS에서 2019년 7월에 공개하였습니다. 공식 사이트(https://aws.amazon.com/cdk/)에서는 AWS CDK를 "익숙 프로그래밍 언어를 사용하여 클라우드 애플리케이션 리소스를 정의할 수 있는 오픈 소스 소프트웨어 개발 프레임워크"로 정의하고 있습니다. 기존의 IaC(Infra as Code)에 대비하여 CDK의 특징을 기존의 익숙한 프로그래밍 언어를 이용하여 검증된 기본값으로 클라우드 리소스의 구성요소로써의 구문을 제공하고 이로인해 전문가가 아니어도 클라우드애플리케이션을 빠르고 쉽게 그리고 안전하고 반복 가능한 방식으로 구성하여 개발을 시작할 수 있다고 이야기합니다.
저의 경우를 생각해보면 Public Cloud를 이용한 서비스개발에서의 인프라 관리는 아래의 과정을 지나오게 되었던 것 같습니다.
a. Console을 통한 서비스 인프라 배포/관리
AWS를 사용해서 실제 개발이나 핸즈온을 통해 인프라를 구성하고 아키텍처대로 배포하는 과정을 AWS Console상에서 마우스 클릭을 통해 진행을 해보면 '과연 이런 과정을 통해 복잡한 시스템을 구성할 수 있을가?'하는 의문을 가지게 됩니다. 그리고 같은 인프라 요소를 반복적으로 구축해야하거나 전체 인프라를 여러 사이트에 재구축해야할 때 불편함을 느끼게 됩니다.
b. CLI Command의 사용
그래서 클릭&클릭하는 방식으로의 한계를 느끼고 명령줄 인터페이스(CLI)로 인프라를 구성하고자 AWS CLI를 사용하여 서비스를 하나씩 배포해보고 일련의 명령줄을 모아 스크립트로 만들어 관리합니다. 그러나 오류발생시 재시도나 동시작업에서의 경쟁조건 처리에든 대응하기 어려운 문제들이 있습니다.
c. IaC로의 관심
Code로 서비스 인프라를 관리할 수 있는 도구인 AWS CloudFormation이나 좀 더 나아가서는 Hashicorp의 Terraform을 익혀 인프라의 구성요소를 이에 따른 형식으로 기술하여 관리하기도 합니다.
하지만 기존에 이와같은 IaC로 작업된 코드를 보거나 옆에서 작업의 과정을 지켜보면 조금 막막했습니다. 초심자가 보기에 기존의 IaC의 Json이나 Yaml의 형식은 반복적인 텍스트의 나열처럼 보였고, 시스템의 규모가 조금만 커져도 코드의 규모나 파일 수가 너무 커져 관리하기 힘들어 보였습니다.d. CDK, 진정한 코드형 인프라 개발 프레임워크
IaC는 저의 길이 아닌 것 같다라고 생각하고 있던 때에 CDK를 알게 되었습니다. 프로그래밍 언어로 작성되고, 수십년간 발전된 Software개발 스킬을 적용해 다양하게 확장 가능한 점이 Software개발을 오래 해왔던 저의 이목을 끌었고 서비스 인프라 구성과 관리도 이를 통해 익히면 좀 더 효율적으로 다가갈 수 있을거란 생각을 했습니다. 그리고 이 생각은 CDK를 이용해 API서비스 개발 프로젝트를 마친 지금은 더욱 확고해졌습니다. 아래에 기존 IaC의 대표격인 Terraform과의 비교내용을 표로 붙입니다.
Terraform | CDK | |
---|---|---|
프로그래밍 기술 | Yaml 혹은 HCL로 구현, 기존과 다른 새로운 언어를 익혀야함, 심플하나 완벽한 OOP언어가 아니므로 확장성면에서의 제약이 있음, 보조툴을 설치하여 자동완성에 대한 기능을 사용가능하나 완벽하지 않음, 컴파일 에러등으로 사전확인 등 안전한 구현이 힘듬 | 5가지의 기존 프로그래밍 언어를 이용(확장중), OOP를 이용하여 다양하게 확장가능, Pattern을 이용해여 유연한 구조 및 재사용성 제고가능, 작성자의 프로그래밍 능력에 의해 무한한 확장 가능성 을 가짐, IDE를 통한 자동완성, 컴파일 에러를 통해 안전한 구현 |
인프라구성의 워크로드 | IaaS부터의 접근방식으로 이러한 인프라 구성 관련한 레퍼런스가 많음 | IaaS보다는 Container/Serverless에 최신 기술들이 접목 되어 최적의 시너지를 발휘할 수 있음. IaaS도 완벽히 지원, |
Public Cloud 지원 | Public Cloud를 다양하게 지원 | AWS에 특화 된 IaC, CDK for Terraform 과 CDK8S 와 같은 생태계가 만들어 지고 있기 때문에 성장가능성 높음. |
라이센스, 기술성숙도 및 배포안정성 | 특정기능 이상 엔트프라이즈 계약 필요, SDK로 직접 배포하기 때문에 배포의 안정성이 조금 떨어질수 있음 | CloudFormation, ParameterStore등을 무료로 사용가능, 배포의 백엔드로 CloudFormation을 사용 하여 성숙된 배포완성도를 가짐 |
위와 같은 고민들을 가지고 있는 개발자라면 서비스 인프라 설계 및 관리를 하는 도구로 CDK를 고려해볼수 있습니다.
소프트웨어 개발 언어로 작성되어 클라우드 인프라를 재사용 가능한 컴포넌트로 모델링할 수 있습니다. 현재는 5가지 개발언어(Typescript, Javascript, Python, Java, C#)을 지원을 하고 있습니다. CDK의 동작과정을 보면 작성된 CDK Application이 CDK CLI로 실행되어 CloudFormation Template으로 합성되어 AWS CloudFormation을 통해 배포되는 과정을 거치는데, 이를 소프트웨어 동작과정에 비추어보면 각각 Source가 Compiler를 통해 Assembly language로 변환되어 Processor를 통해 실행되는 것으로 생각하면 이해에 도움이 될수 있습니다.
Amazon 공식 문서가 잘 되어있기 때문에 해당 문서를 참조하면 어렵지않게 접근할 수 있습니다. Developer Guide를 참조하면 되고 실제 개발하면서 API들의 상세 스펙은 API Reference를 참고하면 됩니다. CDK의 API는 경우 AWS의 서비스들이 추상화가 잘 되어있기 때문에 AWS 서비스들을 학습하는 방법으로 CDK의 API Reference를 참고하는 방법도 좋은 접근이라고 생각이 됩니다. 그리고 처음 사용하는 사용자들을 위한 핸즈온 랩을 CDK Workshop 페이지를 통해 제공하고 있습니다.
cdk는 node를 이용해 구현되어 있습니다. 따라서 어떤 프로그래밍 언어를 이용해 개발을 진행하시더라도 node는 기본적으로 설치되어있어야 합니다. node가 설치된 환경에서 npm을 이용해 aws-cdk를 설치합니다. 이후 'cdk init'을 통해 프로젝트를 초기화 한 후 'npm install'을 통해 필요한 node library들을 설치합니다. cdk개발을 위한 준비는 완료되었고 이제는 코딩을 통한 cdk개발을 진행하고 stack을 개발하면서 'cdk list'를 통해 코드의 에러가 없는지 확인하고 배포할 준비가 되면 'cdk deploy'를 통해 설정된 AWS계정에 배포를 진행하면됩니다. 개발 및 디버그를 진행하면서 'list', 'diff', 'synth'등을 이용하게 되고 확인된 코드에 대해서 배포를 진행 시에 'cdk deploy'를 반복적으로 이용하게됩니다. 최종적으로 서비스가 종료되었거나 인프라 삭제가 필요한 경우 'cdk destroy'로 설치된 애플리케이션과 인프라를 깔끔하게 삭제할 수 있습니다.
npm install -g aws-cdk
cdk version
mkdir hello-cdk
cd hello-cdk
cdk init --language [typescript/javascript/python/java/csharp]
npm install
cdk bootstrap # AWS 환경에 CDK Toolkit을 위한 스택을 배포
cdk init # 사용자가 선택한 언어로 새로운 기본 애플리케이션을 초기화
cdk diff # 로컬 AWS CDK코드와 AWS에서 실행되는 애플리케이션간 차이점을 확인
cdk synth # AWS CDK 애플리케이션을 AWS CloudFormation 템플릿으로 컴파일
cdk deploy # AWS CDK 애플리케이션을 설정된 AWS계정에 배포
cdk destory # 배포된 CDK 애플리케이션을 삭제
이번글에서는 소개정도로 남기고 좀 더 자세한 개발방법은 다음번에 CDK로 개발을 하기 위한 자세한 글을 계획하고 있습니다.
좀 더 테스트를 해보고 싶은 신 분들은 위의 참조 링크등을 활용하시고 CDK Workshop 페이지의 핸즈온랩을 한번 진행해보시면 이해에 도움이 되실 것 같습니다.
CDK는 AWS의 리소스들을 고수준의 Component로 추상화한 Constructs들을 이용하여 개발을 하게 됩니다. 이 Construct들을 참조하는 것만으로도 AWS 서비스의 베스트 사례에서 사용되는 기본설정들을 사용할 수 있고 나아가 API 문서들을 이해하는 것만으로 각각의 서비스에 대해 깊이 이해할 수 있습니다.
[AWS CDK Construct]
AWS CDK 공식페이지에서는 cdk를 이용하여 개발할때의 장점을 아래와 같이 4가지로 나누어 이야기하고 있습니다.
- Eaeier cloud onboarding
AWS 사용이 익숙하지 않을 경우에도 Cloud로의 온보딩을 가속화할 수 있습니다. cdk의 API는 AWS의 리소스들을 고수준의 component로 추상화하였고 최적의 기본 설정값들로 초기설정 되어있기 때문에 전문가없이도 적절한 시스템을 구성할 수 있습니다.
- Faster development process
프로그래밍 언어의 특성을 이용해 인프라를 정의하므로 OOP, 루프, 조건문등의 로직을 어떻게 구성하느냐에 따라 효율적이고 빠른 개발이 가능합니다.
- Customizable and shareable
각각의 요구조건에 맞는 재사용 가능한 Component들로 설계가 가능하고 라이브러리화된 컴포넌트의 쉬운 공유를 통해 보안, 규정, 요구사항 준수등의 빠른 확장이 가능합니다.
- No Context switching
코드의 개발과 배포가 개발환경에 있는 IDE에서 모두 가능하므로 개발자는 별도의 개발환경 변경이나 설정없이 애플리케이션 개발과 인프라 관리를 할 수 있습니다.
반복적으로 많이 사용될만한 구성들을 정리하여 패턴화한 구조들이 있는데 이를 Solution화 하여 CDK의 Constructs로 만들어 놓았습니다. AWS Solutions Constructs 페이지에서 확인할 수 있고 이를 가져다 사용하거나 참조해서 개발하는 시스템 구성에 재사용하면 원하는 서비스 설계를 보다 빠르게 구성할 수 있습니다.
CDK는 AWS상에서의 개발에서는 더 없이 좋은 선택이고 특히 서버리스 구조의 설계시에 큰 장점을 갖습니다. 하지만 다른 퍼블릭 클라우드를 사용하거나, On-Prem이나 IaaS 위주의 Kubernetes클러스터를 직접 구축하는 방식에서는 사용할 수 없는 것 아니냐 하는 생각이 들수 있습니다. 이런 점들을 해소하기 위해 CDK장점을 다른 플랫폼에 연계해서 사용할 수 있는 방식이나 Kubernetes 설계를 cdk로 할 수 있게 하는 프로젝트들이 타 플랫폼이나 CNCF와 함께 진행중에 있습니다.
Terraform을 이용하여 인프라를 정의하고 프로비전하기 위한 툴로 CDK를 지원하기 시작했습니다.
[Terraform Providers]
(https://www.hashicorp.com/blog/cdk-for-terraform-enabling-python-and-typescript-support/)
(https://www.hashicorp.com/blog/announcing-cdk-for-terraform-0-1)
CDK8s(CDK for Kubernetes)를 이용하여 쿠버네티스 애플리케이션을 정의하고 관리할 수 있습니다. CDK8s는 현재 CNCF의 Sandbox Project로 등록되어있습니다.
(https://aws.amazon.com/ko/blogs/korea/using-cdk8s-for-kubernetes-applications/)
(https://aws.amazon.com/blogs/containers/introducing-cdk-for-kubernetes/)
이번 글에서는 CDK를 소개하고 어떤 식으로 개발이 진행되는지 간단히 개발 플로우를 설명했습니다. 다음 글에서는 CDK를 개발을 진행하는 방법을 좀 더 자세히 설명하는 글을 계획하고 있습니다. 제가 속한 팀에서는 Vision AI관련 API를 서비스하는 시스템을 AWS CDK를 사용해서 개발하고 있습니다. 다음에는 개발 진행 중에 관련된 팁이나 개발기 등을 블로그에 공유할 수 있도록 하겠습니다. 감사합니다.