跳至主要内容

部署到 Amazon Elastic Container Service

您可以将 Amazon Elastic Container Service (ECS) 作为持续部署 (CD) 工作流的一部分进行部署。

简介

本指南介绍如何使用 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
    
    

    确保您为以下工作流中的 ECR_REPOSITORY 变量使用相同的 Amazon ECR 存储库名称(此处由 MY_ECR_REPOSITORY 表示)。

    确保你在下面的工作流中,为AWS_REGION(此处用MY_AWS_REGION表示)变量使用相同的 AWS 区域值。

  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 用户的推荐 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

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