AWS Cloud School 13기 75일차(LAB 4)

Forever 김·2026년 4월 16일

AWS Cloud School

목록 보기
70/97

공인교육을 하면서 실습했던 내용을 정리해보았다. 향후 CI/CD를 할 때 유용한 자료가 될 것 같아서 정리한다.

AWS SAM + CI/CD 파이프라인 실전 가이드

실제 프로젝트에서 서버리스 애플리케이션을 개발하고 자동 배포하는 방법


📌 이 가이드는 언제 사용하나요?

  • Lambda 함수 기반 API를 만들 때
  • 서버리스 앱을 로컬에서 테스트하고 싶을 때
  • Git push만으로 자동 배포하고 싶을 때
  • 무중단 배포(블루/그린)가 필요할 때

1. AWS SAM으로 서버리스 프로젝트 시작하기

SAM이란?

  • Lambda + API Gateway + DynamoDB 등을 코드로 정의하고 배포하는 프레임워크
  • CloudFormation의 서버리스 특화 버전
  • template.yaml 하나로 인프라 전체를 관리

사전 준비

# SAM CLI 설치 (없으면)
pip install aws-sam-cli

# 설치 확인
sam --version

# Docker Desktop도 필요 (로컬 테스트용)

새 프로젝트 생성

sam init

프롬프트에서 선택:

  • Template: AWS Quick Start Templates
  • Runtime: python3.12 / nodejs20.x 등 원하는 언어
  • Project name: 본인 프로젝트명

프로젝트 구조

my-sam-app/
├── template.yaml          # 인프라 정의 (Lambda, API Gateway 등)
├── samconfig.toml         # 배포 설정 저장
├── my_function/           # Lambda 함수 코드
│   ├── app.py
│   └── requirements.txt
└── events/
    └── event.json         # 로컬 테스트용 이벤트

2. 로컬에서 개발 및 테스트

빌드

sam build

Lambda 함수 단독 테스트

# 이벤트 파일로 함수 호출
sam local invoke MyFunction --event events/event.json

# 환경변수 전달
sam local invoke MyFunction -e events/event.json --env-vars env.json

로컬 API 서버 실행

# API Gateway 로컬 시뮬레이션
sam local start-api

# 다른 터미널에서 테스트
curl http://localhost:3000/hello

Docker가 실행 중이어야 함


3. AWS에 배포하기

첫 배포 (설정 포함)

sam deploy --guided

입력 항목:

  • Stack Name: 원하는 이름 (예: my-app-prod)
  • AWS Region: 배포할 리전 (예: ap-northeast-2)
  • Confirm changes before deploy: Y
  • Allow SAM CLI IAM role creation: Y
  • Save arguments to samconfig.toml: Y ← 다음부터 간편 배포 가능

이후 배포 (설정 저장 후)

sam deploy

배포된 API URL 확인

aws cloudformation describe-stacks \
  --stack-name <스택이름> \
  --query 'Stacks[0].Outputs'

환경별 배포 (dev/prod 분리)

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  # 운영 환경

4. CI/CD 파이프라인 구축 (Git push → 자동 배포)

전체 흐름

GitHub/CodeCommit → CodePipeline → CodeBuild → CloudFormation → Lambda 배포

Step 1: buildspec.yml 작성

프로젝트 루트에 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

Step 2: 아티팩트용 S3 버킷 생성

aws s3 mb s3://my-sam-artifacts-$(aws sts get-caller-identity --query Account --output text)

Step 3: CodePipeline 생성 (콘솔)

소스 단계
| 항목 | 값 |
|---|---|
| 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 | 위와 동일 |


5. 블루/그린 무중단 배포 설정

template.yaml에 배포 전략 추가

Resources:
  MyFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: my_function/
      Handler: app.lambda_handler
      Runtime: python3.12
      AutoPublishAlias: live          # 별칭 자동 생성 (필수)
      DeploymentPreference:
        Type: Linear10PercentEvery1Minute  # 배포 전략 선택

배포 전략 옵션

전략설명추천 상황
AllAtOnce즉시 100% 전환개발 환경
Canary10Percent5Minutes10% 먼저 → 5분 후 나머지 90%빠른 검증 필요 시
Linear10PercentEvery1Minute1분마다 10%씩 전환운영 환경 안전 배포
Linear10PercentEvery10Minutes10분마다 10%씩 전환매우 신중한 배포

자동 롤백 설정 (선택)

DeploymentPreference:
  Type: Canary10Percent5Minutes
  Alarms:
    - !Ref MyFunctionErrorAlarm  # 에러 발생 시 자동 롤백

6. 실전 워크플로우 요약

# 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

7. 유용한 명령어 모음

# 스택 삭제
sam delete --stack-name my-stack

# 로그 실시간 확인
sam logs -n MyFunction --stack-name my-stack --tail

# 로컬 빌드 캐시 초기화
sam build --use-container

# 배포 전 변경사항 미리 확인
sam deploy --no-execute-changeset

8. 트러블슈팅

에러원인해결
Docker not foundDocker 미실행Docker Desktop 실행
Unable to upload artifactS3 권한 또는 버킷 없음버킷 생성 및 IAM 권한 확인
ROLLBACK_COMPLETECloudFormation 배포 실패콘솔 Events 탭에서 에러 확인
CAPABILITY_IAM 에러IAM 리소스 생성 권한 없음--capabilities CAPABILITY_IAM 추가

참고 자료

profile
나를 한줄로

0개의 댓글