이번 게시글에서는 GitHub Actions를 이용한 AWS ECS 배포 내용을 기술하겠다. AWS의 ECR, ECS, Load Balancer에 대해서는 이미 구현되어 있다고 가정하고 진행하겠다.
먼저 자신의 Repository에서 새로운 workflow 파일을 생성한다.
Deploy to Amazon ECS를 검색하여 생성한다.
name: Deploy to Amazon ECS
on:
push:
branches: [ "main" ]
env:
AWS_REGION: MY_AWS_REGION # set this to your preferred AWS region, e.g. us-west-1
ECR_REPOSITORY: MY_ECR_REPOSITORY # set this to your Amazon ECR repository name
ECS_SERVICE: MY_ECS_SERVICE # set this to your Amazon ECS service name
ECS_CLUSTER: MY_ECS_CLUSTER # set this to your Amazon ECS cluster name
ECS_TASK_DEFINITION: MY_ECS_TASK_DEFINITION # set this to the path to your Amazon ECS task definition
# file, e.g. .aws/task-definition.json
CONTAINER_NAME: MY_CONTAINER_NAME # set this to the name of the container in the
# containerDefinitions section of your task definition
permissions:
contents: read
jobs:
deploy:
name: Deploy
runs-on: ubuntu-latest
environment: production
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ env.AWS_REGION }}
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1
- name: Build, tag, and push image to Amazon ECR
id: build-image
env:
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
IMAGE_TAG: ${{ github.sha }}
run: |
# Build a docker container and
# push it to ECR so that it can
# be deployed to ECS.
docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
echo "image=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" >> $GITHUB_OUTPUT
- name: Fill in the new image ID in the Amazon ECS task definition
id: task-def
uses: aws-actions/amazon-ecs-render-task-definition@v1
with:
task-definition: ${{ env.ECS_TASK_DEFINITION }}
container-name: ${{ env.CONTAINER_NAME }}
image: ${{ steps.build-image.outputs.image }}
- name: Deploy Amazon ECS task definition
uses: aws-actions/amazon-ecs-deploy-task-definition@v1
with:
task-definition: ${{ steps.task-def.outputs.task-definition }}
service: ${{ env.ECS_SERVICE }}
cluster: ${{ env.ECS_CLUSTER }}
wait-for-service-stability: true
workflow 파일에서 필요한 내용만 채워주면 된다.
Task Definition을 다운로드한 뒤, Repository에 저장하고 workflow 파일의 ECS_TASK_DEFINITION에 기입해준다.
ECR에 이미지를 올릴 때와 마찬가지로 ECS 배포를 위한 IAM을 만들어주어야 한다. 아래 사진과 같은 권한을 부여해준다.
해당 IAM의 AWS_ACCESS_KEY_ID와 AWS_SECRET_ACCESS_KEY를 workflow에서 사용할 수 있도록 한다.
배포가 진행될 때마다 새로운 이미지가 저장되는 Task Definition이 생기게 된다.
또한, ECS의 컨테이너가 새로운 이미지를 바라보게 되고 ECS에 배포가 진행된다.
GitHub Actions의 로그도 잘 기록된다.
CI/CD의 구조를 그림으로 표현해보았다.
이상으로 GitHub Actions를 이용한 AWS ECS 배포 설정 방법에 대해 설명하였다.