IWished
article thumbnail

To-Do

업무 분배

CI/CD Pipeline 구성

ECR에 도커 이미지를 빌드해 올리고, 그 이미지를 바탕으로 ECS 클러스터의 task를 교체하는 GitHub Actions workflow 파일을 작성하였다.

 

GitHub에서 ECS 배포 자동화를 해주는 Actions workflow 파일의 양식을 제공해 주기 때문에, 필요한 리소스들의 이름만 잘 맞춰서 적어준다면 큰 문제없이 CI/CD 파이프라인을 구축할 수 있다.

name: Deploy to Amazon ECR

on:
  push:
    branches:
      - feature/ecs-race-record
  pull_request:
    branches:
      - main
env:
  AWS_REGION: ap-northeast-2
  ECR_REPOSITORY: race
  ECS_SERVICE: tf-ecs-service
  ECS_CLUSTER: race_record_cluster
  ECS_TASK_DEFINITION: ./aws/task-definition.json
  CONTAINER_NAME: tf-race-record-task


jobs:
  deploy:
    name: Deploy
    runs-on: ubuntu-latest
    environment: production

    steps:
    - name: Checkout
      uses: actions/checkout@v2

    - 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 }}
      working-directory: ./backend/race-backend
      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 . || true
        docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG || true
        echo "::set-output name=image::$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG"

    - 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

주의할 것은, 기존에 테라폼이나 AWS콘솔로 생성해두었던 ECS task의 JSON 파일을 불러와서 GitHub Actions가 읽을 수 있도록 해주어야 한다.

 

이 부분은 name: Fill in the new image ID in the Amazon ECS  task definition의 과정을 보면 이해할 수 있다.

ECR에 이미지를 배포하고, 클러스터에 새로운 task를 돌리기 위해서 기존의 task 설정파일(JSON)을 읽고, 필요한 정보를 불러오고 image ID를 바꾸어준다.

 

배포가 되는 과정에서 태스크가 자꾸 중지된다면, 태스크의 로그를 살펴보는 것이 중요하다.

배포가 오랫동안 완료되지 않아 AWS 콘솔을 통해 클러스터를 살펴보니 태스크가 생성되고 중지되는 과정이 반복되고 있었고,

로그를 통해 이유를 살펴보니 기존에 불러온 태스크 설정 파일과 배포될 당시 서비스되고 있던 태스크의 포트번호가 달라서 health check 하는 과정이 완료되지 않았고, 그 때문에 오랜 시간 동안 태스크가 생성되고 중지되고 있었던 것이다.

 

다른 팀원과 작업하는 부분이 겹쳐 생긴 헤프닝으로, 즉시 에러 내용을 공유하고 같이 살펴보니 금방 문제를 찾을 수 있었고 빠르게 해결할 수 있었다.


Today...

팀원들의 작업속도가 꽤나 빨라서 정해진 일정보다 더 빨리 기본목표를 달성할 수 있을 것 같다.

아키텍처대로 구현이 끝난다면 조금 더 세세하게 다듬고, 어드밴스드로 남겨둔 과제들을 해볼 수 있을 것 같다.