공인교육을 하면서 실습했던 내용을 정리해보았다. 향후 CI/CD를 할 때 유용한 자료가 될 것 같아서 정리한다.
실제 프로젝트에서 서버리스 애플리케이션을 개발하고 자동 배포하는 방법
template.yaml 하나로 인프라 전체를 관리# SAM CLI 설치 (없으면)
pip install aws-sam-cli
# 설치 확인
sam --version
# Docker Desktop도 필요 (로컬 테스트용)
sam init
프롬프트에서 선택:
AWS Quick Start Templatespython3.12 / nodejs20.x 등 원하는 언어my-sam-app/
├── template.yaml # 인프라 정의 (Lambda, API Gateway 등)
├── samconfig.toml # 배포 설정 저장
├── my_function/ # Lambda 함수 코드
│ ├── app.py
│ └── requirements.txt
└── events/
└── event.json # 로컬 테스트용 이벤트
sam build
# 이벤트 파일로 함수 호출
sam local invoke MyFunction --event events/event.json
# 환경변수 전달
sam local invoke MyFunction -e events/event.json --env-vars env.json
# API Gateway 로컬 시뮬레이션
sam local start-api
# 다른 터미널에서 테스트
curl http://localhost:3000/hello
Docker가 실행 중이어야 함
sam deploy --guided
입력 항목:
my-app-prod)ap-northeast-2)YYY ← 다음부터 간편 배포 가능sam deploy
aws cloudformation describe-stacks \
--stack-name <스택이름> \
--query 'Stacks[0].Outputs'
samconfig.toml:
[dev.deploy.parameters]
stack_name = "my-app-dev"
region = "ap-northeast-2"
s3_bucket = "my-artifacts-dev"
[prod.deploy.parameters]
stack_name = "my-app-prod"
region = "ap-northeast-2"
s3_bucket = "my-artifacts-prod"
sam deploy --config-env dev # 개발 환경
sam deploy --config-env prod # 운영 환경
GitHub/CodeCommit → CodePipeline → CodeBuild → CloudFormation → Lambda 배포
프로젝트 루트에 buildspec.yml 생성:
version: 0.2
phases:
install:
runtime-versions:
python: 3.12 # 사용하는 런타임에 맞게
build:
commands:
- sam build
- sam package
--s3-bucket $ARTIFACT_BUCKET
--output-template-file packaged.yaml
artifacts:
files:
- packaged.yaml
aws s3 mb s3://my-sam-artifacts-$(aws sts get-caller-identity --query Account --output text)
소스 단계
| 항목 | 값 |
|---|---|
| Source provider | GitHub 또는 CodeCommit |
| Repository | 본인 리포지토리 |
| Branch | main |
빌드 단계 (CodeBuild)
| 항목 | 값 |
|---|---|
| OS | Ubuntu |
| Runtime | Standard |
| Image | aws/codebuild/standard:7.0 |
| Build spec | Use a buildspec file |
| 환경변수 | ARTIFACT_BUCKET = 위에서 만든 버킷 이름 |
배포 단계 (CloudFormation)
| 항목 | 값 |
|---|---|
| Action mode | Create or replace a change set |
| Stack name | 본인 스택 이름 |
| Change set name | 임의 이름 (예: my-changeset) |
| Template | BuildArtifact / packaged.yaml |
| Capabilities | CAPABILITY_IAM |
배포 실행 액션 추가 (Deploy 단계 하단에 추가)
| 항목 | 값 |
|---|---|
| Action name | ExecuteChangeSet |
| Action provider | CloudFormation |
| Action mode | Execute a change set |
| Stack name | 위와 동일 |
| Change set name | 위와 동일 |
Resources:
MyFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: my_function/
Handler: app.lambda_handler
Runtime: python3.12
AutoPublishAlias: live # 별칭 자동 생성 (필수)
DeploymentPreference:
Type: Linear10PercentEvery1Minute # 배포 전략 선택
| 전략 | 설명 | 추천 상황 |
|---|---|---|
AllAtOnce | 즉시 100% 전환 | 개발 환경 |
Canary10Percent5Minutes | 10% 먼저 → 5분 후 나머지 90% | 빠른 검증 필요 시 |
Linear10PercentEvery1Minute | 1분마다 10%씩 전환 | 운영 환경 안전 배포 |
Linear10PercentEvery10Minutes | 10분마다 10%씩 전환 | 매우 신중한 배포 |
DeploymentPreference:
Type: Canary10Percent5Minutes
Alarms:
- !Ref MyFunctionErrorAlarm # 에러 발생 시 자동 롤백
# 1. 로컬 개발
sam build
sam local start-api # 로컬에서 테스트
# 2. 코드 커밋
git add .
git commit -m "feat: add new endpoint"
git push origin main
# 3. 자동 배포 진행 (CodePipeline이 알아서)
# CodeBuild → sam build + package
# CloudFormation → 스택 업데이트
# CodeDeploy → 블루/그린 트래픽 전환
# 4. 로그 확인
sam logs -n MyFunction --stack-name my-stack --tail
# 스택 삭제
sam delete --stack-name my-stack
# 로그 실시간 확인
sam logs -n MyFunction --stack-name my-stack --tail
# 로컬 빌드 캐시 초기화
sam build --use-container
# 배포 전 변경사항 미리 확인
sam deploy --no-execute-changeset
| 에러 | 원인 | 해결 |
|---|---|---|
Docker not found | Docker 미실행 | Docker Desktop 실행 |
Unable to upload artifact | S3 권한 또는 버킷 없음 | 버킷 생성 및 IAM 권한 확인 |
ROLLBACK_COMPLETE | CloudFormation 배포 실패 | 콘솔 Events 탭에서 에러 확인 |
CAPABILITY_IAM 에러 | IAM 리소스 생성 권한 없음 | --capabilities CAPABILITY_IAM 추가 |