

# Amazon ECS Service Connect 组件
<a name="service-connect-concepts-deploy"></a>

使用 Amazon ECS Service Connect 时，可以将每项 Amazon ECS 服务配置为运行接收网络请求的服务器应用程序（客户端-服务器服务），或者配置为运行发出请求的客户端应用程序（客户端服务）。

准备开始使用 Service Connect 时，从客户端-服务器服务开始。您可以向新服务或现有服务添加 Service Connect 配置。Amazon ECS 会在命名空间中创建一个 Service Connect 端点。此外，Amazon ECS 在服务中创建新部署以替换当前正在运行的任务。

现有任务和其他应用程序可以继续连接到现有端点和外部应用程序。如果客户端-服务器服务通过横向扩展来添加任务，则来自客户端的新连接将在所有任务之间保持平衡。如果客户端-服务器服务已更新，则来自客户端的新连接将在新版本的任务之间保持平衡。

现有任务无法解析并连接到新端点。只有在同一命名空间中具有 Service Connect 配置且在此部署之后开始运行的新任务才能解析并连接到此端点。

这意味着客户端应用程序的操作员可以决定其应用程序的配置何时更改，即使服务器应用程序的操作员可以随时更改其配置。每次部署命名空间中的任何服务时，命名空间中的端点列表都可能发生变化。现有任务和替换任务的行为将继续与最近部署后的行为相同。

考虑以下示例。

首先，假设您正在创建可在单个 Amazon CloudFormation 模板和单个 Amazon CloudFormation 堆栈中供公有互联网使用的应用程序。公共发现和可访问性应最后由 Amazon CloudFormation 创建，包括前端客户端服务。服务需要按此顺序创建，以防止前端客户端服务运行并向公众开放，但后端不会。这样可以避免在此期间向公众发送错误消息。在 Amazon CloudFormation 中，您必须使用 `dependsOn`，用于向 Amazon CloudFormation 指示多个 Amazon ECS 服务不能并行或同时进行。对于客户端任务连接到的每个后端客户端-服务器服务，您都应将 `dependsOn` 添加到前端客户端服务中。

其次，假设存在没有 Service Connect 配置的前端服务。任务正在连接到现有的后端服务。首先使用 **DNS** 中的相同名称或前端所用的 `clientAlias`，将客户端-服务器服务连接配置添加到后端服务。这会创建一个新部署，因此所有部署回滚检测或 Amazon Web Services 管理控制台、Amazon CLI、Amazon 开发工具包和其他方法将后端服务回滚并恢复到先前的部署和配置。如果您对后端服务的性能和行为感到满意，请向前端服务添加客户端或客户端-服务器 Service Connect 配置。只有新部署中的任务使用添加到这些新任务中的 Service Connect 代理。如果此配置有问题，通过使用部署回滚检测或 Amazon Web Services 管理控制台、Amazon CLI、Amazon 开发工具包和其他方法将后端服务回滚并恢复到先前的部署和配置，您可以回滚和恢复到以前的配置。如果您使用其他基于 DNS（而非 Service Connect）的服务发现系统，则在本地 DNS 缓存到期后，任何前端或客户端应用程序都会开始使用新端点并更改端点配置，这通常需要数小时。

## Networking
<a name="service-connect-concepts-network"></a>

默认情况下，Service Connect 代理从任务定义端口映射中侦听 `containerPort`。您的安全组规则必须允许从运行客户端的子网传入（进入）流量到此端口。

即使您在 Service Connect 服务配置中设置了端口号，这也不会更改 Service Connect 代理侦听的客户端-服务器服务的端口。当您设置此端口号时，Amazon ECS 会在这些任务内的 Service Connect 代理上更改客户端服务所连接的端点的端口。客户端服务中的代理使用 `containerPort` 连接到客户端-服务器服务中的代理。

如果要更改 Service Connect 代理侦听的端口，请更改客户端服务器服务的 Service Connect 配置中的 `ingressPortOverride`。如果您更改此端口号，则必须允许此端口上的入站流量，该端口由通往此服务的流量使用。

您的应用程序发送到为 Service Connect 配置的 Amazon ECS 服务的流量要求 Amazon VPC 和子网具有允许您使用的 `containerPort` 和 `ingressPortOverride` 端口号的路由表规则和网络 ACL 规则。

 您可以使用 Service Connect 在 VPC 之间发送流量。对路由表规则、网络 ACL 和安全组的相同要求同时适用于两种 VPC。

例如，两个集群在不同的 VPC 中创建任务。每个集群中的服务都配置为使用相同的命名空间。这两个服务中的应用程序无需任何 VPC DNS 配置即可解析命名空间中的每个端点。但是，除非 VPC 对等、VPC 或子网路由表以及 VPC 网络 ACL 允许 `containerPort` 和 `ingressPortOverride` 端口号上的流量，否则代理无法进行连接。

对于使用 `bridge` 联网模式的任务，您必须创建一个带有入站规则的安全组，该规则允许上动态端口范围内的流量。然后，将安全组分配给 Service Connect 集群中的所有 EC2 实例。

## Service Connect 代理
<a name="service-connect-concepts-proxy"></a>

如果使用 Service Connect 配置创建或更新服务，Amazon ECS 则会在每个新任务启动时为其添加一个新容器。这种使用单独容器的模式称为 `sidecar`。此容器不存在于任务定义中，您无法对其进行配置。Amazon ECS 在服务中管理容器配置。这允许您在多个服务、命名空间和任务之间重复使用相同的任务定义，而无需 Service Connect。

**代理资源**
+ 对于任务定义，您必须设置 CPU 和内存参数。

  我们建议为 Service Connect 代理容器的任务 CPU 和内存额外添加 256 个 CPU 单元和至少 64MiB 的内存。在 Amazon Fargate 上，可以设置的最低内存量为 512 MiB 内存。在 Amazon EC2 上，任务定义内存是必需的。
+ 对于该服务，您可以在 Service Connect 配置中设置日志配置。
+ 如果您希望此服务中的任务在峰值负载时每秒收到超过 500 个请求，我们建议在此 Service Connect 代理容器的任务定义中向您的任务 CPU 添加 512 个 CPU 单元。
+ 如果您希望在命名空间中创建 100 个以上的 Service Connect 服务，或者在命名空间内的所有 Amazon ECS 服务中总共创建 2000 个任务，我们建议在 Service Connect 代理容器的任务内存中添加 128 MiB 的内存。在命名空间中的所有 Amazon ECS 服务使用的每个任务定义中，您都应该执行此操作。

**代理配置**  
您的应用程序通过与应用程序相同的任务连接到 sidecar 容器中的代理。Amazon ECS 会配置任务和容器，以便只有当应用程序连接到同一命名空间中的端点名称时，应用程序才会连接到代理。所有其他流量都不使用此代理。其他流量包括同一 VPC 中的 IP 地址、Amazon 服务端点和外部流量。

**负载均衡**  
Service Connect 将代理配置为使用轮询策略在 Service Connect 端点中的任务之间进行负载均衡。连接所在任务中的本地代理在提供端点的客户端-服务器服务中挑选其中一个任务。  
例如，考虑一个在名为 *local* 的命名空间中配置为*客户端服务*的服务中运行 WordPress 的任务。还有另一项包含运行 MySQL 数据库的 2 个任务的服务。此服务配置为在同一命名空间中通过 Service Connect 提供一个称为 `mysql` 的端点。在 WordPress 任务中，WordPress 应用程序会使用端点名称连接到数据库。与该名称的连接会转到在同一个任务中在 sidecar 容器中运行的代理。然后，代理可以使用轮询策略连接到任一 MySQL 任务。  
负载均衡策略：轮询

**异常检测**  
此功能使用代理拥有的有关先前失败连接的数据，以避免向已连接失败的主机发送新连接。Service Connect 配置代理的异常检测功能以提供被动运行状况检查。  
使用上一个示例，代理可以连接到任一 MySQL 任务。如果代理与特定 MySQL 任务建立了多个连接，并且在过去 30 秒内有 5 个或以上的连接失败，则代理会在 30 到 300 秒内避开该 MySQL 任务。

** 重试**  
Service Connect 将代理配置为重试通过代理但失败的连接，第二次尝试将避免使用先前连接中的主机。这样可以确保通过 Service Connect 所进行的每次连接都不会因为一次性原因而失败。  
重试次数：2

**超时**  
Service Connect 将代理配置为客户端-服务器应用程序响应的最长等待时间。默认超时值为 15 秒，但该值可以更新。  
可选参数：  
**idleTimeout** ‐ 连接在空闲时保持活动状态的时间（以秒为单位）。值为 `0` 将禁用 `idleTimeout`。  
`HTTP`/`HTTP2`/`GRPC` 的 `idleTimeout` 默认值为 5 分钟。  
`TCP` 的 `idleTimeout` 默认值为 1 小时。  
**perRequestTimeout** – 等待上游对每个请求做出完整响应的时长。值为 `0` 将关闭 `perRequestTimeout`。仅当应用程序容器的 `appProtocol` 为 `HTTP`/`HTTP2`/`GRPC` 时才能设置此选项。默认值为 15 秒。  
如果将 `idleTimeout` 设置为小于 `perRequestTimeout` 的时间，则连接将在达到 `idleTimeout` 而不是 `perRequestTimeout` 时关闭。

## 注意事项
<a name="service-connect-considerations"></a>

在使用 Service Connect 时请注意以下事项：
+ 在 Fargate 中运行的任务必须使用 Fargate Linux 平台版本 `1.4.0` 或更高版本才能使用 Service Connect。
+ 容器实例上的 Amazon ECS 代理版本必须为 `1.67.2` 或更高版本。
+ 容器实例必须运行经 Amazon ECS 优化的 Amazon Linux 2023 AMI 版本 `20230428` 或更高版本或者经 Amazon ECS 优化的 Amazon Linux 2 AMI 版本 `2.0.20221115` 才能使用 Service Connect。除了 Amazon ECS 容器代理之外，这些版本还具有 Service Connect 代理。有关 Service Connect 代理的更多信息，请参阅 GitHub 上的 [Amazon ECS Service Connect 代理](https://github.com/aws/amazon-ecs-service-connect-agent)。
+ 容器实例必须具有对资源 `arn:aws:ecs:{{region}}:{{0123456789012}}:task-set/{{cluster}}/*` 的 `ecs:Poll` 权限。如果您使用的是 `ecsInstanceRole`，则无需添加其他权限。`AmazonEC2ContainerServiceforEC2Role` 托管策略具有必要权限。有关更多信息，请参阅 [Amazon ECS 容器实例 IAM 角色](instance_IAM_role.md)。
+ 使用 `bridge` 网络模式并使用 Service Connect 的任务不支持 `hostname` 容器定义参数。
+ 任务定义必须设置任务内存限制才能使用 Service Connect。有关更多信息，请参阅 [Service Connect 代理](#service-connect-concepts-proxy)。
+ 不支持设置容器内存限制的任务定义。

  您可以在容器上设置容器内存限制，但必须将任务内存限制设置为大于容器内存限制总和的数字。未在容器限制中分配的任务限制中的额外 CPU 和内存将由 Service Connect 代理容器和其他未设置容器限制的容器使用。有关更多信息，请参阅 [Service Connect 代理](#service-connect-concepts-proxy)。
+ 您可以将 Service Connect 配置为使用同一区域中的任何 Amazon Cloud Map 命名空间，这些命名空间要么位于同一 Amazon Web Services 账户中，要么使用 Amazon Resource Access Manager 与您的 Amazon Web Services 账户共享。有关如何使用共享命名空间的更多信息，请参阅 [使用共享 Amazon Cloud Map 命名空间的 Amazon ECS Service Connect](service-connect-shared-namespaces.md)。
+ 每个服务所属的命名空间只能是唯一的。
+ 仅支持服务创建的任务。
+ 所有端点在命名空间内必须是唯一的。
+ 所有发现名称在命名空间内必须是唯一的。
+ 您必须重新部署现有服务，然后应用程序才能解析新的端点。在最新部署后添加到命名空间的新端点不会添加到任务配置中。有关更多信息，请参阅 [Amazon ECS Service Connect 组件](#service-connect-concepts-deploy)。
+ 删除集群时，Service Connect 不会删除命名空间。您必须删除 Amazon Cloud Map 中的命名空间。
+ 应用程序负载均衡器流量默认为在 `awsvpc` 网络模式下通过 Service Connect 代理进行路由。如果您希望非服务流量绕过 Service Connect 代理，则请在 Service Connect 服务配置中使用 `[ingressPortOverride](https://docs.amazonaws.cn/AmazonECS/latest/APIReference/API_ServiceConnectService.html)` 参数。
+ 采用 TLS 的 Service Connect 不支持 `bridge` 联网模式。仅支持 `awsvpc` 联网模式。
+ 在 `awsvpc` 模式下，Service Connect 代理将仅 IPv4 和双堆栈配置中服务的流量转发到 IPv4 本地主机 `127.0.0.1`。对于仅 IPv6 配置中的服务，代理将流量转发到 IPv6 本地主机 `::1`。我们建议将应用程序配置为侦听两个本地主机，以便在服务从仅 IPv4 或双堆栈配置更新为仅 IPv6 时获得无缝体验。有关更多信息，请参阅[EC2 的 Amazon ECS 任务联网选项](task-networking.md)和[Fargate 的 Amazon ECS 任务联网选项](fargate-task-networking.md)。

**Service Connect 不支持以下各项：**
+ Windows 容器
+ HTTP 1.0
+ 独立任务
+ 使用蓝绿部署（由 CodeDeploy 提供支持）和外部部署类型的服务
+ Service Connect 不支持 Amazon ECS Anywhere 的 `External` 容器实例。
+ PPv2
+ FIPS 模式