简介
本指南介绍如何使用 GitHub Actions 构建容器化应用程序,将其推送到 Amazon Elastic Container Registry (ECR),并在将代码推送到 main
分支时将其部署到 Amazon Elastic Container Service (ECS)。
在您 GitHub 存储库中每次向 main
推送新代码时,GitHub Actions 工作流都会构建并推送一个新的容器镜像到 Amazon ECR,然后将新的任务定义部署到 Amazon ECS。
注意
如果您的 GitHub Actions 工作流需要访问支持 OpenID Connect (OIDC) 的云提供商中的资源,您可以配置您的工作流以直接向云提供商进行身份验证。这将使您能够停止将这些凭据存储为长期存在的密钥,并提供其他安全优势。有关更多信息,请参阅“关于使用 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 任务定义存储为 JSON 文件,并将其放入您的 GitHub 存储库中。
文件的格式应与以下内容生成的输出相同:
Bash aws ecs register-task-definition --generate-cli-skeleton
aws ecs register-task-definition --generate-cli-skeleton
确保在下面的工作流中将
ECS_TASK_DEFINITION
变量设置为 JSON 文件的路径。确保在下面的工作流中将
CONTAINER_NAME
变量设置为任务定义的containerDefinitions
部分中的容器名称。 -
创建名为
AWS_ACCESS_KEY_ID
和AWS_SECRET_ACCESS_KEY
的 GitHub Actions 密钥,用于存储您的 Amazon IAM 访问密钥的值。有关为 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@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
# 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@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 文档中的“IAM 中的安全最佳实践”。
- 官方 AWS“配置 AWS 凭证”操作。
- 官方 AWS Amazon ECR“登录”操作。
- 官方 AWS Amazon ECS“渲染任务定义”操作。
- 官方 AWS Amazon ECS“部署任务定义”操作。