Git action (ECS, ECR, cloudfront)

정지훈·2024년 10월 21일
0

github action은 CI/CD툴로 개발의 work flow를 자동화 할 수 있게 도와준다.

Github Action 개념으로는 Workflow, Event, Job, step, Action, Runner가 있고

Workflow는 자동화 된 전체 프로세스 하나 이상의 job으로 구성되어 있고 Event에 의해 예약되거나 트리거가 될 수 있는 자동화된 절차를 말한다.

Event는 github에 푸시 하거나 풀요청이 생성 될때 Github에서 활동이 시작될 수 있다.

job은 여러 step으로 구성되고 단일 가상 환경에서 실행되고 다른 job에 의존 관계를 가질 수도 있고 병렬로도실행할 수도 있다.

step은 순차적으로 실행되는 프로세스 단위이다.

AWS ECS, ECR Github Action 생성하기

파일 최 상단 루트에

  • .github
    • workflows
      deploy_dev.yml

파일을 만들어 yml파일에 아래와 같이 적용 하면된다.

on:
push:
branches: [develop]

yml파일 맨 상단에 on: push: 는 해당 브랜치에 푸시 하면 git action이 실행 된다.

name: Dev Release

on:
  push:
    branches: [develop]

# 해당 Workflow의 하나 이상의 Job 목록입니다.
jobs:
  deploy_prod:
    name: Deploy Release
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [16.x]

    steps:
      - name: Checkout Repository
        uses: actions/checkout@v3.0.0
        with:
          fetch-depth: 0

      - 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_ACCESS_KEY }}
          aws-region: ${{ secrets.AWS_REGION }}

      - name: Login to Amazon ECR
        id: login-ecr
        uses: aws-actions/amazon-ecr-login@v1

      - name: Generate dotenv
        run: |
         echo "NEXT_PUBLIC_URL=$NEXT_PUBLIC_URL" >> .env
        env:
         NEXT_PUBLIC_URL: ${{ secrets.NEXT_PUBLIC_URL }}

      - name: Build, tag, and push image to Amazon ECR
        id: build-image
        env:
          ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
          ECR_REPOSITORY: (ECR Repository name)
          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 "::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: (devtestFile.json)
          container-name: (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 Service name)
          cluster: (ECS cluster name)
          wait-for-service-stability: false
          # force-new-deployment: true

      # CF 캐시 무효화
      - name: Invalidate CloudFront Cache
        run: aws cloudfront create-invalidation --distribution-id ${{ secrets.CF_DISTRIBUTION_ID }} --paths "/*"

    # - name: build result to slack
    #   uses: 8398a7/action-slack@v3.12.0
    #   with:
    #     job_name: (job 이름)
    #     status: ${{job.status}}
    #     fields: repo,message,commit,author,action,eventName,ref,workflow,job,took
    #     author_name: Frontend CI/CD
    #   env:
    #     GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
    #     SLACK_WEBHOOK_URL: ${{ secrets.FE_SLACK_WEBHOOK_URL }}
    #   if: always()

on: push: branches: 는 해당 브랜치에 푸시를 하거나 풀리퀘를 하면 git action이 실행된다.

jobs가 실행 되면 env파일을 세팅 할 수 있는데
Generate dotenv 해당 줄에 추가 하고 github 사이트에 등록 만 하면 된다.

github 사이트에서 해당 레포지토리에 세팅에 들어가

해당 Actions 텝에 들어가서 등록만 해주면 된다.
해당 등록한 env 이름을 가지고

- name: Generate dotenv
        run: |
         echo "NEXT_PUBLIC_URL=$NEXT_PUBLIC_URL" >> .env
        env:
         NEXT_PUBLIC_URL: ${{ secrets.NEXT_PUBLIC_URL }}

이런식으로 넣어주기만 하면 된다. 해당 secrets.(git action에 등록한 이름) 이 github에 세팅한 env를 가져온다.

AWS ECR,ECS를 등록하기 전에 세팅을 먼저 해야 한다.

ECR에 들어가 리포지토리 생성을 하고 리포지토리 이름을 지정하고 만든다. 리포지토리 이름을 deploy/test 라고 만들었으면

  - name: Build, tag, and push image to Amazon ECR
        id: build-image
        env:
          ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
          ECR_REPOSITORY: deploy/test
          IMAGE_TAG: ${{ github.sha }}
          

ECR_REPOSITORY 에 해당 이름을 넣어서 적어준다.

그 후 만든 리포지토리 url을 복사(나중에 container를 만들기 위해 필요함)

리포지토리로 들어가서 이미지 생성을 하면된다. (만든 프로젝트를 킨 후 터미널을 aws region하고 사용자 계정으로 맞춰놔야 한다.)
푸시 명령 보기를 눌려서 진행하면 이미지가 만들어 질 것이다.

그리고 클러스터를 만들기 위해 AWS ECS로 클러스터를 생성을 하고 해당 클러스터 이름을 testCluster라고 만들고 나서 일단 서비스를 만들기 전에 테스트 정의, container를 만들어야 한다.

해당 테스크 정의로 들어간 후에 container생성을 하면 된다.
컨테이너 이름을 DeployTestContainer 라고 만들어 놓고
이미지 필드에 아까 복사한 ECR url을 붙여넣기 한다.
그리고 사용 컨테이너 cpu, 메모리를 서정 후 포트 매핑이 있는데 포트 매핑 번호는 이전에 도커라이징할 때 EXPOSE로 설정한 포트 번호로 설정합니다.

그리고 생성이 완료된 후에 json파일이 만들어 지는데 이것또한 프로젝트 루트에 넣으면 된다.

그리고 다시 클러스터로 들어가 서비스를 생성하면 된다. 서비스는 별다른 것은 없고 몇개의 task를 띄울것인지 세팅하고 만든 container를 세팅 그리고 로드 벨런스를 세팅 하면 완료가 되고 만들었던 container, cluster, service 는 아래와 같이 git action에 적어 주면 된다.

  - 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: testTask.json
          container-name: DeployTestContainer
          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: testService
          cluster: testCluster
          wait-for-service-stability: false
          # force-new-deployment: true

그리고 마지막으로 CF 캐시 무효화가 있는데 cloudefront를 캐시 무효화를 마지막에 해주는 것도 넣어주면 좋다.

      # CF 캐시 무효화
      - name: Invalidate CloudFront Cache
        run: aws cloudfront create-invalidation --distribution-id ${{ secrets.CF_DISTRIBUTION_ID }} --paths "/*"

cloudfront를 만든 후에 id를 넣어주기만 하면 된다.

0개의 댓글