Skip to content

Commit

Permalink
feat: 20250207_AWS ECS _김진우
Browse files Browse the repository at this point in the history
  • Loading branch information
KJU3 authored Feb 2, 2025
1 parent f5566a1 commit cecc212
Showing 1 changed file with 93 additions and 0 deletions.
93 changes: 93 additions & 0 deletions 기술블로그/_posts/2025-02-07-amazon-ecs.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
---
layout: post
title: "Amazon ECS(Elastic Container Service)을 활용한 운영 환경 구성"
author: "김진우"
categories: "백엔드 기술블로그"
banner:
background: "#000"
height: "100vh"
min_height: "38vh"
heading_style: "font-size: 4.25em; font-weight: bold; text-decoration: underline"
tags: ["AWS", "ECS", "ECR", "Docker", "CI/CD", "Jenkins"]
---

# Amazon ECS를 활용한 무중단 배포 파이프라인 구축

저희는 운영 환경에 **Amazon ECS(Amazon Elastic Container Service)**를 도입하여 컨테이너 오케스트레이션을 활용하고 있습니다. 또한, **GitHub와 Jenkins를 연동**하여 CI/CD 파이프라인을 구축함으로써 효율적인 배포 환경을 구성했습니다.

이 글에서는 **GitHub에서 메인 브랜치에 코드가 머지되었을 때 ECS가 최신 이미지를 자동으로 가져와 롤링 업데이트 방식으로 무중단 배포되는 과정**을 설명합니다.

---

## 1. ECS 기반 CI/CD 파이프라인 개요

### 🔹 전체 배포 흐름

1. **GitHub에서 코드가 메인 브랜치에 머지**되면 Jenkins가 파이프라인을 실행합니다.
2. Jenkins에서 **Docker로 애플리케이션을 빌드**합니다.
3. 빌드된 Docker 이미지를 **Amazon Elastic Container Registry(ECR)**에 Push합니다.
4. ECS는 **ECR에 등록된 최신 이미지를 가져와 실행**합니다.
5. **Application Load Balancer(ALB)를 이용해 롤링 업데이트 방식으로 무중단 배포**를 진행합니다.

---

## 2. Jenkins와 ECS를 활용한 배포 과정

### 🏗 1. Docker로 애플리케이션 빌드
```sh
# Jenkins에서 실행될 Docker 빌드 명령어
docker build -t my-app:latest .
```

### 📌 2. ECR에 Docker 이미지 Push
```sh
# AWS ECR 로그인 (Jenkins에서 수행)
aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin <AWS_ACCOUNT_ID>.dkr.ecr.ap-northeast-2.amazonaws.com

# ECR에 태그 및 Push
docker tag my-app:latest <AWS_ACCOUNT_ID>.dkr.ecr.ap-northeast-2.amazonaws.com/my-app:latest
docker push <AWS_ACCOUNT_ID>.dkr.ecr.ap-northeast-2.amazonaws.com/my-app:latest
```

### 🚀 3. ECS에서 최신 이미지 가져오기
ECS 서비스는 태스크 정의(Task Definition)의 컨테이너 이미지를 **ECR에서 가져와 업데이트**합니다.
```sh
aws ecs update-service --cluster my-cluster --service my-service --force-new-deployment
```

### 🔄 4. 롤링 업데이트를 통한 무중단 배포
ECS는 **ALB(Application Load Balancer)**를 활용하여 트래픽을 점진적으로 신규 컨테이너로 전환하는 **롤링 업데이트(Rolling Update)** 방식으로 무중단 배포를 수행합니다.
- 새로운 컨테이너가 실행되면 ALB는 헬스 체크(Health Check)를 수행합니다.
- 정상 상태가 확인되면 기존 컨테이너에서 새로운 컨테이너로 트래픽을 이동합니다.
- 기존 컨테이너는 종료됩니다.

```sh
# ECS 서비스 업데이트
aws ecs update-service --cluster my-cluster --service my-service --desired-count 2
```

---

## 3. ECS CI/CD 파이프라인 구성의 장점

### ✅ 자동화된 배포
GitHub, Jenkins, ECS, ECR을 연동하여 **CI/CD 파이프라인을 구축**함으로써 코드 변경 사항이 자동으로 배포됩니다.

### ✅ 무중단 배포
ALB와 롤링 업데이트를 활용하여 **배포 중에도 애플리케이션이 정상 동작**합니다.

### ✅ 효율적인 리소스 관리
Fargate 기반 ECS를 사용하면 **서버 관리 없이 컨테이너 실행**이 가능하며, EC2 기반 ECS를 사용하면 **비용 최적화 및 유연한 확장**이 가능합니다.

---

## 4. 결론

Amazon ECS와 CI/CD 파이프라인을 활용하면 **자동화된 컨테이너 배포 환경을 구축**할 수 있습니다. 특히 **GitHub, Jenkins, ECR, ECS, ALB를 조합**하면 코드 변경 사항을 신속하고 안전하게 배포할 수 있습니다.

현재 운영 중인 환경에서 **배포 자동화를 고민하고 있다면, 무중단 배포가 가능한 롤링 업데이트 방식의 CI/CD 파이프라인을 구축**하는 것을 추천드립니다.

> **🔎 참고**: Amazon ECS 공식 문서를 확인하려면 [AWS ECS 공식 문서](https://docs.aws.amazon.com/ecs/)를 참고하세요.
---

0 comments on commit cecc212

Please sign in to comment.