本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
教程:使用 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 服务的情况下为任务定义创建新的修订,则部署操作将忽略这些修订。
以下是本教程中使用的一个任务定义示例。您对
name
和family
使用的值将在下一步中用于构建规范文件。{ "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
文件添加至您的源存储库
-
打开文本编辑器,然后将上述构建规范复制并粘贴到新文件中。
-
将 Docker 映像的
REPOSITORY_URI
值 (
) 替换为您的 Amazon ECR 存储库URI(不带任何图像标签)。将012345678910.dkr.ecr.us-west-2.amazonaws.com/hello-world
替换为引用您的 Docker 映像的服务的任务定义中的容器名称。hello-world
-
提交您的
buildspec.yml
文件并将其推送至源存储库。-
添加文件。
git add .
-
提交更改。
git commit -m "Adding build specification."
-
推送提交。
git push
-
步骤 2:创建持续部署管道
使用向 CodePipeline 导创建您的工作流阶段,并将源存储库连接到您的ECS服务。
创建管道
打开 CodePipeline 控制台,网址为https://console.aws.amazon.com/codepipeline/
。 -
在 Welcome 页面上,选择 Create pipeline。
如果这是您第一次使用 CodePipeline,则会显示介绍性页面,而不是 “欢迎”。选择 Get Started Now (立即开始)。
-
在 “步骤 1:名称” 页面上,在 “管道名称” 中,键入管道的名称。在本教程中,管道名称为 hello-world。
-
在管道类型中,选择 V2。有关更多信息,请参阅 管道类型。选择下一步。
-
在步骤 2:添加源阶段页面上,对于源提供程序,请选择 Amazon CodeCommit。
-
在 “存储库名称” 中,选择要用作管道源位置的存储 CodeCommit库名称。
-
对于 Branch name (分支名称),选择要使用的分支,然后选择 Next (下一步)。
-
-
在步骤 3:添加构建阶段页面上,对于构建提供程序,请选择 Amazon CodeBuild,然后选择创建项目。
-
对于 Project name,为您的构建项目选择唯一名称。在本教程中,项目名称为 hello-world。
-
对于环境映像,选择托管映像。
-
对于操作系统,选择 Amazon Linux 2。
-
对于运行时,选择标准。
-
对于映像,请选择
aws/codebuild/amazonlinux2-x86_64-standard:3.0
。 -
对于 Image version (映像版本) 和 Environment type (环境类型),请使用默认值。
-
选择 Enable this flag if you want to build Docker images or want your builds to get elevated privileges (如果要构建 Docker 映像或希望您的构建获得提升的特权,请启用此标志)。
-
取消选择CloudWatch 日志。您可能需要展开高级。
-
选择 “继续” CodePipeline。
-
选择下一步。
注意
该向导会为您的构建项目创建一个名为 codebuild-的 CodeBuild 服务角色
build-project-name
-服务角色。请记下此角色名称,稍后再向其添加 Amazon ECR 权限。
-
-
在 “步骤 4:添加部署阶段” 页面上,对于部署提供商,选择 Amazon ECS。
-
在集群名称中,选择运行您的服务的 Amazon ECS 集群。在本教程中,该集群为 default。
-
对于 Service name (服务名称),选择要更新的服务,然后选择 Next (下一步)。在本教程中,服务名称为 hello-world。
-
-
在 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 权限
打开IAM控制台,网址为https://console.aws.amazon.com/iam/
。 -
在左侧导航窗格中,选择 Roles(角色)。
-
在搜索框中,键入 codebuild-,然后选择 CodePipeline 向导创建的角色。在本教程中,角色名称为 codebuild-hello-world-service-role。
-
在 Summary (摘要) 页面上,选择 Attach policies (附加策略)。
-
选中 Amazon EC2ContainerRegistryPowerUser 政策左侧的复选框,然后选择附加政策。
步骤 4:测试您的管道
您的管道应该具备运行 end-to-end 原生 Amazon 持续部署所需的一切。现在,通过将代码更改推送至您的源存储库来测试管道的功能。
测试您的管道
-
对您的已配置源存储库进行代码更改,然后提交并推送更改。
打开 CodePipeline 控制台,网址为https://console.aws.amazon.com/codepipeline/
。 -
从列表中选择您的管道。
-
监视管道经历不同阶段的进度。您的管道应已完成,您的亚马逊ECS服务将运行根据您的代码更改创建的 Docker 镜像。