[공부정리] GitHub Actions를 이용한 AWS ECS 배포

jeyong·2024년 6월 4일
0

공부 / 생각 정리  

목록 보기
77/120
post-custom-banner

이번 게시글에서는 GitHub Actions를 이용한 AWS ECS 배포 내용을 기술하겠다. AWS의 ECR, ECS, Load Balancer에 대해서는 이미 구현되어 있다고 가정하고 진행하겠다.

1. Github Actions

먼저 자신의 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 파일에서 필요한 내용만 채워주면 된다.

2. ECS Task Definition

Task Definition을 다운로드한 뒤, Repository에 저장하고 workflow 파일의 ECS_TASK_DEFINITION에 기입해준다.

3. ECS IAM

ECR에 이미지를 올릴 때와 마찬가지로 ECS 배포를 위한 IAM을 만들어주어야 한다. 아래 사진과 같은 권한을 부여해준다.

해당 IAM의 AWS_ACCESS_KEY_ID와 AWS_SECRET_ACCESS_KEY를 workflow에서 사용할 수 있도록 한다.

4. 배포 결과

배포가 진행될 때마다 새로운 이미지가 저장되는 Task Definition이 생기게 된다.

또한, ECS의 컨테이너가 새로운 이미지를 바라보게 되고 ECS에 배포가 진행된다.

GitHub Actions의 로그도 잘 기록된다.

CI/CD의 구조를 그림으로 표현해보았다.

이상으로 GitHub Actions를 이용한 AWS ECS 배포 설정 방법에 대해 설명하였다.

profile
노를 젓다 보면 언젠가는 물이 들어오겠지.
post-custom-banner

0개의 댓글