Amazon Elastic Container Service
开发人员指南 (API Version 2014-11-13)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

教程:AWS CodePipeline 持续部署

本教程帮助您通过将 Amazon ECS 与 AWS CodePipeline 结合使用来创建一个完整的端到端持续部署 (CD)。

先决条件

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

注意

所有这些资源均应在同一 AWS 区域内创建。

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

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

  • 一个 Amazon ECS 任务定义,该定义引用了在您的映像存储库中托管的 Docker 映像。有关更多信息,请参阅 Amazon Elastic Container Service Developer Guide 中的创建任务定义

  • 一个 Amazon ECS 群集,该群集运行了使用您的前述任务定义的服务。有关更多信息,请参阅 Amazon Elastic Container Service Developer Guide 中的创建群集创建服务

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

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

本教程使用 AWS CodeBuild 构建您的 Docker 映像并将该映像推送至 Amazon ECR。将 buildspec.yml 文件添加至您的源代码存储库以指示 AWS CodeBuild 如何执行此操作。下面的示例构建规范将执行以下操作:

  • 构建前阶段:

    • 登录 Amazon ECR。

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

  • 构建阶段:

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

  • 构建后阶段:

    • 使用两个标签将该映像推送至 ECR 存储库。

    • 将名为 imagedefinitions.json 的文件写入到包含您的 Amazon ECS 服务的容器名称以及该映像和标签的构建根目录。您的 CD 管道的部署阶段将使用此信息来创建您的服务的任务定义的新修订,然后它会将该服务更新为使用此新任务定义。AWS CodeDeploy ECS 作业辅助角色需要 imagedefinitions.json 文件。

version: 0.2 phases: pre_build: commands: - echo Logging in to Amazon ECR... - aws --version - $(aws ecr get-login --region $AWS_DEFAULT_REGION --no-include-email) - REPOSITORY_URI=012345678910.dkr.ecr.us-west-2.amazonaws.com/hello-world - IMAGE_TAG=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7) 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 值对应于该服务的任务定义中的容器名称。

{ "taskDefinition": { "family": "hello-world", "containerDefinitions": [ { "name": "hello-world", "image": "012345678910.dkr.ecr.us-west-2.amazonaws.com/hello-world:6a57b99", "cpu": 100, "portMappings": [ { "protocol": "tcp", "containerPort": 80, "hostPort": 80 } ], "memory": 128, "essential": true } ] } }

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:创建持续部署管道

使用 AWS CodePipeline 向导创建您的管道阶段并将源存储库连接到您的 ECS 服务。

创建管道

  1. 通过以下网址打开 AWS CodePipeline 控制台:https://console.amazonaws.cn/codepipeline/

  2. Welcome 页面上,选择 Create pipeline

    如果这是您第一次使用 AWS CodePipeline,则会显示一个介绍页面,而不是 Welcome 页面。选择 Get Started Now

  3. Step 1: Name 页面上,对于 Pipeline name,键入您的管道的名称,然后选择 Next step。在本教程中,管道名称为 hello-world

  4. Step 2: Source 页面上,对于 Source provider,选择 AWS CodeCommit

    1. 对于 Repository name,选择要用作您的管道的源位置的 AWS CodeCommit 存储库的名称。

    2. 对于 Branch name,选择要使用的分支,然后选择 Next step

  5. Step 3: Build 页面上,选择 AWS CodeBuild,然后选择 Create a new build project

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

    2. 对于 Operating system,选择 Ubuntu

    3. 对于 Runtime,选择 Docker

    4. 对于版本,选择 aws/codebuild/docker:17.09.0

    5. 选择 Save build project

    6. 选择下一步

      注意

      该向导为您的构建项目创建一个名为 code-build-build-project-name-service-role 的 AWS CodeBuild 服务角色。记下此角色名称,因为稍后您要将 Amazon ECR 权限添加至该角色。

  6. Step 4: Deploy 页面上,对于 Deployment provider,选择 Amazon ECS

    1. 对于 Cluster name,选择您的服务正在其中运行的 Amazon ECS 群集。在本教程中,该群集为 default

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

  7. Step 5: Service Role 页面上,选择 Create role。在介绍要为您创建的角色的 IAM 控制台页面上,选择 Allow

  8. 选择下一步

  9. Step 6: Review 页面上,审查您的管道配置,然后选择 Create pipeline 以创建管道。

    注意

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

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

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

向 AWS CodeBuild 角色添加 Amazon ECR 权限

  1. 通过以下网址打开 IAM 控制台:https://console.amazonaws.cn/iam/

  2. 在左侧导航窗格中,选择 Roles

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

  4. Summary 页面上,选择 Attach policy

  5. 选中 AmazonEC2ContainerRegistryPowerUser 策略左侧的框,然后选择 Attach policy

步骤 4:测试您的管道

您的管道应具有运行端到端本机 AWS 持续部署所需的一切。现在,通过将代码更改推送至您的源存储库来测试管道的功能。

测试您的管道

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

  2. 通过以下网址打开 AWS CodePipeline 控制台:https://console.amazonaws.cn/codepipeline/

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

  4. 监视管道经历不同阶段的进度。您的管道应完成且您的 Amazon ECS 服务运行通过您的代码更改创建的 Docker 映像。

     AWS CodePipeline 已完成