[reinvent 2024] AWS CloudFormation, Terraform, AWS CDK 중에서 선택하는 방법
Summary
Terraform, CloudFormation, CDK는 AWS 인프라 관리에서 각기 다른 강점을 가진 도구들로 많은 관심을 받고 있습니다. 이번 세션에서는 세 도구를 활용한 라이브 코딩과 다양한 시나리오를 통해 실무에 적합한 활용 방안을 모색합니다. 이를 통해 프로젝트에 가장 적합한 도구를 선택할 수 있는 기회를 얻어가세요!
리인벤트 2024 테크 블로그의 더 많은 글이 보고 싶다면?
Overview
들어가며
코드형 인프라(Infrastructure as Code)의 중요성과 필요성은 클라우드 컴퓨팅이 보편화되면서 더욱 커지고 있습니다. 저는 실무에서 AWS CDK와 CloudFormation을 사용하여 인프라를 관리중인 프로젝트를 소유하고 있으며, 이 과정에서 효율적인 인프라 관리를 위한 도구 선택의 중요성을 느껴왔습니다. 특히, CloudFormation, Terraform, AWS CDK와 같은 다양한 도구들이 제공하는 기능과 그 차이를 명확히 이해하지 못한 채 사용하는 경우가 많았습니다. 이 세션을 신청한 이유는 이러한 도구들을 비교, 분석하고 실무에서 적합한 도구를 선택할 수 있는 기준을 확립하고 싶어 신청하게되었습니다. 이 과정에서 발생할 수 있는 문제점과 그 해결 방안에 대해서도 깊이 이해하고자하여 신청하게 되었습니다.
코드형 인프라의 발전
코드형 인프라(IaC)는 시스템 자원을 코드로 정의하여 자동화된 방식으로 배포, 관리, 변경할 수 있도록 구성되어 있습니다. 이는 서버, 네트워크, 스토리지 등을 포함한 모든 인프라를 관리하는 데 있어 수동 작업의 비효율성을 극복하고 일관성과 신뢰성을 제공합니다.
IaC의 발전은 2011년 AWS CloudFormation의 출시로 본격화되었습니다. 초기에는 Bash 스크립트로 수동 작업을 자동화하려는 시도가 많았지만, CloudFormation은 선언형 방식으로 인프라를 구성하고 관리하는 새로운 방식을 제공하였습니다. 이후 등장한 Terraform은 멀티 클라우드 환경을 지원하며, 인프라 관리의 범위를 확장하였습니다. 최근 AWS CDK는 프로그래밍 언어를 활용하여 IaC를 정의할 수 있는 기능을 제공하며, 개발자 친화적인 접근 방식을 도입하였습니다.
이처럼 IaC는 클라우드 네이티브 환경에서 빠른 배포와 지속적인 업데이트를 가능하게 하며, DevOps 문화의 핵심 요소로 자리 잡고 있습니다.
AWS CloudFormation, Terraform, AWS CDK 도구 비교
AWS CloudFormation
CloudFormation은 AWS 서비스 전용 IaC 도구로, YAML이나 JSON 형식을 사용하여 AWS 자원을 정의합니다. 이 도구는 AWS와의 완벽한 호환성과 AWS 리소스 관리에 특화된 기능으로, AWS 리소스 변경내역을 추적할 수 있는 “Stack”이라는 개념을 도입하여 버전 관리와 롤백이 용이하도록 구성되었습니다. 반면, 멀티 클라우드 지원이 불가하며, JSON/YAML의 복잡한 문법이 많은 사용자들에게 진입 장벽으로 다가올 수 있습니다.
Terraform
Terraform은 멀리 클라우드 지원이 가능한 대표적인 IaC 도구로, AWS, Azure, Google Cloud 등 다양한 클라우드 환경에서 사용됩니다. 특히, 상태 파일(state file)을 활용하여 리소스의 현재 상태를 추적하고, 변경 사항만 반영하는 효율적인 업데이트를 제공합니다. 반면, 외부 모듈 및 플러그인에 대한 의존성이 높은 경우 관리 복잡성이 증가하는 단점을 지니고 있습니다.
AWS CDK
AWS CDK는 TypeScript, Python, Java 등 프로그래밍 언어를 사용하여 IaC를 작성할 수 있는 도구입니다. 기존 개발 언어와 친화성이 높아 복잡한 로직을 쉽게 구현할 수 있고, 코드 재사용성을 높일 수 있습니다. 반면, AWS 중심으로 설계된 도구이므로 멀티 클라우드 환경에서는 사용이 제한적일 수 있습니다. 또한, 프로그래밍 언어에 익숙하지 않은 사용자는 진입 장벽이 높게 느껴질 수 있습니다.
AWS CloudFormation, Terraform, AWS CDK 구현 방식
L1 구현 방식
모든 도구에서 L1(기본 수준) 구현은 유사한 방식으로 시작됩니다.
- Terraform : 프로젝트의 기본 구성 요소로 프로바이더와 스택 이름을 정의하고, 이어서 VPC, 서브넷 등의 네트워크 리소스를 설정합니다.
- CloudFormation : 템플릿 YAML 파일을 작성하여 VPC, 서브넷, 라우팅 테이블 등 리소스를 명시적으로 정의하며, 일반적으로 약 180줄 이상의 코드가 요구되며 세부적인 설정 값을 직접 입력합니다.
- AWS CDK : AWS SDK 호출과 유사한 방식으로 각 리소스를 상세히 정의해야 하며, 상대적으로 더 많은 코드 작성이 필요합니다.
L2 구현 방식
L2(모듈 수준) 구현에서는 각 도구의 고유 기능을 활용하여 반복 작업을 단순화하고 효율성을 높입니다.
- Terraform : 모듈을 사용해 반복적인 코드 패턴을 줄이고, GitHub와 같은 중앙관리 저장소에서 자원을 공유합니다. 이러한 방식은 팀 단위로 협업하거나 여러 프로젝트에서 동일한 아키텍처를 사용할 때 유용합니다.
- CloudFormation : Scepter라는 도구를 활용하면 템플릿을 S3 버킷에 저장하고 관리할 수 있습니다. 이를 통해 프로젝트 구조를 체계화하고 템플릿 버전 관리가 용이합니다.
- AWS CDK : AWS에서 제공하는 구성 요소(construct)를 사용하여 인프라 리소스를 추상화된 방식으로 정의할 수 있습니다. 예를들어, VPC 구성 시 단순한 코드 몇 줄로 여러 서브넷과 보안그룹을 포함한 네트워크 설정을 자동 생성할 수 있습니다.
L3 구현 방식
L3(고급 수준) 구현은 보다 복잡하고 포괄적인 아키텍처를 다루며, 도구의 고급 기능을 활용해 생산성을 극대화합니다.
- Terraform : 스택 모듈을 사용해 특정 VPC 뿐만 아니라, 멀티 리전 환경이나 상호 연결된 리소스를 관리할 수 있습니다. 이러한 방식은 대규모 인프라를 관리하는데 적합합니다.
- CloudFormation : 다양한 AWS 서비스와의 통합 작업이 가능하며, 복잡한 워크플로우를 지원합니다. 예를 들어, Lambda 함수와 함께 CloudFormation 템플릿을 사용하여 서버리스 아키텍처를 쉽게 배포할 수 있습니다.
- AWS CDK : Pattern을 통해 자주 사용되는 아키텍처를 간소화할 수 있습니다. 예를 들어, 특정 애플리케이션 유형에 최적화된 설정을 포함하는 패턴을 사용해 빠르게 애플리케이션 환경을 구축할 수 있습니다.
도구 선택 중요성
L1 수준의 사용은 복잡성과 생산성 측면에서 비효율적일 수 있으므로, 가능한 한 L2 또는 L3 수준으로 구현을 발전시키는 것이 바람직합니다. 또한, IaC 도구를 선택할 때는 팀의 기술 스택, 프로젝트의 요구사항, 확장 가능성을 종합적으로 고려해야 합니다. 예를 들어, CloudFormation이나 CDK는 AWS 환경에서 최적화된 선택이지만, 멀티 클라우드 환경에서는 Terraform이 더 적합할 수 있습니다. CDK는 코드 기반의 장점을 살려 복잡한 인프라를 효율적으로 관리할 수 있지만, 초기 학습이나 진입 장벽이 조금 높을 수 있음을 고려해야 합니다.
Anti-Patterns
코드형 인프라 도구를 사용하는 과정에서 발생할 수 있는 주요 안티 패턴은 다음과 같습니다.
- 전문가 의존 : 특정 전문가에게만 의존하면 지식이 독점되어 팀 전체 효율성이 떨어질 수 있습니다.
- 팬 기반 선택 : 개인의 선호도로 도구를 선택하면 실제 요구사항에 부합하지 않을 수 있으므로 도구 선택은 팀의 필요에 기반되어야 합니다.
- API/GUI 제한 : 엔지니어가 테스트나 문제 해결을 위한 API/GUI 접근이 제한되면 업무가 비효율적이므로 테스트 환경을 충분히 제공해야합니다.
- 과잉 설계 : 너무 복잡하게 설계하면 유지보수가 어려우므로 단순하고 필요한 만큼 설계해야 합니다.
- 리스크 집중 : 한 도구에만 의존하면 변화에 취약하므로 다양한 도구를 조합하여 리스크를 분산해야 합니다.
- 인적 노력 무시 : 도구 도입 시 팀원의 학습 역량을 고려하지 않으면 생산성이 떨어질 수 있으므로 충분한 교육과 지원이 필요합니다.
- 지식 격차 과소 평가 : 지식 격차를 무시하면 협업이 어려워지므로 지식 공유와 교육을 통해 팀의 역량을 균일화해야 합니다.
어떠한 IaC 도구이든 최대한 단순하게 구성하여 재사용 가능한 템플릿과 모듈을 활용하고, 지식을 지속적으로 공유하여 팀 전체가 기여하고 유지할 수 있는 환경을 조성하는 것이 안티 패턴을 해결하는데 가장 좋은 방안입니다.
결론
이번 세션을 통해 코드형 인프라의 발전과 AWS CloudFormation, Terraform, AWS CDK의 특성을 상세히 배울 수 있었습니다. 특히, 각 도구의 장단점을 비교하며 단순히 “어떤 도구가 더 좋을까?”를 논하기보다, 실무 환경과 요구사항에 맞는 도구를 선택하는 것이 중요하다는 점을 인식하게 되었습니다.
개인적으로 Terraform의 멀티 클라우드 지원이 매력적으로 느껴졌지만, AWS 환경에 한정된 작업에서는 CloudFormation의 안정성과 AWS CDK의 유연성이 더 적합할 수 있음을 깨달았습니다. 또한, 안티 패턴 사례를 통해 기존 작업 방식을 되돌아보고, 더 나은 방법론을 고민할 기회가 되었습니다.
이번 세션은 코드형 인프라의 중요성과 도구 선택의 기준을 명확히 세우는 데 큰 도움을 받아, 앞으로 이러한 경험을 기반으로 실무에 적극 반영하여 효율적인 인프라 관리 방안을 설계하고, 팀 내에서도 올바른 도구 선택과 활용법을 제안할 수 있을 것 같습니다.