{"meta":{"title":"部署到 Amazon Elastic Container Service","intro":"了解如何在持续部署 (CD) 工作流中将项目部署到 Amazon Elastic Container Service (ECS)。","product":"GitHub Actions","breadcrumbs":[{"href":"/zh/actions","title":"GitHub Actions"},{"href":"/zh/actions/how-tos","title":"操作方法"},{"href":"/zh/actions/how-tos/deploy","title":"部署"},{"href":"/zh/actions/how-tos/deploy/deploy-to-third-party-platforms","title":"部署到第三方平台"},{"href":"/zh/actions/how-tos/deploy/deploy-to-third-party-platforms/amazon-elastic-container-service","title":"Amazon Elastic Container Service"}],"documentType":"article"},"body":"# 部署到 Amazon Elastic Container Service\n\n了解如何在持续部署 (CD) 工作流中将项目部署到 Amazon Elastic Container Service (ECS)。\n\n## 先决条件\n\n在创建 GitHub Actions 工作流之前，首先需要完成 Amazon ECR 和 ECS 的以下设置步骤：\n\n1. 创建 Amazon ECR 仓库以存储映像。\n\n   例如，使用 [AWS CLI](https://aws.amazon.com/cli/)：\n\n   ```bash copy\n   aws ecr create-repository \\\n       --repository-name MY_ECR_REPOSITORY \\\n       --region MY_AWS_REGION\n\n   ```\n\n   对于以下工作流中的变量 `MY_ECR_REPOSITORY`，务必要使用相同的 Amazon ECR 存储库名称（此处以 `ECR_REPOSITORY` 表示）。\n\n   对于以下工作流中的变量 `AWS_REGION`，务必要使用相同的亚马逊云科技区域值（此处以 `MY_AWS_REGION` 表示）。\n\n2. 创建 Amazon ECS 任务定义、群集和服务。\n\n   有关详细信息，请参阅 [Amazon ECS 控制台入门向导](https://us-east-2.console.aws.amazon.com/ecs/home?region=us-east-2#/firstRun)或 Amazon ECS 文档中的[入门指南](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/getting-started-fargate.html)。\n\n   请务必记下你为 Amazon ECS 服务和群集设置的名称，并将其用于以下工作流中的变量 `ECS_SERVICE` 和 `ECS_CLUSTER`。\n\n3. 将 Amazon ECS 任务定义存储为存储库中的 GitHub JSON 文件。\n\n   该文件的格式应与生成的输出相同：\n\n   ```bash copy\n\n   aws ecs register-task-definition --generate-cli-skeleton\n\n   ```\n\n   务必将以下工作流中的变量 `ECS_TASK_DEFINITION` 设置为 JSON 文件的路径。\n\n   务必将以下工作流中的变量 `CONTAINER_NAME` 设置为任务定义中 `containerDefinitions` 部分的容器名称。\n\n4. 创建名为 GitHub Actions 和 `AWS_ACCESS_KEY_ID` 的 `AWS_SECRET_ACCESS_KEY` 机密，用于存储您的 Amazon IAM 访问密钥值。\n\n   有关为 GitHub Actions 创建机密信息的更多信息，请参阅 [在 GitHub Actions 中使用机密](/zh/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets#creating-secrets-for-a-repository)。\n\n   对于下面使用的每项操作，请参阅文档，以了解适用于 IAM 用户的推荐 IAM 策略，以及用于处理访问密钥凭据的方法。\n\n5. （可选）配置部署环境。 环境用于描述常规部署目标，例如 `production`、`staging` 或 `development`。\n   GitHub Actions当工作流部署到环境时，环境将显示在存储库的主页上。 可以使用环境来要求审批作业以继续，限制可以触发工作流的分支，使用自定义部署保护规则控制部署，或限制对机密的访问权限。 有关创建环境的详细信息，请参阅“[管理部署环境](/zh/actions/how-tos/deploy/configure-and-manage-deployments/manage-environments)”。\n\n## 创建工作流程\n\n完成先决条件后，可以继续创建工作流程。\n\n下面的示例工作流演示了如何生成容器映像并将其推送到 Amazon ECR。 然后会使用新的映像 ID 来更新任务定义，并将任务定义部署到 Amazon ECS。\n\n务必要为工作流中 `env` 密钥的所有变量提供自己的值。\n\n如果配置了部署环境，请将 `environment` 的值更改为环境的名称。 如果未配置环境 ，或者如果工作流位于专用存储库中并且你未使用 GitHub Enterprise Cloud，请删除 `environment` 密钥。\n\n```yaml copy\n# 此工作流使用未经 GitHub 认证的操作。\n# 它们由第三方提供，并受\n# 单独的服务条款、隐私政策和支持\n# 文档。\n\n# GitHub 建议将操作固定到提交 SHA。\n# 若要获取较新版本，需要更新 SHA。\n# 还可以引用标记或分支，但该操作可能会更改而不发出警告。\n\nname: Deploy to Amazon ECS\n\non:\n  push:\n    branches:\n      - main\n\nenv:\n  AWS_REGION: MY_AWS_REGION                   # set this to your preferred AWS region, e.g. us-west-1\n  ECR_REPOSITORY: MY_ECR_REPOSITORY           # set this to your Amazon ECR repository name\n  ECS_SERVICE: MY_ECS_SERVICE                 # set this to your Amazon ECS service name\n  ECS_CLUSTER: MY_ECS_CLUSTER                 # set this to your Amazon ECS cluster name\n  ECS_TASK_DEFINITION: MY_ECS_TASK_DEFINITION # set this to the path to your Amazon ECS task definition\n                                               # file, e.g. .aws/task-definition.json\n  CONTAINER_NAME: MY_CONTAINER_NAME           # set this to the name of the container in the\n                                               # containerDefinitions section of your task definition\n\njobs:\n  deploy:\n    name: Deploy\n    runs-on: ubuntu-latest\n    environment: production\n\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v6\n\n      - name: Configure AWS credentials\n        uses: aws-actions/configure-aws-credentials@0e613a0980cbf65ed5b322eb7a1e075d28913a83\n        with:\n          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}\n          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}\n          aws-region: ${{ env.AWS_REGION }}\n\n      - name: Login to Amazon ECR\n        id: login-ecr\n        uses: aws-actions/amazon-ecr-login@62f4f872db3836360b72999f4b87f1ff13310f3a\n\n      - name: Build, tag, and push image to Amazon ECR\n        id: build-image\n        env:\n          ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}\n          IMAGE_TAG: ${{ github.sha }}\n        run: |\n          # Build a docker container and\n          # push it to ECR so that it can\n          # be deployed to ECS.\n          docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .\n          docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG\n          echo \"image=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG\" >> $GITHUB_OUTPUT\n\n      - name: Fill in the new image ID in the Amazon ECS task definition\n        id: task-def\n        uses: aws-actions/amazon-ecs-render-task-definition@c804dfbdd57f713b6c079302a4c01db7017a36fc\n        with:\n          task-definition: ${{ env.ECS_TASK_DEFINITION }}\n          container-name: ${{ env.CONTAINER_NAME }}\n          image: ${{ steps.build-image.outputs.image }}\n\n      - name: Deploy Amazon ECS task definition\n        uses: aws-actions/amazon-ecs-deploy-task-definition@df9643053eda01f169e64a0e60233aacca83799a\n        with:\n          task-definition: ${{ steps.task-def.outputs.task-definition }}\n          service: ${{ env.ECS_SERVICE }}\n          cluster: ${{ env.ECS_CLUSTER }}\n          wait-for-service-stability: true\n```\n\n## 其他阅读材料\n\n有关原始工作流模板，请参阅 [`aws.yml`](https://github.com/actions/starter-workflows/blob/main/deployments/aws.yml)（位于 GitHub Actions`starter-workflows` 仓库中）。\n\n有关这些示例中使用的服务的详细信息，请参阅以下文档：\n\n* Amazon AWS 文档中的“[IAM 的安全防御最佳实操](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)”。\n* 官方 AWS“[配置 AWS 凭据](https://github.com/aws-actions/configure-aws-credentials)”操作。\n* 官方 AWS [Amazon ECR“登录”](https://github.com/aws-actions/amazon-ecr-login)操作。\n* 官方 AWS [Amazon ECS“呈现任务定义”](https://github.com/aws-actions/amazon-ecs-render-task-definition)操作。\n* 官方 AWS [Amazon ECS“部署任务定义”](https://github.com/aws-actions/amazon-ecs-deploy-task-definition)操作。"}