跳至主要内容

部署到 Amazon Elastic Container Service

您可以在持续部署 (CD) 工作流中将代码部署到 Amazon Elastic Container Service (ECS)。

简介

本指南介绍如何使用 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 的设置步骤

  1. 创建一个 Amazon ECR 存储库来存储您的镜像。

    例如,使用 AWS CLI

    Bash
    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)变量。

  2. 创建一个 Amazon ECS 任务定义、集群和服务。

    有关详细信息,请遵循 Amazon ECS 控制台上的入门向导,或 Amazon ECS 文档中的 入门指南

    确保您记下为 Amazon ECS 服务和集群设置的名称,并在下面的工作流中将它们用于 ECS_SERVICEECS_CLUSTER 变量。

  3. 将您的 Amazon ECS 任务定义存储为 JSON 文件,并将其放在您的 GitHub 存储库中。

    文件的格式应与由生成的输出相同。

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

    确保在以下工作流程中将ECS_TASK_DEFINITION变量设置为 JSON 文件的路径。

    确保在以下工作流程中将CONTAINER_NAME变量设置为任务定义的containerDefinitions部分中的容器名称。

  4. 创建名为AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY的 GitHub Actions 密钥,以存储 Amazon IAM 访问密钥的值。

    有关在 GitHub Actions 中创建密钥的更多信息,请参阅“在 GitHub Actions 中使用密钥”。

    有关以下使用的每个操作的推荐 IAM 策略以及处理访问密钥凭据的方法,请参阅文档。

  5. 可以选择配置部署环境。环境用于描述一般的部署目标,例如productionstagingdevelopment。当 GitHub Actions 工作流程部署到环境时,环境将显示在存储库的主页上。您可以使用环境来要求批准才能继续执行作业,限制哪些分支可以触发工作流程,使用自定义部署保护规则来控制部署,或限制对密钥的访问。有关创建环境的更多信息,请参阅“使用环境进行部署”。

创建工作流程

完成先决条件后,您可以继续创建工作流程。

以下示例工作流程演示了如何构建容器映像并将其推送到 Amazon ECR。然后,它使用新的映像 ID 更新任务定义,并将任务定义部署到 Amazon ECS。

确保为工作流程的env键中的所有变量提供您自己的值。

如果您配置了部署环境,请将environment的值更改为您的环境名称。如果您没有配置环境,或者您的工作流程位于私有存储库中,并且您没有使用 GitHub Enterprise Cloud,请删除environment键。

YAML
# 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

有关这些示例中使用的服务的更多信息,请参阅以下文档