참고: GitHub 호스트 실행기는 현재 GitHub Enterprise Server에서 지원되지 않습니다. GitHub public roadmap에 예정된 향후 지원에 대해 자세히 알아볼 수 있습니다.
소개
이 가이드에서는 GitHub Actions을(를) 사용하여 컨테이너화된 애플리케이션을 빌드하고, Amazon ECR(Elastic Container Registry)에 푸시하고, main
분기에 대한 푸시가 있는 경우 Amazon ECS(Elastic Container Service)에 배포하는 방법을 설명합니다.
GitHub 리포지토리의 main
에 대한 모든 새로운 푸시에서 GitHub Actions 워크플로는 새 컨테이너 이미지를 빌드하고 Amazon ECR에 푸시한 다음 Amazon ECS에 새 작업 정의를 배포합니다.
Note
GitHub Actions 워크플로가 OIDC(OpenID Connect)를 지원하는 클라우드 공급자의 리소스에 액세스해야 하는 경우 클라우드 공급자에게 직접 인증하도록 워크플로를 구성할 수 있습니다. 이렇게 하면 이러한 자격 증명을 수명이 긴 비밀로 저장하지 않을 수 있고 다른 보안 이점을 제공할 수 있습니다. 자세한 내용은 "OpenID Connect를 사용한 보안 강화 정보"을 참조하세요. 및 "Amazon Web Services에서 OpenID Connect 구성"을(를) 참조하세요.
필수 조건
GitHub Actions 워크플로를 만들기 전에 먼저 Amazon ECR 및 ECS에 대한 다음 설정 단계를 완료해야 합니다.
-
이미지를 저장할 Amazon ECR 리포지토리를 만듭니다.
예를 들어 AWS CLI를 사용합니다.
Bash aws ecr create-repository \ --repository-name MY_ECR_REPOSITORY \ --region MY_AWS_REGION
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 작업 정의, 클러스터 및 서비스를 생성합니다.
자세한 내용은 Amazon ECS 콘솔의 시작하기 마법사 또는 Amazon ECS 설명서의 시작하기 가이드를 참조하세요.
Amazon ECS 서비스 및 클러스터에 대해 설정한 이름을 적어 두고 아래 워크플로의
ECS_SERVICE
변수 및ECS_CLUSTER
변수에 사용해야 합니다. -
Amazon ECS 작업 정의를 GitHub 리포지토리에 JSON 파일로 저장합니다.
파일 형식은 생성된 출력과 동일해야 합니다:
Bash aws ecs register-task-definition --generate-cli-skeleton
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
값을 변경합니다. 환경을 구성하지 않은 경우 environment
키를 삭제합니다.
# 이 워크플로는 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에서 인증되지 않은 작업을 사용합니다.
# 작업은 타사에서 제공하며
# 별도의 서비스 약관, 개인정보처리방침, 지원 설명서에서 규정됩니다.
# 참조하세요.
# 커밋 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
항목을 참조하세요.
예시에서 사용된 서비스에 대한 자세한 내용은 다음 설명서를 참조하세요.
- Amazon AWS 설명서의 "AM의 보안 모범 사례."
- 공식 AWS "AWS 자격 증명 구성" 작업.
- 공식 AWS Amazon ECR "로그인" 작업.
- 공식 AWS Amazon ECS "렌더링 작업 정의" 작업.
- 공식 AWS Amazon ECS "작업 정의 배포" 작업.