

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

# Amazon 弹性容器服务和 CodeDeploy 蓝绿色部署操作参考
<a name="action-reference-ECSbluegreen"></a>

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

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

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

**注意**  
本主题介绍了 Amazon ECS 到 CodeDeploy 蓝/绿部署操作。 CodePipeline有关中 Amazon ECS 标准部署操作的参考信息 CodePipeline，请参阅[Amazon Elastic Container Service 部署操作参考](action-reference-ECS.md)。

**Topics**
+ [操作类型](#action-reference-ECSbluegreen-type)
+ [配置参数](#action-reference-ECSbluegreen-config)
+ [输入构件](#action-reference-ECSbluegreen-input)
+ [输出构件](#action-reference-ECSbluegreen-output)
+ [服务角色权限：`CodeDeployToECS` 操作](#edit-role-codedeploy-ecs)
+ [操作声明](#action-reference-ECSbluegreen-example)
+ [另请参阅](#action-reference-ECSbluegreen-links)

## 操作类型
<a name="action-reference-ECSbluegreen-type"></a>
+ 类别：`Deploy`
+ 拥有者：`AWS`
+ 提供方：`CodeDeployToECS`
+ 版本：`1`

## 配置参数
<a name="action-reference-ECSbluegreen-config"></a>

**ApplicationName**  
是否必需：是  
中的应用程序名称 CodeDeploy。在创建管道之前，您必须已经在中创建了应用程序 CodeDeploy。

**DeploymentGroupName**  
是否必需：是  
为您为 CodeDeploy 应用程序创建的 Amazon ECS 任务集指定的部署组。在创建管道之前，您必须已经在中创建了部署组 CodeDeploy。

**TaskDefinitionTemplateArtifact**  
是否必需：是  
用于为部署操作提供任务定义文件的输入构件的名称。这通常为源操作的输出构件的名称。使用控制台时，源操作输出构件的默认名称为 `SourceArtifact`。

**AppSpecTemplateArtifact**  
是否必需：是  
为部署操作提供 AppSpec 文件的输入对象的名称。此值会在管道运行时进行更新。这通常为源操作的输出构件的名称。使用控制台时，源操作输出构件的默认名称为 `SourceArtifact`。对于`TaskDefinition`在 AppSpec 文件中，您可以保留`<TASK_DEFINITION>`占位符文本，如下所[示](tutorials-ecs-ecr-codedeploy.md#tutorials-ecs-ecr-codedeploy-taskdefinition)。

**AppSpecTemplatePath**  
必需：否  
存储在管道源 AppSpec 文件位置（例如您的管道存储 CodeCommit 库）中的文件的文件名。默认文件名为 `appspec.yaml`。如果您的 AppSpec 文件名相同，并且存储在文件存储库的根级别，则无需提供文件名。如果路径不是默认路径，请输入路径和文件名。

**TaskDefinitionTemplatePath**  
必需：否  
存储在管道文件源位置（例如您的管道存储 CodeCommit 库）中的任务定义的文件名。默认文件名为 `taskdef.json`。如果您的任务定义文件同名且存储在文件存储库的根级别，则无需提供文件名。如果路径不是默认路径，请输入路径和文件名。

**图片 <Number>ArtifactName**  
必需：否  
用于为部署操作提供映像的输入构件的名称。这通常是映像存储库的输出构件，如 Amazon ECR 源操作的输出。  
`<Number>` 的可用值为 1 到 4。

**图片 <Number>ContainerName**  
必需：否  
映像存储库（如 Amazon ECR 源存储库）中可用映像的名称。  
`<Number>` 的可用值为 1 到 4。

## 输入构件
<a name="action-reference-ECSbluegreen-input"></a>
+ **构件数：**`1 to 5`
+ **描述：**该`CodeDeployToECS`操作首先在源文件存储库中查找任务定义文件和文件，然后在图像存储库中查找图像，然后动态生成任务定义的新修订版，最后运行 AppSpec 命令将任务集和容器部署到集群。 AppSpec 

  `CodeDeployToECS` 操作会查找将映像 URI 映射到映像的 `imageDetail.json` 文件。当您向 Amazon ECR 映像存储库提交更改时，管道 ECR 源操作会为该提交创建 `imageDetail.json` 文件。在未自动执行操作的情况下，您还可以为管道手动添加 `imageDetail.json` 文件。有关 `imageDetail.json` 文件的信息，请参阅[用于亚马逊 ECS 部署操作的 imageDetail.json 文件 blue/green](file-reference.md#file-reference-ecs-bluegreen)。

  `CodeDeployToECS` 操作会动态生成任务定义的新修订版。在此阶段，该操作会将任务定义文件中的占位符替换为从 imageDetail.json 文件检索到的映像 URI。例如，如果您将 *IMAGE1\$1NAM* E 设置为 Image1 ContainerName 参数，则应将占位符 *< IMAGE1 \$1NAME> 指定为任务*定义文件中图像字段的值。在这种情况下， CodeDeployToECS 操作会将占位符 *< IMAGE1 \$1NAME>* 替换为从您指定为 Image1 的构件中的 ImageDetail.json 检索到的实际图像 URI。ArtifactName

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

  ```
  TaskDefinition: <TASK_DEFINITION>
  ```

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

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

## 输出构件
<a name="action-reference-ECSbluegreen-output"></a>
+ **构件数：**`0`
+ **描述：**输出构件不适用于此操作类型。

## 服务角色权限：`CodeDeployToECS` 操作
<a name="edit-role-codedeploy-ecs"></a>

对于`CodeDeployToECS`操作（blue/green deployments), the following are the minimum permissions needed to create pipelines with a CodeDeploy to Amazon ECS blue/green部署操作）。

------
#### [ 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 开发者指南》中的[标记授权时间表](https://docs.amazonaws.cn/AmazonECS/latest/developerguide/ecs-account-settings.html#tag-resources-timeline)。

您还必须添加 `iam:PassRole` 权限以使用任务 IAM 角色。有关更多信息，请参阅 [Amazon ECS 任务执行 IAM 角色](https://docs.amazonaws.cn/AmazonECS/latest/developerguide/task_execution_IAM_role.html)和[任务 IAM 角色](https://docs.amazonaws.cn/AmazonECS/latest/developerguide/task-iam-roles.html)。

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

## 操作声明
<a name="action-reference-ECSbluegreen-example"></a>

------
#### [ 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"
        }
    ]
}
```

------

## 另请参阅
<a name="action-reference-ECSbluegreen-links"></a>

下列相关资源在您使用此操作的过程中会有所帮助。
+ [教程：使用 Amazon ECR 源和 ECS-to-CodeDeploy部署创建管道](tutorials-ecs-ecr-codedeploy.md)— 本教程将引导您创建 blue/green 部署所需的 Amazon ECS 资源 CodeDeploy 和 Amazon ECS 资源。本教程展示了如何将 Docker 映像推送到 Amazon ECR，并创建 Amazon ECS 任务定义，其中列出您的 Docker 映像名称、容器名称、Amazon ECS 服务名称和负载均衡器配置。然后，本教程将引导您完成为部署创建 AppSpec 文件和管道的过程。
**注意**  
本主题和教程描述了的 CodeDeploy/ECS 蓝/绿操作。 CodePipeline有关中 ECS 标准操作的信息 CodePipeline，请参阅[教程：使用进行持续部署 CodePipeline](https://docs.amazonaws.cn/AmazonECS/latest/developerguide/ecs-cd-pipeline.html)。
+ *Amazon CodeDeploy 用户指南* — 有关如何在 blue/green 部署中使用负载均衡器、生产侦听器、目标组和您的 Amazon ECS 应用程序的信息，请参阅[教程：部署 Amazon ECS 服务](https://docs.amazonaws.cn/codedeploy/latest/userguide/tutorial-ecs-deployment.html)。《*Amazon CodeDeploy 用户指南*》中的此参考信息概述了 Amazon ECS 和的蓝/绿部署。 Amazon CodeDeploy
+ *Amazon Elastic Container Service 开发者指南*：有关使用 Docker 映像和容器、ECS 服务和集群以及 ECS 任务集的信息，请参阅[什么是 Amazon ECS？](https://docs.amazonaws.cn/AmazonECS/latest/developerguide/)