고딩왕 코범석

Github Actoins로 AWS ECS CI / CD 자동화하기 본문

Infra/AWS

Github Actoins로 AWS ECS CI / CD 자동화하기

고딩왕 코범석 2022. 6. 9. 22:52
반응형

안녕하세요! 지난 포스팅에서는 ECS 환경을 구축해보았습니다. 이번에는 Github Actions를 이용해 CI / CD 과정을 자동화해보겠습니다.

이번 포스팅은 아래와 같이 진행되며, 깃허브 리파지토리가 있다는 가정하에 시작합니다. 또한 Github Actions 관련한 기초적인 내용은 포스팅에서 제외합니다!

  1. 외부에서 AWS에 접근할 IAM 사용자 생성 및 정책 연결
  2. IAM 사용자 정보를 Github Secret에 저장
  3. Github Actions 스크립트 작성
  4. task-definition.json 정의
  5. 실행 후 결과 확인하기

1. 외부에서 AWS에 접근할 IAM 사용자 생성 및 정책 연결

먼저 외부에서 AWS 서비스에 접근하려면 인증된 사용자가 필요합니다. 따라서 AWS IAM 사용자를 만들어야합니다. AWS 콘솔에서 'IAM > 사용자 > 사용자 추가'를 눌러줍니다.

스크린샷 2022-06-09 오후 7 43 19

사용자 이름을 입력하고 프로그래밍 방식 액세스를 선택하여 다음을 눌러줍니다.

스크린샷 2022-06-09 오후 8 23 45

해당 유저가 ECS에 접근할 수 있는 권한이 있어야 합니다. AmazonECS_FullAccess 정책을 체크하고 태그는 스킵하고 검토까지 마무리합니다.

스크린샷 2022-06-09 오후 8 29 32 스크린샷 2022-06-09 오후 8 31 05 스크린샷 2022-06-09 오후 8 31 13 스크린샷 2022-06-09 오후 8 31 30

그럼 위 사진처럼 액세스 키 ID와 비밀 액세스 키를 제공합니다. 해당 파일을 .csv 파일로 다운로드 해주시면 IAM 사용자 생성은 마무리됩니다.

해당 사용자는 컨테이너의 이미지를 가져오기 위해 ECR에도 접근해야합니다. ECR 정책을 만든 후 방금 만든 사용자에게 정책을 연결해보겠습니다. 'IAM 콘솔 > 정책 > 정책 생성'을 눌러줍니다.

스크린샷 2022-06-09 오후 10 06 36

그럼 아래와 같이 시각적 편집기가 보이는데요. 서비스는 Elastic Container Registry를 선택하고, 모든 Elastic Container Registry 작업에 체크하고 리소스 항목은 '이 계정의 모든 항목' 체크박스를 체크하고 다음으로 넘어갑니다. 참고로 권한은 최소화하여 부여하는 것이 가장 좋습니다. 현재는 포스팅이다보니 편의상 모든 작업에 권한을 부여했습니다.

스크린샷 2022-06-09 오후 10 13 49 스크린샷 2022-06-09 오후 10 13 58

태그는 스킵한 다음 정책 검토에서 정책 이름과 설명을 기입하고 마무리해줍니다.

스크린샷 2022-06-09 오후 10 17 30

이 정책을 방금 만든 사용자와 연결해야합니다. 'IAM 콘솔 > 사용자 > 생성한 사용자 클릭 > 권한 추가'로 들어가줍니다.

스크린샷 2022-06-09 오후 10 20 33 스크린샷 2022-06-09 오후 10 20 17

그리고 '기존 정책 직접 연결'을 눌러 방금 만든 정책을 추가하여 IAM 설정을 마무리해줍니다.

스크린샷 2022-06-09 오후 10 22 31

2. IAM 사용자 정보를 Github Secret에 저장

다음으로 애플리케이션 리파지토리(Github) > Settings > Secrets > Actions > New repository secret에 들어갑니다. 저 같은 경우 미리 생성한 secret 변수가 있는데요. 삭제하고 포스팅에서 만든 IAM 사용자 정보로 다시 만들어보겠습니다. 우리가 만들어야하는 키는 액세스 키 ID비밀 액세스 키인데요. 각각 AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY 로 명명하여 발급받은 값을 저장시키겠습니다.

스크린샷 2022-06-09 오후 8 43 44 스크린샷 2022-06-09 오후 8 44 07 스크린샷 2022-06-09 오후 8 48 19 스크린샷 2022-06-09 오후 8 48 44

저는 새로 생성하지 않고 업데이트를 했기 때문에 다음과 같은 상태가 됩니다.

스크린샷 2022-06-09 오후 8 49 49

3. Github Actions 스크립트 작성

이제 Github Actions 스크립트를 작성해보겠습니다. 깃허브 리파지토리에서 Actions > New workflow를 눌러줍니다.

스크린샷 2022-06-09 오후 8 53 32

그럼 아래와 같이 workflow를 고를 수 있는 화면이 나오는데요. 검색창에 'ecs'를 검색하면 'Deploy to Amazon ECS'가 보이실 겁니다. Configure 버튼을 눌러주세요.

스크린샷 2022-06-09 오후 8 55 30

그러면 스크립트 yml이 보이실 겁니다. 제공해주는 스크립트대로 작성해도 상관없으며 저는 프로젝트 빌드 과정과 JDK 11을 머신에 셋업하기 위한 스텝을 따로 추가해두었습니다. 제 yml은 밑의 코드 블럭을 참조하면 되고, 직접 기재해야하는 필드는 주석으로 표시해두겠습니다.

name: Deploy to Amazon ECS

on:
  push:
    branches:
      - main

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

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

      - name: Set up JDK 11
        uses: actions/setup-java@v2
        with:
          java-version: '11'
          distribution: 'temurin'

      - name: Build with Gradle
        run: ./gradlew clean build

      - 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: # ECR 저장소 명
          IMAGE_TAG: ${{ github.sha }}
        run: |
          docker build --platform arm64 -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: # 저번 포스팅에서 작성했던 컨테이너 명
          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: # ECS 서비스 명
          cluster: # ECS 클러스터 명
          wait-for-service-stability: true

프로젝트의 루트 경로 기준으로 /.github/workflows 안에 위 스크립트 yml을 위치시켜줍니다.

스크린샷 2022-06-09 오후 9 35 45

4. task-definition.json 작성하기

이제 태스크 정의 json 파일을 작성해야합니다. 저번 포스팅에서 만든 '태스크 정의 > 만든 태스크 > 개정 선택 > JSON' 으로 들어가면 만들었던 태스크에 대한 내용들이 json 형태로 나와있습니다.

스크린샷 2022-06-09 오후 9 45 55 스크린샷 2022-06-09 오후 9 46 11 스크린샷 2022-06-09 오후 9 46 28

이 내용을 그대로 복사하고, 프로젝트 루트 폴더에 task-definition.json 파일을 만들어줍니다.

스크린샷 2022-06-09 오후 9 48 47

5. 실행 후 결과 확인하기

새 버전임을 확인하기 위해 새로운 URI를 만들어보겠습니다. /new URI에는 다음과 같이 리턴되도록 작성했습니다.

image

그리고 깃허브에 푸시하면 아래와 같이 Github Actions가 실행 중임을 확인할 수 있습니다.

image

또한 '클러스터 > 서비스'에 들어가면 현재 실행 중인 태스크가 2로 보여질 겁니다. '배포 및 이벤트'에서도 태스크가 2개임을 확인할 수 있습니다.

스크린샷 2022-06-09 오후 10 27 57 스크린샷 2022-06-09 오후 10 29 04

배포까지 완료되면 workflow에 초록불이 뜨는데요. 방금 만들었던 /new URI를 입력해봅니다.

image image

정상적으로 잘 동작합니다! EC2에 접속해서 컨테이너 상태도 확인해보겠습니다.

스크린샷 2022-06-09 오후 10 48 17

방금 배포했던 컨테이너가 Up 상태, 기존에 올라가있었던 컨테이너가 Exited 상태임을 알 수 있습니다. 이상으로 ECS 배포를 Github Actions로 자동화하는 포스팅을 마무리하겠습니다! 항상 피드백은 환영합니다!

반응형

'Infra > AWS' 카테고리의 다른 글

AWS ECS 적용하기  (0) 2022.06.06
AWS ECS 적용 전 준비사항  (1) 2022.06.06
AWS VPC 환경 구축해보기  (0) 2021.11.25