简介
本指南介绍如何使用 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
确保您在下面的工作流中使用相同的 Amazon ECR 存储库名称(此处表示为
MY_ECR_REPOSITORY
)作为ECR_REPOSITORY
变量。确保您在下面的工作流中使用相同的 AWS 区域值作为
AWS_REGION
(此处表示为MY_AWS_REGION
)变量。 -
创建一个 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 策略以及处理访问密钥凭据的方法,请参阅文档。
-
可以选择配置部署环境。环境用于描述一般的部署目标,例如
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 "部署任务定义" 操作。