

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

# 教程：将应用程序部署到 Amazon ECS
<a name="tutorial-ecs-deployment"></a>

 在本教程中，您将学习如何使用将应用程序部署到 Amazon ECS 中 CodeDeploy。您从已经创建并部署到 Amazon ECS 中的应用程序开始。第一步是采用新的标签修改应用程序的任务定义文件，以更新应用程序。接下来，您将使用 CodeDeploy 来部署更新。在部署期间，将更新 CodeDeploy 安装到新的替换任务集中。然后，将原始任务集中 Amazon ECS 应用程序原始版本的生产流量，转移到替换任务集中更新的版本。

 在 Amazon ECS 部署期间， CodeDeploy 使用配置有两个目标组和一个生产流量侦听器的负载均衡器。下图显示了部署开始之前，负载均衡器、生产侦听器、目标组以及 Amazon ECS 应用程序之间的关联方式。本教程使用应用程序负载均衡器。您也可以使用网络负载均衡器。

![\[应用程序负载均衡器或网络负载均衡器、一个生产侦听器、两个目标组、一个任务集和一个 Amazon ECS 服务。\]](http://docs.aws.amazon.com/zh_cn/codedeploy/latest/userguide/images/codedeploy-ecs-deployment-with-no-test-listener-step-1.png)


 成功部署之后，生产流量侦听器将流量提供给新的替换任务集，原始任务集终止。下图显示了成功部署后资源之间的关联方式。有关更多信息，请参阅 [在 Amazon ECS 部署过程中发生的事件](deployment-steps-ecs.md#deployment-steps-what-happens)。

![\[应用程序负载均衡器或网络负载均衡器、一个生产侦听器、两个目标组和一个替换任务集。\]](http://docs.aws.amazon.com/zh_cn/codedeploy/latest/userguide/images/codedeploy-ecs-deployment-with-no-test-listener-step-5.png)


有关如何使用将应用程序部署 AWS CLI 到 Amazon ECS 的信息，请参阅[教程：使用 blue/green 部署创建服务](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-blue-green.html)。有关 CodePipeline 如何使用检测和自动部署对 Amazon ECS 服务的更改的信息 CodeDeploy，请参阅[教程：使用 Amazon ECR 源和 ECS-to-CodeDeploy部署创建管道](https://docs.aws.amazon.com/codepipeline/latest/userguide/tutorials-ecs-ecr-codedeploy.html)。

完成本教程后，您可以使用您创建的 CodeDeploy 应用程序和部署组在中添加部署验证测试[教程：部署具有验证测试的 Amazon ECS 服务](tutorial-ecs-deployment-with-hooks.md)。

**Topics**
+ [先决条件](tutorial-ecs-prereqs.md)
+ [步骤 1：更新 Amazon ECS 应用程序](tutorial-ecs-update-the-ecs-application.md)
+ [步骤 2：创建 AppSpec 文件](tutorial-ecs-create-appspec-file.md)
+ [步骤 3：使用 CodeDeploy 控制台部署应用程序](tutorial-ecs-deployment-deploy.md)
+ [步骤 4：清除](tutorial-ecs-clean-up.md)

# 先决条件
<a name="tutorial-ecs-prereqs"></a>

要完成本教程，您首先必须：
+  完成 [入门 CodeDeploy](getting-started-codedeploy.md) 中的步骤 2 和步骤 3。
+  创建配置有两个目标组和一个侦听器的应用程序负载均衡器。有关使用控制台创建负载均衡器的信息，请参阅 [为 A CodeDeploy mazon ECS 部署设置负载均衡器、目标组和侦听器](deployment-groups-create-load-balancer-for-ecs.md)。有关使用创建负载均衡器的信息 AWS CLI，请参阅《*亚马逊弹性容器服务用户指南》*中的[步骤 1：创建应用程序负载均衡](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-blue-green.html#create-blue-green-loadbalancer)器。在创建负载均衡器时，记录以下内容以用于本教程：
  +  负载均衡器的名称。
  +  目标组的名称。
  +  负载均衡器侦听器所用的端口。
+  创建 Amazon ECS 集群和服务 有关更多信息，请参阅《*亚马逊弹性容器服务用户指南》*中的[教程：使用 blue/green 部署创建服务](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-blue-green.html)中的步骤 2、3 和 4。记录以下内容以用于本教程：
  +  Amazon ECS 集群的名称。
  +  Amazon ECS 服务所用的任务定义的 ARN。
  +  Amazon ECS 服务所用的容器的名称。
+  为您的 AppSpec 文件创建一个 Amazon S3 存储桶。

# 步骤 1：更新 Amazon ECS 应用程序
<a name="tutorial-ecs-update-the-ecs-application"></a>

 在本部分中，您将采用新的任务定义修订更新 Amazon ECS 应用程序。更新后的修订添加了新的标签键对。在[步骤 3：使用 CodeDeploy 控制台部署应用程序](tutorial-ecs-deployment-deploy.md)中，您将部署 Amazon ECS 应用程序的更新版本。

**更新任务定义**

1. 在 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2) 中打开控制台。

1.  在导航窗格中，选择 **Task Definitions**。

1. 选择 Amazon ECS 服务使用的任务定义。

1. 选择任务定义修订版，然后选择**创建新的修订**、**创建新的修订**。

1.  在本教程中，通过添加标签对任务定义进行细微更新。在页面底部的**标签**中，输入新的键值对以创建新的标签。

1.  选择**创建**。

   任务定义的修订号增加 1。

1.  选择 **JSON** 选项卡。记录以下内容，因为下一步需要这些信息。
   +  `taskDefinitionArn` 的值。其格式为 `arn:aws:ecs:aws-region:account-id:task-definition/task-definition-family:task-definition-revision`。这是已更新的任务定义的 ARN。
   +  `containerDefinitions` 元素中 `name` 的值。这是容器的名称。
   +  `portMappings` 元素中 `containerPort` 的值。这是容器的端口。

# 步骤 2：创建 AppSpec 文件
<a name="tutorial-ecs-create-appspec-file"></a>

 在本节中，您将创建 AppSpec 文件并将其上传到您在本[先决条件](tutorial-ecs-prereqs.md)节中创建的 Amazon S3 存储桶。Amazon ECS 部署 AppSpec 的文件指定了您的任务定义、容器名称和容器端口。有关更多信息，请参阅[AppSpec Amazon ECS 部署的文件示例](reference-appspec-file-example.md#appspec-file-example-ecs)和[AppSpec Amazon ECS 部署的 “资源” 部分](reference-appspec-file-structure-resources.md#reference-appspec-file-structure-resources-ecs)。

**创建您的 AppSpec 文件**

1.  如果要使用 YAML 创建 AppSpec 文件，请创建一个名为`appspec.yml`的文件。如果要使用 JSON 创建 AppSpec 文件，请创建一个名为的文件`appspec.json`。

1.  根据您的 AppSpec 文件使用的是 YAML 还是 JSON，选择相应的选项卡，然后将其内容复制到刚刚创建 AppSpec 的文件中。对于 `TaskDefinition` 属性，请使用您在 [步骤 1：更新 Amazon ECS 应用程序](tutorial-ecs-update-the-ecs-application.md) 部分中记下的任务定义 ARN。

------
#### [ JSON AppSpec ]

   ```
   {
     "version": 0.0,
     "Resources": [
       {
         "TargetService": {
           "Type": "AWS::ECS::Service",
           "Properties": {
             "TaskDefinition": "arn:aws:ecs:aws-region-id:aws-account-id:task-definition/ecs-demo-task-definition:revision-number",
             "LoadBalancerInfo": {
               "ContainerName": "your-container-name",
               "ContainerPort": your-container-port
             }
           }
         }
       }
     ]
   }
   ```

------
#### [ YAML AppSpec ]

   ```
   version: 0.0
   Resources:
     - TargetService:
         Type: AWS::ECS::Service
         Properties:
           TaskDefinition: "arn:aws:ecs:aws-region-id:aws-account-id:task-definition/ecs-demo-task-definition:revision-number"
           LoadBalancerInfo:
             ContainerName: "your-container-name"
             ContainerPort: your-container-port
   ```

------
**注意**  
 替换任务集继承了原始任务集的子网、安全组、平台版本以及分配的公有 IP 值。您可以通过在 AppSpec 文件中设置替换任务集的可选属性来覆盖这些值。有关更多信息，请参阅[AppSpec Amazon ECS 部署的 “资源” 部分](reference-appspec-file-structure-resources.md#reference-appspec-file-structure-resources-ecs)和[AppSpec Amazon ECS 部署的文件示例](reference-appspec-file-example.md#appspec-file-example-ecs)。

1.  将您的 AppSpec 文件上传到您创建的 S3 存储桶，这是本教程的先决条件。

# 步骤 3：使用 CodeDeploy 控制台部署应用程序
<a name="tutorial-ecs-deployment-deploy"></a>

 在本节中，您将创建一个 CodeDeploy 应用程序和部署组，以便将更新的应用程序部署到 Amazon ECS 中。在部署期间，将应用程序的生产流量 CodeDeploy 转移到新的替换任务集中的新版本。要完成此步骤，您需要以下各项：
+  Amazon ECS 集群名称。
+  Amazon ECS 服务名称。
+  应用程序负载均衡器名称。
+  生产侦听器端口。
+  目标组名称。
+  您创建的 S3 存储桶的名称。

**创建 CodeDeploy 应用程序**

1. 登录 AWS 管理控制台 并打开 CodeDeploy 控制台，网址为[https://console.aws.amazon.com/codedeploy/](https://console.aws.amazon.com/codedeploy/)。

1. 选择**创建应用程序**。

1. 在 **Application name（应用程序名称）**中，输入 **ecs-demo-codedeploy-app**。

1. 在 **Compute platform（计算平台）**中，选择 **Amazon ECS**。

1. 选择**创建应用程序**。

**创建 CodeDeploy 部署组**

1. 在应用程序页面的 **Deployment groups（部署组）**选项卡上，选择 **Create deployment group（创建部署组）**。

1. 在 **Deployment group name（部署组名称）**中，输入 **ecs-demo-dg**。

1. 在**服务角色**中，选择一个授予 CodeDeploy 对 Amazon ECS 访问权限的服务角色。有关更多信息，请参阅 [的身份和访问管理 AWS CodeDeploy](security-iam.md)。

1. 在**环境配置**中，选择 Amazon ECS 集群名称和服务名称。

1. 从**负载均衡器**中，选择将流量提供给 Amazon ECS 服务的负载均衡器的名称。

1. 在**生产侦听器端口**中，选择将生产流量提供给 Amazon ECS 服务的侦听器的端口和协议（例如，**HTTP: 80**）。本教程不包括可选的测试侦听器，因此请勿从 **Test listener port（测试侦听器端口）**中选择端口。

1. 从 **Target group 1 name（目标组 1 名称）**和 **Target group 2 name（目标组 2 名称）**中，选择两个不同的目标组以在部署期间路由流量。请确保它们是您为负载均衡器创建的目标组。哪个用于目标组 1 和哪个用于目标组 2 并不重要。

1. 选择 **Reroute traffic immediately（立即重新路由流量）**。

1. 对于 **Original revision termination（原始修订终止）**，选择 0 天、0 小时和 5 分钟。与使用默认值（1 小时）相比，这可以让您更快地完成部署。  
![\[CodeDeploy 控制台的环境配置部分。\]](http://docs.aws.amazon.com/zh_cn/codedeploy/latest/userguide/images/ecs-demo-create-acd-dg.png)

1. 选择 **Create deployment group（创建部署组）**。

**部署您的 Amazon ECS 应用程序**

1. 从部署组控制台页面中，选择 **Create deployment（创建部署）**。

1.  对于**部署组**，选择**ecs-demo-dg**。

1.  对于 **Revision type（修订类型）**，选择 **My application is stored in Amazon S3（我的应用程序存储在 Amazon S3 中）**。在 **Revision location（修订位置）**中，输入 S3 存储桶的名称。

1.  对于 **Revision file type（修订文件类型）**，根据情况选择 **.json** 或 **.yaml**。

1.  （可选）在 **Deployment description（部署描述）**框中，为部署输入描述。

1. 选择 **Create deployment（创建部署）**。

1.  您可以在 **Deployment status（部署状态）**中监控部署。在生产流量已全部路由至替换任务集并等待五分钟之后，您可以选择**终止原始任务集**，以立即终止原始任务集。如果未选择 **Terminate original task set（终止原始任务集）**，则原始任务集将在您指定的五分钟等待时间到期后终止。  
![\[CodeDeploy 控制台的部署状态部分。\]](http://docs.aws.amazon.com/zh_cn/codedeploy/latest/userguide/images/ecs-tutorial-deployment-status-without-test-listener.png)

# 步骤 4：清除
<a name="tutorial-ecs-clean-up"></a>

 下一个教程 [教程：部署具有验证测试的 Amazon ECS 服务](tutorial-ecs-deployment-with-hooks.md) 建立在本教程的基础上，使用的是您创建的 CodeDeploy 应用程序和部署组。如果您希望遵循该教程中的步骤，请跳过此步骤，不要删除您创建的资源。

**注意**  
 您的 AWS 账户不会因您创建的 CodeDeploy 资源而产生费用。

这些步骤中的资源名称是本教程中建议的名称（**ecs-demo-codedeploy-app**例如， CodeDeploy 应用程序的名称）。如果您使用的是不同的名称，请确保在清除过程中使用这些名称。

1. 使用[delete-deployment-group](https://docs.aws.amazon.com/cli/latest/reference/deploy/delete-deployment-group.html)命令删除 CodeDeploy 部署组。

   ```
   aws deploy delete-deployment-group --application-name ecs-demo-codedeploy-app --deployment-group-name ecs-demo-dg --region aws-region-id
   ```

1. 使用 [delete-application 命令删除应用程序](https://docs.aws.amazon.com/cli/latest/reference/deploy/delete-application.html)。 CodeDeploy 

   ```
   aws deploy delete-application --application-name ecs-demo-codedeploy-app --region aws-region-id
   ```