Amazon Elastic Container Service 和 CodeDeploy 蓝绿部署操作参考 - AWS CodePipeline

Amazon Elastic Container Service 和 CodeDeploy 蓝绿部署操作参考

您可以在 AWS CodePipeline 中配置一个管道,它将使用蓝绿部署来部署容器应用程序。在蓝绿部署中,您可以将应用程序新版本与旧版本一起启动,并在将流量重新路由到新版本之前对其进行测试。您还可以监控部署流程并且在存在问题的情况下迅速回滚。

完成的管道会检测您的映像或任务定义文件更改,并使用 CodeDeploy 将流量路由和部署到 Amazon ECS 集群和负载均衡器。CodeDeploy 会在您的负载均衡器上创建一个新侦听器,它可以通过特殊端口将您的新任务作为目标。您也可以将管道配置为使用源位置,如 CodeCommit 存储库,该位置用于存储您的 Amazon ECS 任务定义。

在创建管道之前,您必须事先创建 Amazon ECS 资源、CodeDeploy 资源以及负载均衡器和目标组。您必须事先标记和存储映像存储库中的映像,并将任务定义和 AppSpec 文件上传到您的文件存储库。

注意

本主题介绍 CodePipeline 的 Amazon ECS 到 CodeDeploy 蓝绿部署操作。有关 CodePipeline 中的 Amazon ECS 标准部署操作的参考信息,请参阅 Amazon Elastic Container Service 部署操作参考

操作类型

  • 类别:Deploy

  • 拥有者:AWS

  • 提供方:CodeDeployToECS

  • 版本:1

配置参数

ApplicationName

必需:是

CodeDeploy 中应用程序的名称。在创建管道之前,您必须事先在 CodeDeploy 中创建应用程序。

DeploymentGroupName

必需:是

为您为 CodeDeploy 应用程序创建的 Amazon ECS 任务集指定的部署组。在创建管道之前,您必须事先在 CodeDeploy 中创建部署组。

TaskDefinitionTemplateArtifact

必需:是

用于为部署操作提供任务定义文件的输入构件的名称。这通常为源操作的输出构件的名称。使用控制台时,源操作输出构件的默认名称为 SourceArtifact

AppSpecTemplateArtifact

必需:是

用于为部署操作提供 AppSpec 文件的输入构件的名称。此值会在管道运行时进行更新。这通常为源操作的输出构件的名称。使用控制台时,源操作输出构件的默认名称为 SourceArtifact。对于 AppSpec 文件中的 TaskDefinition,您可以保留 <TASK_DEFINITION> 占位符文本,如此处所示。

AppSpecTemplatePath

必需:否

存储在管道源文件位置(如管道的 CodeCommit 存储库)的 AppSpec 文件的文件名。默认文件名为 appspec.yaml。如果您的 AppSpec 文件同名且存储在文件存储库的根级别,则无需提供文件名。如果路径不是默认路径,请输入路径和文件名。

TaskDefinitionTemplatePath

必需:否

存储在管道文件源位置(如管道的 CodeCommit 存储库)的任务定义的文件名。默认文件名为 taskdef.json。如果您的任务定义文件同名且存储在文件存储库的根级别,则无需提供文件名。如果路径不是默认路径,请输入路径和文件名。

Image<Number>ArtifactName

必需:否

用于为部署操作提供映像的输入构件的名称。这通常是映像存储库的输出构件,如 Amazon ECR 源操作的输出。

<Number> 的可用值为 1 到 4。

Image<Number>ContainerName

必需:否

映像存储库(如 Amazon ECR 源存储库)中可用映像的名称。

<Number> 的可用值为 1 到 4。

输入构件

  • 构件数:1 to 5

  • 描述:CodeDeployToECS 操作首先在源文件存储库中查找任务定义文件和 AppSpec 文件,接下来在映像存储库中查找映像,然后动态生成任务定义的新修订版,最后运行 AppSpec 命令以将任务集和容器部署到集群。

    CodeDeployToECS 操作会查找将映像 URI 映射到映像的 imageDetail.json 文件。当您向 Amazon ECR 映像存储库提交更改时,管道 ECR 源操作会为该提交创建 imageDetail.json 文件。在未自动执行操作的情况下,您还可以为管道手动添加 imageDetail.json 文件。有关 imageDetail.json 文件的信息,请参阅适用于 Amazon ECS 蓝绿部署的 imageDetail.json 文件

    CodeDeployToECS 操作会动态生成任务定义的新修订版。在此阶段,该操作会将任务定义文件中的占位符替换为从 imageDetail.json 文件检索到的映像 URI。例如,如果您将 IMAGE1_NAME 设置为 Image1ContainerName 参数,则应将占位符 <IMAGE1_NAME> 指定为任务定义文件中映像字段的值。在这种情况下,CodeDeployToECS 操作会将 <IMAGE1_NAME> 占位符替换为从您指定为 Image1ArtifactName 的构件中的 imageDetail.json 检索到的实际映像 URI。

    对于任务定义更新,CodeDeploy AppSpec.yaml 文件包含 TaskDefinition 属性。

    TaskDefinition: <TASK_DEFINITION>

    创建新任务定义后,CodeDeployToECS 操作将会更新此属性。

    对于 TaskDefinition 字段的值,占位符文本必须为 <TASK_DEFINITION>。CodeDeployToECS 操作会将此占位符替换为动态生成的任务定义的实际 ARN。

输出构件

  • 构件数:0

  • 描述:输出构件不适用于此操作类型。

服务角色权限:CodeDeployToECS 操作

对于 CodeDeployToECS 操作(蓝绿部署),下面是创建管道并使之具有 CodeDeploy 到 Amazon ECS 蓝绿部署操作所需的最低权限。

JSON
{ "Version":"2012-10-17", "Statement": [ { "Sid": "AllowCodeDeployDeploymentActions", "Action": [ "codedeploy:CreateDeployment", "codedeploy:GetDeployment" ], "Resource": [ "arn:aws:codedeploy:*:111122223333:deploymentgroup:[[ApplicationName]]/*" ], "Effect": "Allow" }, { "Sid": "AllowCodeDeployApplicationActions", "Action": [ "codedeploy:GetApplication", "codedeploy:GetApplicationRevision", "codedeploy:RegisterApplicationRevision" ], "Resource": [ "arn:aws:codedeploy:*:111122223333:application:[[ApplicationName]]", "arn:aws:codedeploy:*:111122223333:application:[[ApplicationName]]/*" ], "Effect": "Allow" }, { "Sid": "AllowCodeDeployDeploymentConfigAccess", "Action": [ "codedeploy:GetDeploymentConfig" ], "Resource": [ "arn:aws:codedeploy:*:111122223333:deploymentconfig:*" ], "Effect": "Allow" }, { "Sid": "AllowECSRegisterTaskDefinition", "Action": [ "ecs:RegisterTaskDefinition" ], "Resource": [ "*" ], "Effect": "Allow" }, { "Sid": "AllowPassRoleToECS", "Effect": "Allow", "Action": "iam:PassRole", "Resource": [ "arn:aws:iam::111122223333:role/[[PassRoles]]" ], "Condition": { "StringEquals": { "iam:PassedToService": [ "ecs.amazonaws.com", "ecs-tasks.amazonaws.com" ] } } } ] }

您可以选择加入以使用 Amazon ECS 中的标记授权。选择加入后,您必须授予以下权限:ecs:TagResource。有关如何选择加入以及如何确定是否需要权限和是否强制执行标记授权的更多信息,请参阅《Amazon Elastic Container Service 开发者指南》中的标记授权时间表

您还必须添加 iam:PassRole 权限以使用任务 IAM 角色。有关更多信息,请参阅 Amazon ECS 任务执行 IAM 角色任务 IAM 角色

您还可以将 ecs-tasks.amazonaws.com 添加到 iam:PassedToService 条件下的服务列表中,如上述示例所示。

操作声明

YAML
Name: Deploy Actions: - Name: Deploy ActionTypeId: Category: Deploy Owner: AWS Provider: CodeDeployToECS Version: '1' RunOrder: 1 Configuration: AppSpecTemplateArtifact: SourceArtifact ApplicationName: ecs-cd-application DeploymentGroupName: ecs-deployment-group Image1ArtifactName: MyImage Image1ContainerName: IMAGE1_NAME TaskDefinitionTemplatePath: taskdef.json AppSpecTemplatePath: appspec.yaml TaskDefinitionTemplateArtifact: SourceArtifact OutputArtifacts: [] InputArtifacts: - Name: SourceArtifact - Name: MyImage Region: us-west-2 Namespace: DeployVariables
JSON
{ "Name": "Deploy", "Actions": [ { "Name": "Deploy", "ActionTypeId": { "Category": "Deploy", "Owner": "AWS", "Provider": "CodeDeployToECS", "Version": "1" }, "RunOrder": 1, "Configuration": { "AppSpecTemplateArtifact": "SourceArtifact", "ApplicationName": "ecs-cd-application", "DeploymentGroupName": "ecs-deployment-group", "Image1ArtifactName": "MyImage", "Image1ContainerName": "IMAGE1_NAME", "TaskDefinitionTemplatePath": "taskdef.json", "AppSpecTemplatePath": "appspec.yaml", "TaskDefinitionTemplateArtifact": "SourceArtifact" }, "OutputArtifacts": [], "InputArtifacts": [ { "Name": "SourceArtifact" }, { "Name": "MyImage" } ], "Region": "us-west-2", "Namespace": "DeployVariables" } ] }

下列相关资源在您使用此操作的过程中会有所帮助。

  • 教程:创建包含 Amazon ECR 源和 ECS 至 CodeDeploy 部署的管道:本教程将引导您创建蓝绿部署所需的 CodeDeploy 和 Amazon ECS 资源。本教程展示了如何将 Docker 映像推送到 Amazon ECR,并创建 Amazon ECS 任务定义,其中列出您的 Docker 映像名称、容器名称、Amazon ECS 服务名称和负载均衡器配置。然后,本教程将引导您为自己的部署创建 AppSpec 文件和管道。

    注意

    本主题和教程介绍 CodePipeline 的 CodeDeploy/ECS 蓝绿部署操作。有关 CodePipeline 中的 ECS 标准操作的信息,请参阅教程:使用 CodePipeline 进行持续部署

  • AWS CodeDeploy 用户指南:如需了解如何在蓝绿部署中使用负载均衡器、生产侦听器、目标组和您的 Amazon ECS 应用程序,请参阅教程:部署 Amazon ECS 服务AWS CodeDeploy 用户指南 中的这些参考信息概述了 Amazon ECS 和 AWS CodeDeploy 的蓝绿部署。

  • Amazon Elastic Container Service 开发者指南:有关使用 Docker 映像和容器、ECS 服务和集群以及 ECS 任务集的信息,请参阅什么是 Amazon ECS?