
AWS에 ECS로 배포하기의 마지막 포스팅인
Github Actions를 활용한 ECS
CI/CD
배포에 관해 알아보려 한다.
name: CI-CD PortNumber Back-End Service
on:
push:
branches:
- BE
jobs:
deploy:
runs-on: ubuntu-latest
env:
AWS_REGION: ap-northeast-2
ECS_CLUSTER_NAME: {ECS 클러스터 이름}
ECR_REPOSITORY_NAME: {ECS 레포지토리 이름}
ECS_SERVICE_NAME: {ECS 서비스 이름}
ECS_CONTAINER_NAME: {ECS 컨테이너 이름}
TASK_DEFINITION_NAME: {테스크 이름}
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Configure AWS credentials For Devzone
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.ACCESS_KEY }}
aws-secret-access-key: ${{ secrets.SECRET_KEY }}
aws-region: ap-northeast-2
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1
- name: Cache Gradle dependencies
uses: actions/cache@v2
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
gradle-
- name: Install JDK 17
uses: actions/setup-java@v2
with:
java-version: '17'
distribution: 'temurin'
- name: Grant execute permission for gradlew
run: chmod +x ./gradlew
- name: Create application.yml
run: |
mkdir -p ./src/main/resources # 디렉토리 생성
echo "${{ secrets.APPLICATION_YML }}" > ./src/main/resources/application.yml
- name: Project build
env:
jasypt.encryptor.password: ${{ secrets.JASYPT_PASSWORD }}
run: ./gradlew clean build -x test
shell: bash
- name: Build, tag, and push image to Amazon ECR
id: build-image
env:
ECR_REGISTRY: ${{ secrets.ECR_REGISTRY }}
SERVICE_TAG: . # Dockerfile의 경로
IMAGE_TAG: latest
run: |
# Build a docker container and
# push it to ECR so that it can
# be deployed to ECS
docker build --build-arg JASYPT_ENCRYPTOR_PASSWORD=${{ secrets.JASYPT_PASSWORD }} -t $ECR_REGISTRY/$ECR_REPOSITORY_NAME:$IMAGE_TAG $SERVICE_TAG
docker push $ECR_REGISTRY/$ECR_REPOSITORY_NAME:$IMAGE_TAG
echo "::set-output name=image::$ECR_REGISTRY/$ECR_REPOSITORY_NAME:$IMAGE_TAG"
- name: Deploy to ECS
run: |
aws ecs update-service --cluster $ECS_CLUSTER_NAME --service $ECS_SERVICE_NAME --force-new-deployment
위에서 부터 천천히 살펴보자.(Github Actions에 관한 것보다 ECS와 Github Actions 간의 연동이 중요하므로, 그 부분 설명)
1. Deploy
Job 바로 아래에 있는 env
블럭: 우리가 설정했던 ECS, ECR의 정보를 환경변수로 담아야 한다.
- ECS 리포지토리 경로 : Amazon ECR -> 프라이빗 레지스트리 -> 리포지토리
- ECS 관련 경로 : Amazon Elastic Container Service에 들어가면 쉽게 확인이 가능하다.
2. ECR_REGISTRY 설정 : 여기서 말하는 ECR_REGISTRY는 아래처럼 ECR 푸시 명령
시 사용되는 Regisry를 말한다.
(빨간색 부분을 살펴보자)

docker tag backend:latest {ECR_REGISTRY}/backend:latest
- 위의 처럼 ECR 프라이빗 레포지토리 이름 앞에 존재하는
AWS
에서 설정해주는 값을ECR_REGISTRY
지정했다.
3. 가장 중요한 3번으로 Deploy to ECS
파트이다.
- 우리가 코드를 수정하여
Github Actions
로 새롭게 이미지가 빌드 되었다면 그것을 ECS로 배포해야 한다. - 그러나, 이미 ECS 서비스가 사용되고 있으므로, 새 배포를 강제 적용해야 한다.
- 하지만, 수동으로 클러스터 -> 서비스 -> 서비스 업데이트 -> 새 배포 강제 적용을 하면 CI/CD의 의미가 없다.
- 따라서,
aws cli
를 사용해 새 배포 강제 적용을 적용한다.
원래라면 사진에서 보이는 것처럼 새 배포 강제 적용을 해야 함.

따라서, 아래 명령어를 Github Actions
에서 사용하여 새로운 이미지를 ECS에 새롭게 배포한다.
aws ecs update-service --cluster $ECS_CLUSTER_NAME --service $ECS_SERVICE_NAME --force-new-deployment
이렇게 다 적용하게 되면 깃허브에 새롭게 코드가 푸시 될 때마다 새로운 이미지가 생성되고
그것이 ECS
에 적용된다. 또한, ECS
가 자동으로 무중단 배포를 지원을 해주기에 서비스는 종료되지 않는다.
그리고 자체적으로 CloudWatch
를 지원하기에 로그 확인도 가능하다.
정리
지금까지 1, 2, 3에 걸쳐 ECR + ECS + ALB + Route53 + Spring + Github Actions를 구현을 해봤다.
필자도 여태까지는 EC2만을 사용하여 배포했고 그에 맞도록 쉘 스크립트를 작성하여 무중단 배포 및 CI/CD를 구현했다.
하지만, 이번에 AWS ECS Fargate
을 통해 배포하면서 ECS에 대해 조금 알게 되었다.
훨씬 편리할 뿐더러 로그도 지원하고 헬스 체크도 쉽게 가능하다.
또한, 알아서 무중단 배포도 가능하며 Scale-Out
관련된 설정도 굉장히 간편하다.
그리고 무엇보다 구성이 빠르고 단순하다. 이것이 가장 큰 장점인 것 같다.
요번엔 ECS Fargate
를 사용해 배포했지만, 만약 좀 더 큰 서비스에서 작업한다면 EC2 기반의 ECS
로 배포해야
좀 더 관리가 쉬울 것 같다고 생각한다.
'DevOps > AWS' 카테고리의 다른 글
[AWS] ECR + ECS + ALB + Route53 + Spring + Github Actions - 2 (0) | 2024.08.23 |
---|---|
[AWS] ECR + ECS + ALB + Route53 + Spring + Github Actions - 1 (0) | 2024.08.22 |