

# 大规模运营 Amazon ECS
<a name="operating-at-scale-best-practice"></a>

在您开始大规模运营 Amazon ECS 时，请考虑一下 Amazon ECS 以及与 Amazon ECS 集成的 AWS 服务 的服务配额和 API 限制可能会如何影响您。

**Topics**
+ [

# Amazon ECS 服务配额和 API 节流限制
](operating-at-scale-service-quotas-best-practice.md)
+ [

# 处理 Amazon ECS 节流问题
](operating-at-scale-dealing-with-throttles.md)

# Amazon ECS 服务配额和 API 节流限制
<a name="operating-at-scale-service-quotas-best-practice"></a>

Amazon ECS 与多个 AWS 服务 集成，包括 Elastic Load Balancing、AWS Cloud Map 和 Amazon EC2。通过这种紧密集成，Amazon ECS 包括多项功能，例如服务负载均衡、服务发现、任务联网和集群自动扩缩。Amazon ECS 和与之集成的其他 AWS 服务 均保持服务配额和 API 速率限制，以确保一致的性能和利用率。这些服务配额还可以防止意外预置超出需求的资源，并防止可能增加账单的恶意行为。

通过自行熟悉您的服务配额和 AWS API 速率限制，您可以计划扩展工作负载，而不必担心性能意外下降。有关更多信息，请参阅 [Amazon ECS 服务配额](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-quotas.html)和[请求对 Amazon ECS API 进行节流](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/request-throttling.html)。

在 Amazon ECS 上扩缩工作负载时，请考虑以下服务配额。有关如何请求增加服务配额的说明，请参阅[在 AWS 管理控制台中管理您的 Amazon ECS 和 AWS Fargate 服务配额](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-quotas-manage.html)。
+ AWS Fargate 有限制每个 AWS 区域 中并发运行的任务数的配额。Amazon ECS 上有按需和 Fargate Spot 任务的配额。每个服务配额还包括您在 Fargate 上运行的任何 Amazon EKS 容器组（pod）。有关 Fargate 配额的更多信息，请参阅《AWS Fargate 的 Amazon Elastic Container Service 用户指南》**中的 [AWS Fargate 服务配额](https://docs.aws.amazon.com/AmazonECS/latest/userguide/service-quotas.html#service-quotas-fargate)。
+ 对于在 Amazon EC2 实例上运行的任务，您可以为每个集群注册的最大 Amazon EC2 实例数为 5,000 个。如果您将 Amazon ECS 集群自动扩缩与自动扩缩组容量提供程序一起使用，或者您自己管理集群的 Amazon EC2 实例，则此配额可能会成为部署瓶颈。如果您需要更多容量，则可以创建更多集群或请求提高服务配额。
+ 如果您将 Amazon ECS 集群自动扩缩与自动扩缩组容量提供程序一起使用，则在扩缩服务时请考虑 `Tasks in the PROVISIONING state per cluster` 配额。此配额是容量提供程序可以为其增加容量的每个集群处于 `PROVISIONING` 状态时的最大任务数。当您同时启动大量任务时，很容易达到这一配额。例如，如果您同时部署数十项服务，每项服务都有数百个任务。发生这种情况时，容量提供程序需要启动新的容器实例，以便在集群容量不足时下达任务。容量提供程序启动其他 Amazon EC2 实例时，Amazon ECS 服务计划程序很可能会继续并行启动任务。但是，由于集群容量不足，此活动可能会受到限制。Amazon ECS 服务计划程序实施了回退和指数节流策略，用于在新容器实例启动时重试任务放置。因此，您可能会遇到部署速度较慢或横向扩展时间较长的问题。为避免这种情况，您可以通过以下方式之一来规划服务部署。部署大量不需要增加集群容量的任务，或为启动新任务保留备用集群容量。

在扩缩工作负载时，除了考虑 Amazon ECS 的服务配额外，还要考虑与 Amazon ECS 集成的其他 AWS 服务 的服务配额。下一节详细介绍每项服务的关键速率限制，并提供处理潜在节流问题的建议。

## Elastic Load Balancing
<a name="operating-at-scale-service-quotas-elb"></a>

您可以将 Amazon ECS 服务配置为使用 Elastic Load Balancing 跨任务平均分配流量。有关如何选择负载均衡器的更多信息，请参阅[使用负载均衡分配 Amazon ECS 服务流量](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-load-balancing.html)。

### Elastic Load Balancing 服务配额
<a name="elb-service-quotas"></a>

在扩缩工作负载时，请考虑以下 Elastic Load Balancing 服务配额。大多数 Elastic Load Balancing 服务配额都是可调的，您可以在服务配额控制台请求增加配额。

**应用程序负载均衡器**

使用应用程序负载均衡器时，根据使用案例，您可能需要请求增加以下配额：
+  `Targets per Application Load Balancer` 配额，即应用程序负载均衡器背后的目标数量。
+ `Targets per Target Group per Region` 配额，即目标组背后的目标数量。

有关更多信息，请参阅[应用程序负载均衡器的配额](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-limits.html)。

**网络负载均衡器**

您可以向网络负载均衡器注册的目标数量有更严格的限制。使用网络负载均衡器时，您通常需要启用跨区域支持，这对 `Targets per Availability Zone Per Network Load Balancer`（每个网络负载均衡器每个可用区的最大目标数）有额外的扩缩限制。有关更多信息，请参阅[网络负载均衡器的配额](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/load-balancer-limits.html)。

### Elastic Load Balancing API 节流
<a name="elb-service-api-throttling"></a>

当您将 Amazon ECS 服务配置为使用负载均衡器时，必须通过目标组运行状况检查才能视为运行正常。为了执行这些运行状况检查，Amazon ECS 会代表您调用 Elastic Load Balancing API 操作。如果您的账户中有大量服务配置了负载均衡器，则可能会减慢服务部署速度，因为可能会有专门针对 `RegisterTarget`、`DeregisterTarget` 和 `DescribeTargetHealth` Elastic Load Balancing API 操作的节流。发生节流时，您的 Amazon ECS 服务事件消息中会出现节流错误。

如果您遇到 AWS Cloud Map API 节流，则可以联系 支持 以获取有关如何提高 AWS Cloud Map API 节流限制的指导。有关监控和排查此类节流错误的更多信息，请参阅[处理节流问题](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/operating-at-scale-dealing-with-throttles.html)。

## 弹性网络接口
<a name="elastic-network-interfaces"></a>

您的任务使用 `awsvpc` 网络模式时，Amazon ECS 会为每个任务预置一个唯一的弹性网络接口（ENI）。当您的 Amazon ECS 服务使用 Elastic Load Balancing 负载均衡器时，这些网络接口也会注册为服务中定义的相应目标组的目标。

### 弹性网络接口服务配额
<a name="eni-service-quotas"></a>

当您运行使用 `awsvpc` 网络模式的任务时，每个任务都会附加一个唯一的弹性网络接口。如果必须通过互联网访问这些任务，则请为这些任务的弹性网络接口分配公有 IP 地址。在扩缩 Amazon ECS 工作负载时，请考虑以下两个重要配额：
+ `Network interfaces per Region` 配额，即您的账户 AWS 区域 中的最大网络接口数。
+ `Elastic IP addresses per Region` 配额，即 AWS 区域 中的最大弹性 IP 地址数。

这两个服务配额均可调，您可以从服务配额控制台请求增加这些配额。有关更多信息，请参阅 [Amazon VPC 服务配额](https://docs.aws.amazon.com/vpc/latest/userguide/amazon-vpc-limits.html#vpc-limits-enis)。

对于托管在 Amazon EC2 实例上的 Amazon ECS 工作负载，运行使用 `awsvpc` 网络模式的任务时，请考虑 `Maximum network interfaces` 服务配额，即每个 Amazon EC2 实例的最大网络实例数。此配额限制了您可以在实例上放置的任务数。您无法调整该配额，并且其在服务配额控制台中不可用。有关更多信息，请参阅《Amazon EC2 用户指南》**中的[每种实例类型的每个网络接口的 IP 地址数](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html#AvailableIpPerENI)。

尽管您无法更改可以附加到 Amazon EC2 实例的网络接口的数量，但您可以使用弹性网络接口中继功能增加可用的网络接口数。例如，默认情况下，一个 `c5.large` 实例最多可能有 3 个网络接口。实例的主网络接口计为一个。因此，您可以向该实例再附加两个网络接口。由于每个使用 `awsvpc` 网络模式的任务都需要一个网络接口，因此，您通常只能在该实例类型上运行两个此类任务。这可能会导致未充分利用集群容量。如果您启用弹性网络接口中继，则可以增加网络接口密度，以在每个实例上放置更多的任务数。开启中继后，一个 `c5.large` 实例最多可以有 12 个网络接口。实例具有主网络接口，而 Amazon ECS 会创建一个“中继”网络接口并将此接口附加到该实例。因此，使用此配置后，您可以在实例上运行 10 个任务，而不是默认的两个任务。有关更多信息，请参阅[弹性网络接口中继](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/container-instance-eni.html)。

### 弹性网络接口 API 节流
<a name="eni-api-throttles"></a>

当您运行使用 `awsvpc` 网络模式的任务时，Amazon ECS 依赖于以下 Amazon EC2 API。这些 API 都有不同的 API 限制。有关更多信息，请参阅 [Amazon EC2 API 的请求节流](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/throttling.html)。
+ CreateNetworkInterface
+ AttachNetworkInterface
+ DetachNetworkInterface
+ DeleteNetworkInterface
+ DescribeNetworkInterfaces
+ DescribeVpcs
+ DescribeSubnets
+ DescribeSecurityGroups
+ DescribeInstances

如果 Amazon EC2 API 调用在弹性网络接口预置工作流程期间受到限制，则 Amazon ECS 服务计划程序会使用指数级回退自动重试。这些自动重试有时可能会导致任务启动延迟，从而导致部署速度变慢。发生 API 节流时，您将在服务事件消息中看到消息 `Operations are being throttled. Will try again later.`。如果您一直满足 Amazon EC2 API 限制，则可以联系 支持 以获取有关如何提高 API 节流限制的指导。有关监控和排查节流错误的更多信息，请参阅[处理节流问题](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/operating-at-scale-dealing-with-throttles.html)。

## AWS Cloud Map
<a name="cloudmap"></a>

Amazon ECS 服务发现使用 AWS Cloud Map API 管理 Amazon ECS 服务的命名空间。如果您的服务有大量任务，则请考虑以下建议。有关更多信息，请参阅 [Amazon ECS 服务发现注意事项](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-discovery.html#service-discovery-considerations)。

### AWS Cloud Map 服务配额
<a name="cloudmap-service-quotas"></a>

当 Amazon ECS 服务配置为使用服务发现时，`Tasks per service` 配额（即该服务的最大任务数）会受到 AWS Cloud Map `Instances per service` 服务配额（即该服务的最大实例数）的影响。特别是，AWS Cloud Map 服务配额将您可以运行的任务数量减少到每项服务最多 1000 个任务。您不能更改 AWS Cloud Map 配额。有关更多信息，请参阅 [AWS Cloud Map 服务配额](https://docs.aws.amazon.com/general/latest/gr/cloud_map.html)。

### AWS Cloud Map API 节流
<a name="cmap-api-throttles"></a>

Amazon ECS 代表您调用 `ListInstances`、`GetInstancesHealthStatus`、`RegisterInstance` 和 `DeregisterInstance` AWS Cloud Map API。其有助于服务发现，并在您启动任务时执行运行状况检查。当同时部署使用服务发现和具有大量任务的多项服务时，这可能会导致超出 AWS Cloud Map API 节流限制。发生这种情况时，您可能会看到以下消息：`Operations are being throttled. Will try again later`（在您的 Amazon ECS 服务事件消息中），并且部署和任务启动速度变慢。AWS Cloud Map 没有记录这些 API 的节流限制。如果您因这些而遇到节流，则可以联系 支持 以获取有关提高 API 节流限制的指导。有关监控和排查此类节流错误的更多建议，请参阅[处理节流问题](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/operating-at-scale-dealing-with-throttles.html)。

# 处理 Amazon ECS 节流问题
<a name="operating-at-scale-dealing-with-throttles"></a>

节流错误分为两大类：同步节流和异步节流。

## 同步节流
<a name="synchronous-throttling"></a>

发生同步节流时，您会立即收到来自 Amazon ECS 的错误响应。如果在运行任务或创建服务时调用 Amazon ECS API，则通常会出现此类节流。有关所涉及的节流和相关节流限制的更多信息，请参阅[请求对 Amazon ECS API 进行节流](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/request-throttling.html)。

例如，当您的应用程序通过使用 AWS CLI 或 AWS SDK 发起 API 请求时，您可以修复 API 节流。为此，您可以设计应用程序以处理错误，也可以通过对 API 调用实现带有重试逻辑的指数回退和抖动策略。有关更多信息，请参阅[超时、重试和回退并抖动](https://aws.amazon.com/builders-library/timeouts-retries-and-backoff-with-jitter/)。

如果您使用 AWS SDK，则自动重试逻辑已内置且可配置。

## 异步节流
<a name="asynchronous-throttling"></a>

发生异步节流是因为异步工作流程中 Amazon ECS 或 CloudFormation 可能代表您调用 API 来预置资源。重要的是了解 Amazon ECS 代表您调用了哪些 AWS API。例如，对使用 `awsvpc` 网络模式的任务调用 `CreateNetworkInterface` API，对注册到负载均衡器的任务执行运行状况检查时调用 `DescribeTargetHealth` API。

当您的工作负载达到相当大的规模时，这些 API 操作可能会受到限制。也就是说，其可能会受到足够的限制，以违反所调用的 Amazon ECS 或 AWS 服务 强制执行的限制。例如，如果您部署了数百项服务，每项服务同时有数百个使用 `awsvpc` 网络模式的任务，则 Amazon ECS 会调用 Amazon EC2 API 操作（例如 `CreateNetworkInterface`）和 Elastic Load Balancing API 操作（例如 `RegisterTarget` 或 `DescribeTargetHealth`）分别注册弹性网络接口和负载均衡器。这些 API 调用可能会超出 API 限制，从而导致节流错误。以下是服务事件消息中包含的 Elastic Load Balancing 节流错误的示例。

```
{
   "userIdentity":{
      "arn":"arn:aws:sts::111122223333:assumed-role/AWSServiceRoleForECS/ecs-service-scheduler",
      "eventTime":"2022-03-21T08:11:24Z",
      "eventSource":"elasticloadbalancing.amazonaws.com",
      "eventName":" DescribeTargetHealth ",
      "awsRegion":"us-east-1",
      "sourceIPAddress":"ecs.amazonaws.com",
      "userAgent":"ecs.amazonaws.com",
      "errorCode":"ThrottlingException",
      "errorMessage":"Rate exceeded",
      "eventID":"0aeb38fc-229b-4912-8b0d-2e8315193e9c"
   }
}
```

当这些 API 调用与您账户中的其他 API 流量共享限制时，即使其作为服务事件发出，也可能难以监控。

## 监控节流
<a name="monitoring-throttling"></a>

确定哪些 API 请求受到限制，以及发出这些请求的人员非常重要。您可以使用 AWS CloudTrail 监控节流，并与 CloudWatch、Amazon Athena 和 Amazon EventBridge 集成。您可以将 CloudTrail 配置为将特定事件发送到 CloudWatch Logs。CloudWatch Logs 日志见解可解析和分析事件。这可识别节流事件中的详细信息，例如发出调用的用户或 IAM 角色以及发出的 API 调用数。有关更多信息，请参阅[使用 CloudWatch Logs 监控 CloudTrail 日志文件](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/monitor-cloudtrail-log-files-with-cloudwatch-logs.html)。

有关 CloudWatch Logs Insights 的更多信息以及如何查询日志文件的说明，请参阅[使用 CloudWatch Logs Insights 分析日志数据](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AnalyzingLogData.html)。

借助 Amazon Athena，您可以使用标准 SQL 创建查询和分析数据。例如，您可以创建一个 Athena 表来解析 CloudTrail 事件。有关更多信息，请参阅[使用 CloudTrail 控制台为 CloudTrail 日志创建 Athena 表](https://docs.aws.amazon.com/athena/latest/ug/cloudtrail-logs.html#create-cloudtrail-table-ct)。

创建 Athena 表后，您可以使用 SQL 查询（例如以下查询）来调查 `ThrottlingException` 错误。

将 *user-input* 替换为您的值。

```
select eventname, errorcode,eventsource,awsregion, useragent,COUNT(*) count
FROM cloudtrail_table-name
where errorcode = 'ThrottlingException'
AND eventtime between '2024-09-24T00:00:08Z' and '2024-09-23T23:15:08Z'
group by errorcode, awsregion, eventsource, useragent, eventname
order by count desc;
```

Amazon ECS 还会向 Amazon EventBridge 发送事件通知。有资源状态变更事件和服务操作事件。它们包括 API 节流事件，例如 `ECS_OPERATION_THROTTLED` 和 `SERVICE_DISCOVERY_OPERATION_THROTTLED`。有关更多信息，请参阅 [Amazon ECS 服务操作事件](ecs_service_events.md)。

AWS Lambda 等服务可以使用这些事件来执行响应操作。有关更多信息，请参阅 [处理 Amazon ECS 事件](ecs_cwet_handling.md)。

如果您运行独立任务，则某些 API 操作（例如 `RunTask`）是异步的，并且不会自动执行重试操作。在这种情况下，您可以使用 AWS Step Functions 等服务与 EventBridge 集成来重试受限制或失败的操作。有关更多信息，请参阅[管理容器任务（Amazon ECS、Amazon SNS）](https://docs.aws.amazon.com/step-functions/latest/dg/sample-project-container-task-notification.html)。

## 使用 CloudWatch 监控节流
<a name="monitoring-throttling-cw"></a>

CloudWatch 为**按 AWS 资源**下的 `Usage` 命名空间提供 API 使用情况监控。这些指标记录为 **API** 类型和指标名称 **CallCount**。您可以创建警报，以在这些指标达到特定阈值时启动。有关更多信息，请参阅[可视化服务配额并设置警报](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Quotas-Visualize-Alarms.html)。

CloudWatch 还提供异常检测功能。此功能使用机器学习，根据您启用该功能的指标的特定行为来分析和建立基准。如果出现异常的 API 活动，则您可以将此功能与 CloudWatch 警报一起使用。有关更多信息，请参阅[使用 CloudWatch 异常检测](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Anomaly_Detection.html)。

通过主动监控节流错误，您可以联系 支持 提高相关的节流限制，还可以获得针对您独特应用需求的指导。