Amazon Elastic Container Service에 배포하기

Amazon Elastic Container Service에 배포하기

지속적 배포(CD) 워크플로의 일부로 프로젝트를 Amazon Elastic Container Service(ECS)에 배포하는 방법을 알아봐요. 컨테이너 이미지를 빌드해 Amazon ECR로 푸시하고, 작업 정의를 새 이미지 ID로 갱신한 뒤 Amazon ECS에 배포하는 워크플로를 살펴봐요.

출처: 문서

본문

사전 요구 사항

GitHub Actions 워크플로를 만들기 전에 먼저 Amazon ECR과 ECS에 대해 다음 설정 단계를 완료해야 해요.

  1. 이미지를 저장할 Amazon ECR 저장소를 만들어요.

    예를 들어 AWS CLI를 사용하면:

    aws ecr create-repository \
        --repository-name MY_ECR_REPOSITORY \
        --region MY_AWS_REGION
    
    

    아래 워크플로의 ECR_REPOSITORY 변수에 같은 Amazon ECR 저장소 이름(여기서는 MY_ECR_REPOSITORY로 표시)을 사용해야 해요.

    아래 워크플로의 AWS_REGION 변수(여기서는 MY_AWS_REGION으로 표시)에 같은 AWS 리전 값을 사용해야 해요.

  2. Amazon ECS 작업 정의(task definition), 클러스터, 서비스를 만들어요.

    자세한 내용은 Amazon ECS 콘솔의 시작 마법사나 Amazon ECS 문서의 시작 가이드를 따라가세요.

    Amazon ECS 서비스와 클러스터에 설정한 이름을 기록해 두고, 아래 워크플로의 ECS_SERVICEECS_CLUSTER 변수에 사용해야 해요.

  3. Amazon ECS 작업 정의를 GitHub 저장소의 JSON 파일로 저장해요.

    파일 형식은 다음이 생성하는 출력과 같아야 해요:

    
    aws ecs register-task-definition --generate-cli-skeleton
    
    

    아래 워크플로의 ECS_TASK_DEFINITION 변수를 JSON 파일의 경로로 설정해야 해요.

    아래 워크플로의 CONTAINER_NAME 변수를 작업 정의의 containerDefinitions 섹션에 있는 컨테이너 이름으로 설정해야 해요.

  4. Amazon IAM 액세스 키 값들을 저장하기 위해 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY라는 GitHub Actions 시크릿을 만들어요.

    GitHub Actions용 시크릿을 만드는 방법에 대한 자세한 내용은 GitHub Actions에서 시크릿 사용하기를 참고하세요.

    아래 사용된 각 액션의 문서에서 IAM 사용자에게 권장되는 IAM 정책과 액세스 키 자격 증명을 처리하는 방법을 확인하세요.

  5. 선택적으로, 배포 환경을 구성해요. 환경은 production, staging, development 같은 일반적인 배포 대상을 설명하는 데 사용돼요. GitHub Actions 워크플로가 환경으로 배포하면 환경이 저장소 메인 페이지에 표시돼요. 환경을 사용해 작업 진행에 승인을 요구하거나, 어떤 브랜치가 워크플로를 트리거할 수 있는지 제한하거나, 커스텀 배포 보호 규칙으로 배포를 게이팅하거나, 시크릿 접근을 제한할 수 있어요. 환경을 만드는 방법에 대한 자세한 내용은 배포용 환경 관리하기를 참고하세요.

워크플로 만들기

사전 요구 사항을 완료했다면 워크플로를 만들 수 있어요.

다음 예제 워크플로는 컨테이너 이미지를 빌드해 Amazon ECR로 푸시하는 방법을 보여줘요. 그런 다음 새 이미지 ID로 작업 정의를 갱신하고, 그 작업 정의를 Amazon ECS에 배포해요.

워크플로의 env 키에 있는 모든 변수에 나만의 값을 제공해야 해요.

배포 환경을 구성했다면 environment 값을 환경 이름으로 변경해요. 환경을 구성하지 않았거나 워크플로가 비공개 저장소에 있고 GitHub Enterprise Cloud를 사용하지 않는다면 environment 키를 삭제해요.

# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.

# GitHub recommends pinning actions to a commit SHA.
# To get a newer version, you will need to update the SHA.
# You can also reference a tag or branch, but the action may change without warning.

name: Deploy to Amazon ECS

on:
  push:
    branches:
      - main

env:
  AWS_REGION: MY_AWS_REGION                   # set this to your preferred AWS region, e.g. us-west-1
  ECR_REPOSITORY: MY_ECR_REPOSITORY           # set this to your Amazon ECR repository name
  ECS_SERVICE: MY_ECS_SERVICE                 # set this to your Amazon ECS service name
  ECS_CLUSTER: MY_ECS_CLUSTER                 # set this to your Amazon ECS cluster name
  ECS_TASK_DEFINITION: MY_ECS_TASK_DEFINITION # set this to the path to your Amazon ECS task definition
                                               # file, e.g. .aws/task-definition.json
  CONTAINER_NAME: MY_CONTAINER_NAME           # set this to the name of the container in the
                                               # containerDefinitions section of your task definition

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

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

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@0e613a0980cbf65ed5b322eb7a1e075d28913a83
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ${{ env.AWS_REGION }}

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

      - name: Build, tag, and push image to Amazon ECR
        id: build-image
        env:
          ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
          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 "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@c804dfbdd57f713b6c079302a4c01db7017a36fc
        with:
          task-definition: ${{ env.ECS_TASK_DEFINITION }}
          container-name: ${{ env.CONTAINER_NAME }}
          image: ${{ steps.build-image.outputs.image }}

      - name: Deploy Amazon ECS task definition
        uses: aws-actions/amazon-ecs-deploy-task-definition@df9643053eda01f169e64a0e60233aacca83799a
        with:
          task-definition: ${{ steps.task-def.outputs.task-definition }}
          service: ${{ env.ECS_SERVICE }}
          cluster: ${{ env.ECS_CLUSTER }}
          wait-for-service-stability: true

더 알아보기 (Learn more)

원본 워크플로 템플릿은 GitHub Actions starter-workflows 저장소의 aws.yml을 참고하세요.

이 예제들에서 사용된 서비스에 대한 자세한 내용은 다음 문서를 확인하세요: