View a markdown version of this page

Amazon ECS API のリクエストスロットリング - Amazon Elastic Container Service

Amazon ECS API のリクエストスロットリング

Amazon Elastic Container Service では、リージョンごとに、各 AWS アカウントのすべての API リクエストをスロットリングします。これは、一貫したパフォーマンスを維持し、Amazon ECS のすべてのお客様に平等にサービスをご利用いただくために行われています。スロットリングにより、Amazon ECS API への呼び出しが、Amazon ECS および統合するその他の AWS サービスの両方で許可される API リクエストの最大クォータを超えないようになります。API コールは、送信元が以下であるかどうかにかかわらず、リクエストクォータの対象となります。

  • サードパーティーのアプリケーション

  • コマンドラインツール

  • Amazon ECS コンソール

API スロットリングクォータを超えると、ThrottlingException エラーコードが返されます。

An error occurred (ThrottlingException) when calling the DescribeClusters operation (reached max retries: 4): Rate exceeded. com.amazonaws.services.ecs.model.AmazonECSException: Rate exceeded (Service: AmazonECS; Status Code: 400; Error Code: ThrottlingException; Request ID: 5ed90669-e454-464d-9b2f-6523bc86f537; Proxy: null)

スロットリングの適用方法

Amazon ECS ではトークンバケットアルゴリズムを使用して、API スロットリングを実装します。このアルゴリズムでは、アカウントには、特定の数のトークンを保持するバケットがあります。バケット内のトークンの数は、特定の秒におけるスロットリングクォータを表します。

Amazon ECS は、アカウント内のすべての Amazon ECS API の API リクエスト送信のレートをリージョンごとに調べ、持続バーストの 2 種類の API スロットリングクォータを適用します。持続レートは、 オペレーションで 1 秒あたりに許可される API リクエストの平均数です。バーストレートは、任意の 1 秒で許可される API リクエストの最大数です。バーストレートでは、持続レートよりも多くの API リクエストを定期的に作成できます。その後、Amazon ECS は、時間の経過とともに許可される API リクエストのレートが持続レートに安定するまで、後続の API リクエストをスロットリングします。トークンバケットアルゴリズムでは、バケットの最大容量はバーストレートを表します。バケットリフィルレートは持続レートです。これらの用語を使用して、次の例の Amazon ECS API リクエストスロットリングの図を紹介します。

実行する API リクエストの数でスロットリングされ、各リクエストはトークンバケットから 1 つのトークンを削除します。例えば、DescribeClusters API などのクラスター読み取りアクションのバケットサイズは 50 トークンであるため、1 秒間に最大 50 個の DescribeClusters リクエストを行うことができます。1 秒間に 50 リクエストを超えると、スロットリングされ、その秒以内の残りのリクエストは失敗します。

バケットは設定されたレートで自動的に補充されます。バケットが最大容量に達していない場合、最大容量に達するまで、設定した数のトークンが毎秒追加されます。リフィルトークンが到着したときにバケットが満杯である場合、リフィルトークンは破棄されます。バケットは最大数以上のトークンを保持できません。例えば、クラスター読み取りアクションのバケットサイズ (DescribeClusters API など) が 50 トークンで、リフィルレートが 1 秒あたり 20 トークンであるとします。1 秒間に 50 の DescribeClusters API リクエストを行うと、バケットはすぐにゼロトークンに削減されます。バケットは、最大容量の 50 トークンに達するまで、毎秒最大 20 トークン補充されます。つまり、以前空だったバケットは 2.5 秒後に最大容量に達します。

API リクエストを行う前に、バケットが完全にいっぱいになるまで待つ必要はありません。トークンはバケットに追加されるとすぐに使用できます。補充トークンをすぐに使用すると、バケットが最大容量に達することはありません。例えば、クラスター読み取りアクションのバケットサイズ (DescribeClusters API など) が 50 トークンで、リフィルレートが 1 秒あたり 20 トークンであるとします。1 秒あたり 50 個の API リクエストを行ってバケットを使い果たした場合、1 秒あたり 20 個の API リクエストを引き続き行うことができます。バケットは、1 秒あたり 20 個未満の API リクエストを行う場合のみ、最大容量に補充できます。

リクエストトークンバケットのサイズとリフィルレート

リクエストレート制限の目的で、API アクションはカテゴリにグループ化されます。カテゴリ内のすべての API アクションは、同じトークンバケットを共有します。例えば、DescribeClustersListClusters API が、容量が 50、補充レートが 20 のクラスター読み取りアクションバケットを共有しているとします。この場合、すべてのクラスター読み取りアクションの API リクエストの累積数は、50 件の API リクエストの同一バーストレートクォータによって調整されます。したがって、1 秒あたり 25 の DescribeClusters と 25 の ListClusters API リクエスト、または 30 の DescribeClusters と 20 の ListClusters、または 50 の DescribeClusters と 0 の ListClusters、または 0 の DescribeClusters と 50 の ListClusters のリクエストを実行できますが、同時に 50 の DescribeClusters と 50 の ListClusters リクエストを行うことはできません。持続レートは、バケット内のすべての API リクエストに同様に累積的に適用されます。

次の表は、すべての AWS リージョンのバケット容量 (またはバースト) とリフィルレート (または持続) を示しています。すべての API アクションカテゴリは、リージョンごとに各 AWS アカウントのレートクォータを適用します。

API アクションカテゴリ アクション バケット最大容量 (またはバーストレート) バケット補充率 (または持続率)
クラスター変更アクション
  • CreateCluster

  • DeleteCluster

  • PutClusterCapacityProviders

  • UpdateCluster

  • UpdateClusterSettings

20 1
クラスター読み取りアクション
  • DescribeClusters

  • ListClusters

50 20
タスク定義変更アクション
  • DeregisterTaskDefinition

  • RegisterTaskDefinition

20 1
タスク定義読み取りアクション
  • DescribeTaskDefinition

  • ListTaskDefinitions

  • ListTaskDefinitionFamilies

50 20
タスク定義削除アクション
  • DeleteTaskDefinitions

5 1
キャパシティプロバイダー変更アクション
  • CreateCapacityProvider

  • DeleteCapacityProvider

  • UpdateCapacityProvider

10 1
キャパシティプロバイダー読み取りアクション
  • DescribeCapacityProviders

50 20
タグ変更アクション
  • TagResource

  • UntagResource

20 10
タグ読み取りアクション
  • ListTagsForResource

50 20
変更アクションの設定
  • DeleteAccountSetting

  • PutAccountSetting

  • PutAccountSettingDefault

10 1
読み取りアクションの設定
  • ListAccountSettings

50 20
クラスターリソース変更アクション
  • DeleteAttributes

  • DeregisterContainerInstance

  • ExecuteCommand

  • PutAttributes

  • RunTask1

  • StartTask

  • StopTask

  • UpdateContainerAgent

  • UpdateContainerInstancesStates

100 40
クラスターリソース読み取りアクション
  • DescribeContainerInstances

  • DescribeTasks

  • ListAttributes

  • ListContainerInstances

  • ListTasks

100 20
エージェント変更アクション
  • RegisterContainerInstance

  • SubmitAttachmentStateChanges

  • SubmitContainerStateChange

  • SubmitTaskStateChange

200 120
サービス変更アクション
  • CreateService

  • DeleteService

  • UpdateService

50 5
サービス読み取りアクション
  • DescribeServices

  • ListServices

100 20
サービスデプロイアクション
  • DescribeServiceDeployments

  • ListServiceDeployments

50 20
サービスリビジョンアクション
  • DescribeServiceRevisions

50 20

タスク保護アクション

  • UpdateTaskProtection

  • GetTaskProtection

200 80
クラスターサービスリソース読み取りアクション
  • ListServicesByNamespace

10 1

1 AWS Fargate は、「Amazon ECS デベロッパーガイド」のこちらに記載されているレートに Amazon ECS RunTask APIをさらにスロットリングします。

API スロットリングのクォータの調整

AWS アカウントの API スロットリングクォータの引き上げをリクエストできます。クォータの調整をリクエストするには、AWS サポート センターまでお問い合わせください。

API スロットリングの処理

エラーの再試行とエクスポネンシャルバックオフ戦略を実装して、スロットリングエラーがワークロードに与える影響を回避できます。AWS SDK を使用する場合、自動再試行ロジックは既に組み込まれており、設定可能です。詳細については、次のリソースを参照してください。