

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

# CodeDeploy 与 Elastic Load Balancing
<a name="integrations-aws-elastic-load-balancing"></a>

在 CodeDeploy 部署期间，当互联网流量尚未准备就绪、正在部署到或不再需要作为环境的一部分时，负载均衡器会阻止将互联网流量路由到这些实例。但是，负载均衡器扮演的确切角色取决于它是用于 blue/green 部署还是就地部署。

**注意**  
在部署中必须使用 Elastic Load Balancing 负载均衡器，在就地 blue/green 部署中是可选的。

## Elastic Load Balancing 类型
<a name="integrations-aws-elastic-load-balancing-types"></a>

Elastic Load Balancing 提供了三种可用于 CodeDeploy 部署的负载均衡器：传统负载均衡器、应用程序负载均衡器和网络负载均衡器。

Classic 负载均衡器  
在传输层进行路由和负载平衡 (TCP/SSL) or the application layer (HTTP/HTTPS)。它支持 VPC。  
Amazon ECS 部署不支持经典负载均衡器。

应用程序负载均衡器  
路由和负载均衡在应用程序层（HTTP/HTTPS）进行，并支持基于路径的路由。它可以将请求路由到您的 Virtual Private Cloud（VPC）中每个 EC2 实例或容器实例上的端口。  
 在 EC2 实例上部署时，应用程序负载均衡器目标组的目标类型必须是 `instance`；在 Fargate 上部署时，目标组的目标类型必须是 `IP`。有关更多信息，请参阅[目标类型](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-target-groups.html#target-type)。

网络负载均衡器  
路由和负载均衡在传输层（TCP/UDP 层，即第 4 层）进行，依据是从 TCP 数据包标头中而非从数据包内容中提取的地址信息。Network Load Balancer 可以处理突发流量，保留客户端的源 IP，并在负载均衡器的使用寿命内使用固定 IP。

要了解有关 Elastic Load Balancing 负载均衡器的更多信息，请参阅以下主题：
+ [什么是 Elastic Load Balancing？](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/what-is-load-balancing.html)
+ [什么是经典负载均衡器？](https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/introduction.html)
+ [什么是应用程序负载均衡器？](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html)
+ [什么是网络负载均衡器？](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/introduction.html)

## 蓝/绿部署
<a name="integrations-aws-elastic-load-balancing-blue-green"></a>

在 Elastic Load Balancing 负载均衡器后重新路由实例流量是 CodeDeploy blue/green 部署的基础。

在 blue/green 部署期间，负载均衡器允许根据您指定的规则将流量路由到已部署最新应用程序修订的部署组（替换环境）中的新实例，然后阻止来自运行先前应用程序修订的旧实例（原始环境）的流量。

替换环境中的实例注册一个或多个负载均衡器后，将取消注册原始环境中的实例，并根据您的需要终止。

对于 blue/green 部署，您可以在部署组中指定一个或多个传统负载均衡器、Application Load Balancer 目标组或 Network Load Balancer 目标组。您可以使用 CodeDeploy 控制台或 AWS CLI 将负载均衡器添加到部署组。

有关 blue/green 部署中的负载均衡器的更多信息，请参阅以下主题：
+ [在 Elastic Load Balancing 中为 CodeDeploy Amazon EC2 部署设置负载均衡器](deployment-groups-create-load-balancer.md)
+ [为 blue/green 部署创建应用程序（控制台）](applications-create-blue-green.md)
+ [为 EC2/本地部署创建 blue/green 部署组（控制台）](deployment-groups-create-blue-green.md)

## 就地部署
<a name="integrations-aws-elastic-load-balancing-in-place"></a>

在就地部署的过程中，负载均衡器可以防止 Internet 流量路由到要部署的实例；实例部署完成后，可恢复对该实例的流量路由。

如果就地部署期间未使用负载均衡器，Internet 流量在部署过程中可能仍会引向该实例。因此，您的客户可能会遇到中断、不完整或过时的 Web 应用程序。当您将 Elastic Load Balancing 负载均衡器与就地部署一起使用时，部署组中的实例将从负载均衡器中注销，使用最新的应用程序版本进行更新，然后在部署成功后作为同一部署组的一部分在负载均衡器中重新注册。 CodeDeploy 将在负载均衡器后等待最多 1 小时让实例恢复正常。如果在等待期间负载均衡器未将该实例标记为运行正常，则根据部署配置， CodeDeploy 要么移动到下一个实例，要么部署失败。

对于就地部署，您可以指定一个或多个经典负载均衡器、应用程序负载均衡器目标组或网络负载均衡器目标组。您可以将负载均衡器指定为部署组配置的一部分，也可以使用提供的脚本 CodeDeploy 来实现负载均衡器。

### 使用部署组指定就地部署负载均衡器
<a name="integrations-aws-elastic-load-balancing-in-place-deployment-group"></a>

要将负载均衡器添加到部署组，请使用 CodeDeploy 控制台或 AWS CLI。有关就地部署期间在部署组中指定负载均衡器的信息，请参阅以下主题：
+ [为就地部署创建应用程序（控制台）](applications-create-in-place.md)
+ [为就地部署创建部署组（控制台）](deployment-groups-create-in-place.md)
+ [在 Elastic Load Balancing 中为 CodeDeploy Amazon EC2 部署设置负载均衡器](deployment-groups-create-load-balancer.md)

### 使用脚本指定就地部署负载均衡器
<a name="integrations-aws-elastic-load-balancing-in-place-script"></a>

通过执行以下过程中的步骤，使用部署生命周期脚本为就地部署设置负载均衡。
**注意**  
你应该使用 CodeDeployDefault. OneAtATime 只有当您使用脚本为就地部署设置负载均衡器时，才会进行部署配置。不支持并发运行，并且 CodeDeployDefault. OneAtATime 设置可确保脚本的串行执行。有关部署配置的更多信息，请参阅[在中使用部署配置 CodeDeploy](deployment-configurations.md)。

在的 CodeDeploy 示例存储库中 GitHub，我们提供了您可以调整以使用 CodeDeploy Elastic Load Balancing 负载均衡器的说明和示例。这些存储库包含三个示例脚本（`register_with_elb.sh`、`deregister_from_elb.sh` 和 `common_functions.sh`），这些脚本提供了开始操作所需的全部代码。只需编辑这 3 个脚本中的占位符，然后从 `appspec.yml` 文件中引用这些脚本。

要 CodeDeploy 使用注册到 Elastic Load Balancing 负载均衡器的 Amazon EC2 实例进行就地部署，请执行以下操作：

1. 下载要用于就地部署的负载均衡器的类型的示例：
   + [经典负载均衡器](https://github.com/awslabs/aws-codedeploy-samples/tree/master/load-balancing/elb)
   + [应用程序负载均衡器[或网络负载均衡器](https://github.com/awslabs/aws-codedeploy-samples/tree/master/load-balancing/elb-v2)（两种类型可以使用同一脚本）](https://github.com/awslabs/aws-codedeploy-samples/tree/master/load-balancing/elb-v2)

1. 确保您的每个目标 Amazon EC2 实例都 AWS CLI 安装了。

1. 确保每个目标 Amazon EC2 实例均已附加至少一个 IAM 实例配置文件，并且具有 elasticloadbalancing:\$1 和 autoscaling:\$1 权限。

1. 将部署生命周期事件脚本（`register_with_elb.sh`、`deregister_from_elb.sh` 和 `common_functions.sh`）包含在应用程序的源代码目录中。

1. 在`appspec.yml`应用程序修订版中，提供有关 CodeDeploy 在活动期间运行`register_with_elb.sh`脚本和在**ApplicationStart**活动期间运行`deregister_from_elb.sh`脚本的**ApplicationStop**说明。

1. 如果实例属于某个 Amazon EC2 Auto Scaling 组，则可跳过此步骤。

   在 `common_functions.sh` 脚本中：
   + 如果您使用的是[经典负载均衡器](https://github.com/awslabs/aws-codedeploy-samples/tree/master/load-balancing/elb)，请在 `ELB_LIST=""` 中指定 Elastic Load Balancing 负载均衡器的名称，并对文件中的其他部署设置进行所需的任何更改。
   + 如果您使用的是[应用程序负载均衡器[或网络负载均衡器](https://github.com/awslabs/aws-codedeploy-samples/tree/master/load-balancing/elb-v2)](https://github.com/awslabs/aws-codedeploy-samples/tree/master/load-balancing/elb-v2)，请在 `TARGET_GROUP_LIST=""` 中指定 Elastic Load Balancing 目标组的名称，并对文件中的其他部署设置进行所需的任何更改。

1. 将应用程序的源代码、`appspec.yml` 和部署生命周期事件脚本绑定到一个应用程序修订中，然后上传该修订。将该修订部署到 Amazon EC2 实例。在部署期间，部署生命周期事件脚本将向负载均衡器取消注册 Amazon EC2 实例，等待连接耗尽，然后在部署完成后向负载均衡器重新注册 Amazon EC2 实例。