Post

ECS Fargate + GitHub Action 자동 배포

ECS Fargate + GitHub Action 자동 배포

ECS

  • 태스크 정의 json 파일 다운로드
    • 좌측 태스크 정의 클릭

      image

    • 존재하는 태스크 정의 패밀리 클릭

      image

    • 최신 태스크 정의 클릭

      image

    • JSON 탭에서 JSON 다운로드 클릭

      image

    • 다운받은 json 파일을 애플리케이션 루트 디렉토리에 위치

      image


GitHub Action

  • GitHub Action에서 ‘Deploy to Amazon ECS’ workflow 선택

    image

  • Settings의 Secrets and variables에서 AWS_ACCESS_KEY_ID와 AWS_SECRET_ACCESS_KEY를 Repository secrets에 등록

    image

  • .github/workflows/aws.yml 파일을 아래 코드로 수정

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    
      name: Deploy to Amazon ECS
        
      on:
        push:
          branches: [ "develop-deploy" ]
        
      env:
        AWS_REGION: ap-northeast-2
        ECR_REPOSITORY: githubsalt-ecr
        ECS_SERVICE: githubsalt-backend
        ECS_CLUSTER: githubsalt-ecs
        ECS_TASK_DEFINITION: githubsalt-backend-revision2.json
        CONTAINER_NAME: githubsalt-container
          
      jobs:
        deploy:
          name: Deploy
          runs-on: ubuntu-latest
          environment: production
        
          steps:
            - name: Checkout
              uses: actions/checkout@v4
        
            - name: Set up JDK 17
              uses: actions/setup-java@v3
              with:
                java-version: '17'
                distribution: 'adopt'
        
            - name: Grant execute permission for gradlew
              run: chmod +x gradlew
        
            - name: build with gradle
              run: ./gradlew clean build -x test
        
            - name: Configure AWS credentials
              uses: aws-actions/configure-aws-credentials@v1
              with:
                aws-access-key-id: $
                aws-secret-access-key: $
                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: $
                IMAGE_TAG: $
              run: |
                docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
                docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
                echo "image=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" >> $GITHUB_OUTPUT
        
            - 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: $
                container-name: $
                image: $
        
            - name: Deploy Amazon ECS task definition
              uses: aws-actions/amazon-ecs-deploy-task-definition@v1
              with:
                task-definition: $
                service: $
                cluster: $
                wait-for-service-stability: true
    
  • 커밋 후 workflow가 작동하는 것을 확인

    image


ECS

  • (수정) action workflow가 끝나면 자동으로 배포되게 수정

    image


  • 태스크 정의에 최신 개정이 추가됐는지 확인

    image

    image

  • 개정된 태스크 정의를 바탕으로 서비스에 새로운 태스크를 띄우기

    • 서비스로 접속

      image

    • 우측의 서비스 업데이트 클릭

      • ‘새 배포 강제 적용’에 체크
      • 원하는 태스크 정의 개정 버전을 선택
      • 태스크를 없애고 싶으면 원하는 태스크를 0으로 설정

        image

This post is licensed under CC BY 4.0 by the author.