Amazon Elastic Container Service에 배포하기
Amazon Elastic Container Service에 배포하기
지속적 배포(CD) 워크플로의 일부로 프로젝트를 Amazon Elastic Container Service(ECS)에 배포하는 방법을 알아봐요. 컨테이너 이미지를 빌드해 Amazon ECR로 푸시하고, 작업 정의를 새 이미지 ID로 갱신한 뒤 Amazon ECS에 배포하는 워크플로를 살펴봐요.
출처: 문서
본문
사전 요구 사항
GitHub Actions 워크플로를 만들기 전에 먼저 Amazon ECR과 ECS에 대해 다음 설정 단계를 완료해야 해요.
-
이미지를 저장할 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 리전 값을 사용해야 해요. -
Amazon ECS 작업 정의(task definition), 클러스터, 서비스를 만들어요.
자세한 내용은 Amazon ECS 콘솔의 시작 마법사나 Amazon ECS 문서의 시작 가이드를 따라가세요.
Amazon ECS 서비스와 클러스터에 설정한 이름을 기록해 두고, 아래 워크플로의
ECS_SERVICE와ECS_CLUSTER변수에 사용해야 해요. -
Amazon ECS 작업 정의를 GitHub 저장소의 JSON 파일로 저장해요.
파일 형식은 다음이 생성하는 출력과 같아야 해요:
aws ecs register-task-definition --generate-cli-skeleton아래 워크플로의
ECS_TASK_DEFINITION변수를 JSON 파일의 경로로 설정해야 해요.아래 워크플로의
CONTAINER_NAME변수를 작업 정의의containerDefinitions섹션에 있는 컨테이너 이름으로 설정해야 해요. -
Amazon IAM 액세스 키 값들을 저장하기 위해
AWS_ACCESS_KEY_ID와AWS_SECRET_ACCESS_KEY라는 GitHub Actions 시크릿을 만들어요.GitHub Actions용 시크릿을 만드는 방법에 대한 자세한 내용은 GitHub Actions에서 시크릿 사용하기를 참고하세요.
아래 사용된 각 액션의 문서에서 IAM 사용자에게 권장되는 IAM 정책과 액세스 키 자격 증명을 처리하는 방법을 확인하세요.
-
선택적으로, 배포 환경을 구성해요. 환경은
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을 참고하세요.
이 예제들에서 사용된 서비스에 대한 자세한 내용은 다음 문서를 확인하세요:
- Amazon AWS 문서의 IAM의 보안 모범 사례.
- 공식 AWS Configure AWS Credentials 액션.
- 공식 AWS Amazon ECR "Login" 액션.
- 공식 AWS Amazon ECS "Render Task Definition" 액션.
- 공식 AWS Amazon ECS "Deploy Task Definition" 액션.