개발/infra

[infra/terraform] AWS 자동 배포 과정 정리!

2ivii 2025. 11. 21. 15:43

 

지난 글에서는 AWS 네트워크(ALB, VPC, 서브넷, SG)까지 살펴봤다.
이제 드디어 개발자가 main에 Push → AWS에서 자동으로 배포되는 “전체 자동 배포 파이프라인”을 정리해본다.

내가 이번 프로젝트에서 구축한 방식 그대로이며, 실무에서 가장 많이 쓰는 구조기도 하다.


전체 흐름 요약

개발자가 main에 Push
      ↓
GitHub Actions 실행 (deploy.yml)
      ↓
Docker 이미지 생성
      ↓
ECR에 Push
      ↓
ECS(Fargate) 서비스 업데이트
      ↓
Fargate가 새 컨테이너 실행
      ↓
ALB 헬스체크 → 정상 컨테이너에만 트래픽 연결

이제 단계별로 설명해보자.

개발자가 main에 Push

 

그냥 평소처럼 코드를 작성하고
main 브랜치에 push 한다.

그러면 GitHub Actions가 자동으로 실행된다.

GitHub Actions 실행 (deploy.yml)

 

/.github/workflows/deploy.yml 에서는 배포 전체 로직이 정의된다.

액션이 실행되면 자동으로:

  1. 레포지토리 코드 checkout
  2. AWS IAM credential 로 로그인
  3. Docker build
  4. ECR 로그인
  5. 이미지 push
  6. ECS에게 “새 버전으로 배포해라” 요청

이 과정을 GitHub Actions가 우리 대신 수행해주는 것이다.

Docker 이미지 생성

 

Actions가 서버 환경(ubuntu)에서 다음 명령을 실행한다:

docker build -t {ECR}/gitfit:SHA .
docker tag {ECR}/gitfit:SHA {ECR}/gitfit:latest

 

여기서 중요한 포인트는 이미지에 두 가지 태그가 붙는다는 것.

  • latest → 최신 배포 버전
  • ${GITHUB_SHA} → 특정 커밋 기반 이미지 (정확한 재현 가능)

이건 지난 “태그 전략”에서 설명했듯 실무에서 매우 중요하다.

ECR에 Docker 이미지 Push

 

Docker 이미지를 만들었다면
AWS ECR에 업로드한다:

docker push repo:SHA
docker push repo:latest

이제 AWS는 새 컨테이너 이미지를 보관하고 있는 상태가 된다.

ECS(Fargate) 서비스 업데이트 요청

 

Actions가 다음 명령을 실행한다:

aws ecs update-service --force-new-deployment

이 말은 “ECS야, 새로운 이미지로 다시 배포해!”라고 신호를 보내는 것이다.

그럼 ECS는 다음을 자동으로 수행한다:

  • 새로운 Task Definition 생성
  • Task Definition에 최신 이미지 적용
  • Fargate에 “새 컨테이너 띄워라” 요청
Fargate가 실제 컨테이너 실행

 

Fargate는 “컨테이너 실행 엔진”이다. 새 Task를 실행하기 위해:

  1. ECR에서 최신 이미지 pull
  2. Task Definition의 환경변수(env_vars) 적용
  3. CPU/메모리 할당
  4. Spring Boot 실행 (예: 포트 80으로)
ALB가 헬스체크

 

Fargate가 새 컨테이너를 띄우면
ALB는 계속 헬스체크를 한다.

헬스체크 URL 예:

/actuator/health

상태가 “UP”이면:

  • 요청을 새 컨테이너로 전달
    상태가 “DOWN”이면:
  • 트래픽 전달 X
  • ECS가 자동 복구

이 구조 덕분에 무중단 배포가 이루어진다.

유저는 그냥 API 호출하면 끝

 

이제 /api/... 로 요청이 오면:

사용자 → ALB → Healthy ECS Task → Spring Boot → RDS

이렇게 전체 배포 흐름이 자동으로 완성된다.


마무리

여기까지가 우리가 구축한 전체 배포 파이프라인이다.

✔ GitHub Actions → CI
✔ Docker → 이미지
✔ ECR → 이미지 저장
✔ ECS(Fargate) → 컨테이너 운영
✔ ALB → 트래픽 관리

 

이것을 한번 서비스 아키텍처로 끄적여봤다.

이게 맞을진 모르겠지만,,, 일단 이런 서비스아키텍처로 표현해보면 이렇다!

 

이 모든 것을 코드 한 번으로 만들 수가 있다!! 바로 terraform이다 다음포스팅에서 다뤄보겠다!