[AWS] SAM vs. CloudFormation vs. CDK 비교하기 (언제 어떤 도구를 선택해야 할까?)
AWS 리소스를 정의하고 배포하는 서비스 중에 비슷하면서 헷갈리는게 있다.
그건 바로 다음과 같은 리소스
- CloudFormation
- CDK (Cloud Development Kit)
- SAM (Serverless Application Model)
AWS CloudFormation
AWS 리소스를 코드(YAML 또는 JSON 형식 템플릿)로 정의하고 배포하는 인프라 코드(IaC) 서비스이다.
자세한 내용: https://jibinary.tistory.com/442
AWS SAM (Serverless Application Model)
서버리스(Serverless) 애플리케이션 개발에 특화된 서비스 (CloudFormation과 100% 호환된다)
CloudFormation을 확장하여 서버리스 리소스(예: Lambda, API Gateway, S3 등의)를 간소화한 템플릿으로 정의한다.
자세한 내용: https://jibinary.tistory.com/480
AWS CDK (Cloud Development Kit)
프로그래밍 언어(예: TypeScript, Python, Java, C#, Go 등)를 사용해 인프라를 정의한다. CloudFormation을 생성하는 고급 레벨의 추상화 도구.
자세한 내용: https://jibinary.tistory.com/494
언제 어떤 도구를 선택해야 할까?
서버리스 애플리케이션 개발 | SAM | Lambda, API Gateway 등에 최적화된 간단한 템플릿. 로컬 테스트 지원. |
모든 AWS 리소스를 선언적으로 관리해야 하는 경우 | CloudFormation | 선언적 템플릿으로 안정적이고 표준화된 방식으로 모든 AWS 리소스를 지원. |
프로그래밍 로직과 동적 리소스 정의가 필요한 경우 | CDK | 프로그래밍 언어를 사용해 동적으로 복잡한 인프라를 생성 및 관리. |
기존 애플리케이션과 인프라를 하나의 언어로 통합 | CDK | 애플리케이션 로직과 인프라 코드를 동일한 언어로 정의 가능. |
단순히 리소스 템플릿을 생성하고 배포하려는 경우 | CloudFormation | YAML/JSON 기반의 선언적 템플릿으로 빠르고 직관적인 설정 가능. |
서버리스 애플리케이션을 개발하면서 CI/CD를 통합 | SAM | 서버리스 리소스에 최적화된 배포 및 테스트 도구 제공. |
결론
SAM(Serverless Application Model): 서버리스 애플리케이션 개발 및 로컬 테스트에 적합.
CloudFormation: 모든 AWS 리소스의 선언적 관리 및 배포에 적합.
CDK(Cloud Development Kit): 동적인 프로그래밍 언어를 활용한 리소스 정의와 코드 재사용이 필요한 경우 적합.
🤔 문제
AWS Cloud Development Kit(AWS CDK)를 사용해 서버리스 애플리케이션을 구현 중인 한 개발자가 있습니다. 이 개발자는 AWS Lambda 함수와 Amazon API Gateway API를 여러 개 프로비저닝하며, AWS CloudFormation 스택 생성 과정에서 이를 설정할 예정입니다.
개발자의 워크스테이션에는 AWS Serverless Application Model(AWS SAM)과 AWS CDK가 로컬에 설치되어 있습니다.
개발자가 특정 Lambda 함수를 로컬에서 테스트하려면 어떻게 해야 하나요?
- sam package와 sam deploy 명령을 실행합니다. AWS Management Console에서 Lambda 테스트 이벤트를 생성한 뒤, Lambda 함수를 테스트합니다.
- cdk synth와 cdk deploy 명령을 실행합니다. AWS Management Console에서 Lambda 테스트 이벤트를 생성한 뒤, Lambda 함수를 테스트합니다.
- cdk synth와 sam local invoke 명령을 실행하며, 함수 구성 식별자와 생성된 CloudFormation 템플릿 경로를 사용합니다.
- cdk synth와 sam local start-lambda 명령을 실행하며, 함수 구성 식별자와 생성된 CloudFormation 템플릿 경로를 사용합니다.
정답
정답. 3번
cdk synth
AWS CDK 애플리케이션에서 작성한 코드를 CloudFormation 템플릿(YAML 형식)으로 변환한다.
cdk deploy
cdk synth
로 생성된 CloudFormation 템플릿을 AWS에 직접 배포한다.
sam package
로컬에서 작성된 AWS SAM 템플릿을 AWS에 배포할 수 있도록 패키징한다.
sam deploy
sam package
명령으로 생성된 패키지 템플릿을 사용해 리소스를 AWS에 배포한다.
sam local invoke
로컬에서 특정 Lambda 함수를 테스트한다.
예시: sam local invoke MyFunction --event event.json
1번, 2번. (오답) 로컬이 아니기 때문에 오답