Skip to main content

Amazon Elastic Container Service에 배포

CD(지속적인 배포) 워크플로의 일부로 Amazon ECS(Elastic Container Service)에 배포할 수 있습니다.

소개

이 가이드에서는 GitHub Actions을(를) 사용하여 컨테이너화된 애플리케이션을 빌드하고, Amazon ECR(Elastic Container Registry)에 푸시하고, main 분기에 대한 푸시가 있는 경우 Amazon ECS(Elastic Container Service)에 배포하는 방법을 설명합니다.

GitHub 리포지토리의 main에 대한 모든 새로운 푸시에서 GitHub Actions 워크플로는 새 컨테이너 이미지를 빌드하고 Amazon ECR에 푸시한 다음 Amazon ECS에 새 작업 정의를 배포합니다.

참고: GitHub Actions 워크플로가 OIDC(OpenID Connect)를 지원하는 클라우드 공급자의 리소스에 액세스해야 하는 경우 클라우드 공급자에게 직접 인증하도록 워크플로를 구성할 수 있습니다. 이렇게 하면 이러한 자격 증명을 수명이 긴 비밀로 저장하지 않을 수 있고 다른 보안 이점을 제공할 수 있습니다. 자세한 내용은 "OpenID Connect를 사용한 보안 강화 정보"을 참조하세요. 및 "Amazon Web Services에서 OpenID Connect 구성"

필수 조건

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

  1. 이미지를 저장할 Amazon ECR 리포지토리를 만듭니다.

    예를 들어 AWS CLI를 사용합니다.

    Bash
    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 작업 정의, 클러스터 및 서비스를 생성합니다.

    자세한 내용은 Amazon ECS 콘솔의 시작하기 마법사 또는 Amazon ECS 설명서의 시작하기 가이드를 참조하세요.

    Amazon ECS 서비스 및 클러스터에 대해 설정한 이름을 적어 두고 아래 워크플로의 ECS_SERVICE 변수 및 ECS_CLUSTER 변수에 사용해야 합니다.

  3. Amazon ECS 작업 정의를 GitHub 리포지토리에 JSON 파일로 저장합니다.

    파일 형식은 생성된 출력과 동일해야 합니다:

    Bash
    
    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 키를 삭제합니다.

YAML
# 이 워크플로는 GitHub에서 인증되지 않은 작업을 사용합니다.
# 작업은 타사에서 제공하며
# 별도의 서비스 약관, 개인정보처리방침, 지원 설명서에서 규정됩니다.
# 참조하세요.

# 커밋 SHA에 작업을 고정하는 것이 좋습니다.
# 최신 버전을 얻으려면 SHA를 업데이트해야 합니다.
# 태그 또는 분기를 참조할 수도 있지만 경고 없이 작업이 변경될 수 있습니다.

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@v4

      - 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

추가 리소스

원래의 워크플로 템플릿은 GitHub Actions starter-workflows 리포지토리의 aws.yml 항목을 참조하세요.

예시에서 사용된 서비스에 대한 자세한 내용은 다음 설명서를 참조하세요.