diff --git "a/\352\270\260\354\210\240\353\270\224\353\241\234\352\267\270/_posts/2025-02-07-amazon-ecs.md" "b/\352\270\260\354\210\240\353\270\224\353\241\234\352\267\270/_posts/2025-02-07-amazon-ecs.md" new file mode 100644 index 0000000..bafb1ee --- /dev/null +++ "b/\352\270\260\354\210\240\353\270\224\353\241\234\352\267\270/_posts/2025-02-07-amazon-ecs.md" @@ -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 .dkr.ecr.ap-northeast-2.amazonaws.com + +# ECR에 태그 및 Push +docker tag my-app:latest .dkr.ecr.ap-northeast-2.amazonaws.com/my-app:latest +docker push .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/)를 참고하세요. + +--- +