개인 사이트 ECS 마이그레이션
개인 사이트 ECS 마이그레이션 경험과 Github Actions를 이용한 ECS 배포 자동화 과정을 자세히 설명합니다.
지난 몇 달 동안 AWS 설정을 잘못 해 두어서, 비용이 비정상적으로 많이 나왔었다. AWS 설정을 정상적으로 바꾸고, 비용을 더 줄여볼 수는 없을까? 라는 생각이 들어서 EC2 에서 ECS 기반으로 마이그레이션 했다가, 다시 롤백하였다. 도커 컨테이너를 기반으로 해서 EC2 보다는 비용이 싸겠지? 라고 생각했던게 실수였다. 그래도 ECS 의 구조 및 설정법에 대해서는 어느정도 명확히 알 수 있게 되었다. AWS 관련 설정 내용은 https://infondgndg91.blogspot.com/2019/12/github-actions-aws-ecs-deployment.html 내용을 참고하였다. 아래 나오는 Github Action 을 설정하기 전에, ECR, ECS (Cluster, Service, Task Definition) 이 구성되어야 한다. ECR (Elastic Container Registry) : ECS 배포를 위해 필요한 Docker Registry 로 사용하였다. Public Repository 로 생성하면 일정 크기까지 스토리지 비용이 무료이다. ECS (Elastic Container Service) : ECR 과 연결하여, 도커 컨테이너로 서비스를 띄울 수 있다. 만약 어떠한 이유로 Task 가 불안정해지면, 자동으로 Task 를 등록한다. ELB 와도 연결하여 사용할 수 있다. ECR 에 도커 이미지를 푸시하고, ECS 에 배포하는 과정은 github action 을 사용하였다.
on:
  push:
    branches:
      - master
name: Deploy to Amazon ECS
jobs:
  deploy:
    name: Deploy
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Set up JDK
        uses: actions/setup-java@v1
        with:
          java-version: 1.11
      - name: Build with Maven
        run: ./mvnw clean package -DskipTests
      - name: Configure target service
        id: select-target
        shell: python
        run: |
          print('::set-output name=target::sebong')
      - 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: ap-northeast-2
      - 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 }}
          ECR_REPOSITORY: ${{ steps.select-target.outputs.target }}-ecr
          IMAGE_TAG: ${{ github.sha }}
        run: |
          docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
          docker tag $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG $ECR_REGISTRY/$ECR_REPOSITORY:latest
          docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
          docker push $ECR_REGISTRY/$ECR_REPOSITORY:latest
          echo "::set-output name=image::$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG"
      - name: Download task definition
        run: |
          aws ecs describe-task-definition \
          --task-definition ${{ steps.select-target.outputs.target }}-task-definition \
          --query taskDefinition > task-definition.json
      - 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: task-definition.json
          container-name: ${{ steps.select-target.outputs.target }}-container
          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: ${{ steps.select-target.outputs.target }}-service
          cluster: ${{ steps.select-target.outputs.target }}
          wait-for-service-stability: false
과정을 요약하면, 1. ECR 에 빌드한 도커 이미지를 푸시 2. 기존에 있던 Task Definition 을 다운로드 3. (2) 에서 받은 Task Definition 에 새로 빌드한 도커 이미지 ID 를 입력 4. (3) 에서 새로 생성한 Task Definition 배포
이것도 읽어보세요