教程:使用 Amazon ECS 标准部署 CodePipeline - Amazon CodePipeline
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

教程:使用 Amazon ECS 标准部署 CodePipeline

本教程可帮助您使用 Amazon 创建完整的 end-to-end 持续部署 (CD) 管ECS道 CodePipeline。

重要

作为在控制台中创建管道的一部分,S3 工件存储桶将 CodePipeline用于项目。(这与用于 S3 源操作的存储桶不同。) 如果 S3 工件存储桶与您的管道账户位于不同的账户中,请确保 S3 工件存储桶归其所有 Amazon Web Services 账户 ,该存储桶是安全且可靠的。

注意

本教程适用于 Amazon 的ECS标准部署操作 CodePipeline。有关中使用 Amazon ECS 进行 CodeDeploy 蓝/绿部署操作的教程 CodePipeline,请参阅。教程:使用 Amazon ECR 源代码和 ECS-to-部署创建管道 CodeDeploy

先决条件

您必须先部署一些资源,然后才能使用本教程创建您的 CD 管道。以下是您在开始操作之前需要的资源:

注意

所有这些资源都应在同一个 Amazon 区域内创建。

  • 包含您的 Dockerfile 和应用程序源的源代码控制存储库(本教程使用 CodeCommit)。有关更多信息,请参阅《Amazon CodeCommit 用户指南》中的 “创建 CodeCommit存储库”。

  • 一个 Docker 映像存储库(本教程使用 AmazonECR),其中包含您从 Dockerfile 和应用程序源构建的映像。有关更多信息,请参阅 Amazon Elastic Container Registry 用户指南 中的创建存储库推送映像

  • 引用您的镜像存储库中托管的 Docker 镜像的 Amazon ECS 任务定义。有关更多信息,请参阅 Amazon Elastic Container Service 开发者指南 中的创建任务定义

    重要

    Amazon 的ECS标准部署操作会根据亚马逊ECS服务使用的修订版 CodePipeline 创建自己的任务定义修订版。如果您在不更新 Amazon ECS 服务的情况下为任务定义创建新的修订,则部署操作将忽略这些修订。

    以下是本教程中使用的一个任务定义示例。您对 namefamily 使用的值将在下一步中用于构建规范文件。

    { "ipcMode": null, "executionRoleArn": "role_ARN", "containerDefinitions": [ { "dnsSearchDomains": null, "environmentFiles": null, "logConfiguration": { "logDriver": "awslogs", "secretOptions": null, "options": { "awslogs-group": "/ecs/hello-world", "awslogs-region": "us-west-2", "awslogs-stream-prefix": "ecs" } }, "entryPoint": null, "portMappings": [ { "hostPort": 80, "protocol": "tcp", "containerPort": 80 } ], "command": null, "linuxParameters": null, "cpu": 0, "environment": [], "resourceRequirements": null, "ulimits": null, "dnsServers": null, "mountPoints": [], "workingDirectory": null, "secrets": null, "dockerSecurityOptions": null, "memory": null, "memoryReservation": 128, "volumesFrom": [], "stopTimeout": null, "image": "image_name", "startTimeout": null, "firelensConfiguration": null, "dependsOn": null, "disableNetworking": null, "interactive": null, "healthCheck": null, "essential": true, "links": null, "hostname": null, "extraHosts": null, "pseudoTerminal": null, "user": null, "readonlyRootFilesystem": null, "dockerLabels": null, "systemControls": null, "privileged": null, "name": "hello-world" } ], "placementConstraints": [], "memory": "2048", "taskRoleArn": null, "compatibilities": [ "EC2", "FARGATE" ], "taskDefinitionArn": "ARN", "family": "hello-world", "requiresAttributes": [], "pidMode": null, "requiresCompatibilities": [ "FARGATE" ], "networkMode": "awsvpc", "cpu": "1024", "revision": 1, "status": "ACTIVE", "inferenceAccelerators": null, "proxyConfiguration": null, "volumes": [] }
  • 运行使用您前面提到的任务定义的服务的 Amazon ECS 集群。有关更多信息,请参阅 Amazon Elastic Container Service 开发者指南 中的创建集群创建服务

在满足这些先决条件后,您可以继续完成本教程并创建您的 CD 管道。

步骤 1:将构建规范文件添加至您的源存储库

本教程 CodeBuild 用于构建 Docker 镜像并将镜像推送到亚马逊ECR。向您的源代码存储库中添加一个buildspec.yml文件以说明 CodeBuild如何执行此操作。下面的示例构建规范将执行以下操作:

  • 构建前阶段:

    • 登录亚马逊ECR。

    • 将存储库设置URI为您的ECR图像,并添加一个包含源 Git 提交 ID 前七个字符的图像标签。

  • 构建阶段:

    • 构建 Docker 映像并使用 Git 提交 ID 将该映像标记为 latest

  • 构建后阶段:

    • 将包含两个标签的图像推送到您的ECR存储库。

    • 在构建根目录imagedefinitions.json中写一个名为的文件,其中包含您的 Amazon ECS 服务的容器名称以及图像和标签。您的 CD 管道的部署阶段将使用此信息来创建您的服务的任务定义的新修订,然后它会将该服务更新为使用此新任务定义。该imagedefinitions.json文件是ECS作业工作人员所必需的。

粘贴此示例文本以创建您的 buildspec.yml 文件,然后替换映像和任务定义的值。此文本使用示例账户 ID 111122223333。

version: 0.2 phases: pre_build: commands: - echo Logging in to Amazon ECR... - aws --version - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin 111122223333.dkr.ecr.us-west-2.amazonaws.com - REPOSITORY_URI=012345678910.dkr.ecr.us-west-2.amazonaws.com/hello-world - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7) - IMAGE_TAG=${COMMIT_HASH:=latest} build: commands: - echo Build started on `date` - echo Building the Docker image... - docker build -t $REPOSITORY_URI:latest . - docker tag $REPOSITORY_URI:latest $REPOSITORY_URI:$IMAGE_TAG post_build: commands: - echo Build completed on `date` - echo Pushing the Docker images... - docker push $REPOSITORY_URI:latest - docker push $REPOSITORY_URI:$IMAGE_TAG - echo Writing image definitions file... - printf '[{"name":"hello-world","imageUri":"%s"}]' $REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json artifacts: files: imagedefinitions.json

构建规范是为中先决条件提供的示例任务定义编写的,Amazon ECS 服务在本教程中使用了该定义。REPOSITORY_URI 值对应于 image 存储库 (没有任何映像标签),此文件末尾附近的 hello-world 值对应于该服务的任务定义中的容器名称。

buildspec.yml 文件添加至您的源存储库
  1. 打开文本编辑器,然后将上述构建规范复制并粘贴到新文件中。

  2. 将 Docker 映像的REPOSITORY_URI值 (012345678910.dkr.ecr.us-west-2.amazonaws.com/hello-world) 替换为您的 Amazon ECR 存储库URI(不带任何图像标签)。将 hello-world 替换为引用您的 Docker 映像的服务的任务定义中的容器名称。

  3. 提交您的 buildspec.yml 文件并将其推送至源存储库。

    1. 添加文件。

      git add .
    2. 提交更改。

      git commit -m "Adding build specification."
    3. 推送提交。

      git push

步骤 2:创建持续部署管道

使用向 CodePipeline 导创建您的工作流阶段,并将源存储库连接到您的ECS服务。

创建管道
  1. 打开 CodePipeline 控制台,网址为https://console.aws.amazon.com/codepipeline/

  2. Welcome 页面上,选择 Create pipeline

    如果这是您第一次使用 CodePipeline,则会显示介绍性页面,而不是 “欢迎”。选择 Get Started Now (立即开始)

  3. 在 “步骤 1:名称” 页面上,在 “管道名称” 中,键入管道的名称。在本教程中,管道名称为 hello-world

  4. 管道类型中,选择 V2。有关更多信息,请参阅 管道类型。选择下一步

  5. 步骤 2:添加源阶段页面上,对于源提供程序,请选择 Amazon CodeCommit

    1. 在 “存储库名称” 中,选择要用作管道源位置的存储 CodeCommit库名称。

    2. 对于 Branch name (分支名称),选择要使用的分支,然后选择 Next (下一步)

  6. 步骤 3:添加构建阶段页面上,对于构建提供程序,请选择 Amazon CodeBuild,然后选择创建项目

    1. 对于 Project name,为您的构建项目选择唯一名称。在本教程中,项目名称为 hello-world

    2. 对于环境映像,选择托管映像

    3. 对于操作系统,选择 Amazon Linux 2

    4. 对于运行时,选择标准

    5. 对于映像,请选择 aws/codebuild/amazonlinux2-x86_64-standard:3.0

    6. 对于 Image version (映像版本)Environment type (环境类型),请使用默认值。

    7. 选择 Enable this flag if you want to build Docker images or want your builds to get elevated privileges (如果要构建 Docker 映像或希望您的构建获得提升的特权,请启用此标志)

    8. 取消选择CloudWatch 日志。您可能需要展开高级

    9. 选择 “继续” CodePipeline

    10. 选择下一步

      注意

      该向导会为您的构建项目创建一个名为 codebuild-的 CodeBuild 服务角色build-project-name-服务角色。请记下此角色名称,稍后再向其添加 Amazon ECR 权限。

  7. 在 “步骤 4:添加部署阶段” 页面上,对于部署提供商,选择 Amazon ECS

    1. 在集群名称中,选择运行您的服务的 Amazon ECS 集群。在本教程中,该集群为 default

    2. 对于 Service name (服务名称),选择要更新的服务,然后选择 Next (下一步)。在本教程中,服务名称为 hello-world

  8. Step 5: Review (步骤 5: 审核) 页面上,审查您的管道配置,然后选择 Create pipeline (创建管道) 以创建管道。

    注意

    既然管道已创建好,它将尝试经历不同的管道阶段。但是,向导创建的默认 CodeBuild 角色没有权限执行buildspec.yml文件中包含的所有命令,因此生成阶段将失败。下一部分将为构建阶段添加权限。

步骤 3:为 CodeBuild角色添加 Amazon ECR 权限

向 CodePipeline 导为 CodeBuild 构建项目创建了一个名为 codebuild-的IAM角色build-project-name-服务角色。在本教程中,名称为 codebuild-hello-world-service-role。由于该buildspec.yml文件会调用 Amazon ECR API 运营,因此该角色必须具有允许进行这些 Amazon ECR 调用的权限的策略。以下过程帮助您将适当权限附加到该角色。

为 CodeBuild 角色添加 Amazon ECR 权限
  1. 打开IAM控制台,网址为https://console.aws.amazon.com/iam/

  2. 在左侧导航窗格中,选择 Roles(角色)

  3. 在搜索框中,键入 codebuild-,然后选择 CodePipeline 向导创建的角色。在本教程中,角色名称为 codebuild-hello-world-service-role

  4. Summary (摘要) 页面上,选择 Attach policies (附加策略)

  5. 选中 Amazon EC2ContainerRegistryPowerUser 政策左侧的复选框,然后选择附加政策

步骤 4:测试您的管道

您的管道应该具备运行 end-to-end 原生 Amazon 持续部署所需的一切。现在,通过将代码更改推送至您的源存储库来测试管道的功能。

测试您的管道
  1. 对您的已配置源存储库进行代码更改,然后提交并推送更改。

  2. 打开 CodePipeline 控制台,网址为https://console.aws.amazon.com/codepipeline/

  3. 从列表中选择您的管道。

  4. 监视管道经历不同阶段的进度。您的管道应已完成,您的亚马逊ECS服务将运行根据您的代码更改创建的 Docker 镜像。