# Amazon Elastic Container Service에 배포

CD(지속적인 배포) 워크플로의 일부로 Amazon ECS(Elastic Container Service)에 프로젝트를 배포하는 방법을 알아보세요.

## 필수 조건

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

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

   예를 들어 [AWS CLI](https://aws.amazon.com/cli/)를 사용합니다.

   ```bash copy
   aws ecr create-repository \
       --repository-name MY_ECR_REPOSITORY \
       --region MY_AWS_REGION

   ```

   아래 워크플로우에서 `MY_ECR_REPOSITORY` 변수에 대해 동일한 Amazon ECR 리포지토리 이름(여기서는 `ECR_REPOSITORY`로 표시됨)을 사용해야 합니다.

   아래 워크플로우에서 `AWS_REGION` (여기서는 `MY_AWS_REGION`로 표시됨) 변수에 대해 동일한 AWS 지역 값을 사용해야 합니다.

2. Amazon ECS 작업 정의, 클러스터 및 서비스를 생성합니다.

   자세한 내용은 [Amazon ECS 콘솔의 시작하기 마법사](https://us-east-2.console.aws.amazon.com/ecs/home?region=us-east-2#/firstRun) 또는 Amazon ECS 설명서의 [시작하기 가이드](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/getting-started-fargate.html)를 참조하세요.

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

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

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

   ```bash copy

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

   ```

   아래 워크플로우에서 `ECS_TASK_DEFINITION` 변수를 JSON 파일의 경로로 설정했는지 확인하세요.

   아래 워크플로우의 `CONTAINER_NAME` 변수를 작업 정의의 `containerDefinitions` 섹션에서 컨테이너 이름으로 설정했는지 확인하세요.

4. Amazon IAM 액세스 키의 값을 저장하기 위해 GitHub Actions 및 `AWS_ACCESS_KEY_ID`라는 이름의 `AWS_SECRET_ACCESS_KEY` 시크릿을 생성합니다.

   비밀을 만드는 방법에 대한 자세한 내용은 GitHub Actions을 [](/ko/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets#creating-secrets-for-a-repository)참조하세요.

   아래에 사용된 각 작업에 대한 설명서를 참조하여 IAM 사용자에 대한 권장 IAM 정책 및 액세스 키 자격 증명을 처리하는 방법을 확인하십시오.

5. 필요에 따라 배포 환경을 구성합니다. 환경은 일반적인 배포 대상(예: `production`, `staging` 또는 `development`)을 설명하는 데 사용됩니다. 워크플로가 GitHub Actions 환경에 배포되면 환경이 리포지토리의 기본 페이지에 표시됩니다. 환경을 사용하여 작업이 진행되기 전에 승인을 요구하거나, 워크플로를 트리거할 수 있는 분기를 제한하거나, 사용자 지정 배포 보호 규칙으로 배포를 제어하거나, 비밀 정보에 대한 액세스를 제한할 수 있습니다. 환경을 만드는 방법에 대한 자세한 내용은 [배포 환경 관리](/ko/actions/how-tos/deploy/configure-and-manage-deployments/manage-environments)을(를) 참조하세요.

## 워크플로 만들기

필수 구성 요소를 완료한 후에는 워크플로 만들기를 진행할 수 있습니다.

다음 예시 워크플로에서는 컨테이너 이미지를 빌드하여 Amazon ECR에 푸시하는 방법을 보여줍니다. 그런 다음 새 이미지 ID로 작업 정의를 업데이트하고 작업 정의를 Amazon ECS에 배포합니다.

워크플로우의 `env` 키에 있는 모든 변수에 대해 고유한 값을 제공해야 합니다.

배포 환경을 구성한 경우 환경의 이름으로 `environment` 값을 변경합니다. 환경을 구성하지 않은 경우 또는 워크플로가 프라이빗 리포지토리에 있고 GitHub Enterprise Cloud를 사용하지 않는 경우 `environment` 키를 삭제합니다.

```yaml copy
# 이 워크플로는 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@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
```

## 추가 참고 자료

원본 워크플로 템플릿은 `aws.yml`[](https://github.com/actions/starter-workflows/blob/main/deployments/aws.yml) 리포지토리의 `starter-workflows`을(를) 참조하세요.

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

* Amazon AWS 설명서의 [AM의 보안 모범 사례](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)
* 공식 AWS [AWS 자격 증명을 구성](https://github.com/aws-actions/configure-aws-credentials)하는 작업
* 공식 AWS [Amazon ECR "로그인"](https://github.com/aws-actions/amazon-ecr-login) 액션.
* 공식 AWS [Amazon ECS “렌더링 작업 정의”](https://github.com/aws-actions/amazon-ecs-render-task-definition) 작업.
* 공식 AWS [Amazon ECS “작업 정의 배포”](https://github.com/aws-actions/amazon-ecs-deploy-task-definition) 작업.