Github action & fargate 로 자동배포를 구성해보자

teihong93·2020년 9월 27일
3
post-thumbnail

얼마전 회사의 서비스 중 하나를 Rolling Update 에서 Code Deploy 를 이용한 Blue Green 배포로 변경하는 작업을 했습니다.

생각보다 삽질을 많이 했는데, 많은 삽질 끝에 음.. 이제 AWS 에 대해 좀 알겠군! 싶어서 개인 프로젝트에도 AWS 자동배포 를 적용해 보기로 했습니다.

회사에서처럼 jenkins 로 구성해볼까 했다가, 아직 github action 을 한번도 사용해보지 않아 요걸 사용해 보기로했습니다.

준비물

  • 도커이미지
  • 기본적인 설정이 끝난 AWS 계정
  • Github 레포지토리

개요

fargate 가 뭔가?
  • 작업정의한 도커이미지가 ec2 없이 떠 있는것.
  • fargate 인스턴스에 대해 생각할 필요가 없다.
Github action 이 뭔가?
  • 깃헙에서 제공하는 CI/CD 서비스
  • workflow 에 정의된 파이프라인대로 빌드하고, 푸시하고, 배포하는 등 다양한 action 을 설정할 수 있다.

AWS side 작업하기

  1. 클러스터를 만들어줍니다.

  2. fargate 를 사용할것이기에, 네트워킹 전용으로 만들어 줍니다.

  3. 이름을 정해주고 VPC 는 있는걸 사용하기로 합시다.

  4. 클러스터가 잘 만들어진것을 확인했으면, 작업정의를 해주어야 합니다.

  5. 작업정의를 하기 위해서는 도커 이미지가 필요하겠죠? 저는 미리 푸시해둔 reactei 라는 이미지를 사용하도록 하겠습니다.

  6. 도커 이미지가 없다면 도커파일을 정의한 후, ECR 에 push 해줍니다.(ECR 탭에 들어가 레포지토리를 하나 만들고, 푸시명령 보기를 눌러 그대로 터미널에 복붙해주면 됩니다. 베리 친절한 AWS)

  7. 이제 작업정의를 해봅시다. ECS 탭을 눌러 작업정의를 선택 후, fargate를 선택해줍니다.

  8. 기본설정으로 전부 사용하도록 하겠습니다.

  9. 컨테이너 추가를 눌러 아까 만들어준 도커이미지를 넣어줍니다. 저는 도커에서 9000번 포트를 사용하고 있기 때문에 9000번으로 맵핑해줬습니다.

  10. 이제 서비스를 만들 차례입니다. 아까 만들어준 demo 클러스터로 가서 서비스를 만들어봅시다.

  11. fargate로 만들었으니 fargate 로 설정해줍니다. 배포는 롤링으로 해주었고, 작업정의는 아까 만들어준 작업정의를 사용합니다.

  12. vpc 나 보안그룹은 기존에 사용하던 그룹을 그대로 사용하겠습니다.

  13. 로드밸런서는 80번 포트로 받도록 하겠습니다. 추후에 로드밸런서 설정에서 작업과 연결해주도록 하겠습니다.

  14. 오토스케일링은 설정할 필요 없습니다.

  15. 이제 서비스가 만들어졌으니, 80번 포트로 오는 요청 중, 특정 주소에 대한 요청만 지금 만들어진 서비스에 연결하도록 하겠습니다.

  16. 로드밸런서 80번 포트 리스너의 규칙보기/편집을 눌러줍니다.

  17. 제 도메인인 teihong93 중 reactei. 가 붙은 주소로 오는 요청을 전달시키도록 규칙을 설정합니다(당연히 route53 에도 추가해줘야 합니다) . 만일 도메인이 없다면, 해당 로드밸런서로 오는 요청을 전부 방금 만든 서비스로 전달하면 됩니다.

  18. 짜잔. 이제 fargate 배포가 완료되었습니다.

Github side 작업하기

AWS 는 언제 작업해도 어렵고 아리송한 부분들이 생깁니다. 하지만 걱정하지 마세요. github 사이드의 작업은 비교적 간단합니다.

  1. 레포지토리에 .github/workflow 를 추가합니다.

    해당 폴더안에 정의된 yml 파일을 읽어 gihub action이 실행됩니다.

2.yml 파일 정의하기.
ecs 를 통해 배포할것이므로, 다른사람이 만들어준 ecs 배포용 스크립트를 사용해 보도록 하겠습니다


on:
  push:
    branches: [deploy]
	# 어느 브랜치에 푸시할때 동작할지
name: Deploy to Amazon ECS

jobs:
  deploy:
    name: Deploy
    runs-on: ubuntu-latest
    env:
      PORT: 9000
    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: 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: reactei
          IMAGE_TAG: ${{ github.sha }}
        run: |
          docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
          docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
          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: task-definition.json
          container-name: reacteiContainer
          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: reactei
          cluster: demo
          wait-for-service-stability: true

해당 yml 파일에서 cluster,service,container,ECR_REPO 등을 본인것으로 변경해주시면 됩니다.

  1. secret 정의하기
    위에 secret 값들은 github->setting->secret 에서 정의 가능합니다.

4.task-definition.json 정의
yml 에 task-definition.json 파일을 사용한다고 정의했습니다. 해당 파일을 레포지토리 root 에 넣어줍시다.

  1. 해당 작업정의 파일은 AWS 작업정의 탭에서 긁어오면 됩니다.

  2. 휴 이제 끝났습니다. deploy 브랜치에 푸시만 하면? 자동으로 github action 이 실행됩니다.

  3. aws 에서 이벤트 사이클이 하나 돌아 새 배포가 적용된 것을 확인할 수 있습니다.

마치며

AWSgithub Action 을 사용해서 자동 배포를 적용해 보았습니다. 플로우를 정리해보자면

  1. deploy 에 푸시
  2. github action 이 감지해서 빌드하고 ecr 에 푸시하고 새 배포까지 적용해줌
  3. aws 에서 fargate 롤링 업데이트

와 같은 순서겠습니다.

자동배포를 구성하면서 삽질한 부분이 많아 정리해 보았는데요, 도움이 되셨으면 하네요!
AWS 는 항상 뭔가 제가 생각한대로 한번에 동작해주지 않는것 같아요. 처음 해보는걸 할때는 많은 삽질끝에 성공하네요. 다음번엔 삽질을 좀 줄일 수 있길 바라며! 더 좋은 글로 돌아오겠습니다.

profile
Being a service developer

1개의 댓글

comment-user-thumbnail
2020년 9월 27일

좋은 글 감사합니다 ^ ^

답글 달기