API レート制限

API レート制限は、Compute Engine API に対して実行できるリクエストの数を規定するものです。この制限は、プロジェクトごとに適用されます。gcloud computeGoogle Cloud Console を使用する場合も、API に対してリクエストを行うため、そのリクエスト数も API レート制限の対象になります。また、サービス アカウントを使用して API にアクセスする場合も、レート制限に反映されます。

現在、プロジェクトに適用される API レート制限は、以下のカテゴリに限られています。制限はカテゴリごとに個別にカウントされるため、それぞれのカテゴリの最大制限を同時に適用できます。レート制限は 100 秒単位で適用されます。たとえば、20 リクエスト/秒という制限は、100 秒間当たりでは 2000 件のリクエストに相当します。つまり、100 秒間のうちのある時点で特定の制限に達した場合、それ以上のリクエストを実行するためには、割り当てバケットが更新されるまで待つ必要があります。

  • クエリ: *.get メソッドと *.list メソッドを除くすべてのメソッドを対象とする上限
    • プロジェクトあたりのレート: 20 リクエスト/秒
    • ユーザーあたりのレート: 20 リクエスト/秒
  • 読み取りリクエスト: *.get メソッドを対象とする上限
    • プロジェクトあたりのレート: 20 リクエスト/秒
    • ユーザーあたりのレート: 20 リクエスト/秒
  • リスト リクエスト: *.listメソッドを対象とする上限
    • プロジェクトあたりのレート: 20 リクエスト/秒
    • ユーザーあたりのレート: 20 リクエスト/秒
  • オペレーション読み取りリクエスト: *OperationsService.Get メソッドを対象とする上限
    • プロジェクトあたりのレート: 20 リクエスト/秒
    • ユーザーあたりのレート: 20 リクエスト/秒
  • 重い読み取りリクエスト: *.AggregatedList メソッドを対象とする上限
    • プロジェクトあたりのレート: 10 リクエスト/秒
    • ユーザーあたりのレート: 10 リクエスト/秒
  • 重いミューテーション リクエスト: InterconnectsServiceInterconnectAttachmentsService 機能の patchdeleteinsert メソッドを対象とする上限
    • プロジェクトあたりのレート: 10 リクエスト/秒
    • ユーザーあたりのレート: 10 リクエスト/秒
  • インスタンス SimulateMaintenanceEvent リクエスト: *.SimulateMaintenanceEvent メソッドを対象とする上限
    • プロジェクトあたりのレート: 2 リクエスト/秒
    • ユーザーあたりのレート: 2 リクエスト/秒
  • ライセンスの挿入リクエスト: *.LicensesService.Insert メソッドを対象とする上限
    • プロジェクトあたりのレート: 2 リクエスト/秒
    • ユーザーあたりのレート: 2 リクエスト/秒
  • グローバル リソースのミューテーション リクエスト - disks.createSnapshotsnapshots.deletesnapshots.setLabelsimages.insertimages.deleteimages.deprecateimages.setLabelsmachineImages.insertmachineImages.delete メソッドを対象とする上限:
    • プロジェクトあたりのレート: 5 リクエスト/秒
    • ユーザーあたりのレート: 5 リクエスト/秒

API リクエストのレート制限を引き上げる必要がある場合は、Google Cloud Console から申請できます。

ベスト プラクティス

Compute Engine で API レート上限に対処するには、次の方法をおすすめします。

  • バースト機能は慎重かつ選択的に使用します。バーストとは、短時間の間、特定のクライアントに多数の API リクエストの実行を許可する動作を指します。一般には、アプリケーションが通常より多くのトラフィック量を処理する必要があるといった例外的なシナリオに対処するために行われます。バースト機能は瞬く間に API レート制限を使い果たすため、必要な場合に限って使用するようにしてください。

  • クライアント側レート制限機能を使用します。クライアント側レート制限機能は人為的な制限を設定して、問題になっているクライアントが割り当てのうちの一定量しか使用できないようにします。これにより、1 つのクライアントが割り当てのすべてを使い尽くすことを防止できます。

  • 指数バックオフを使用して、割り当てに達するとリクエストの実行間隔が徐々に延びるようにします。これにより、サーバーで割り当てバケットを補充する時間が得られます。

  • クライアントがサーバーからのレスポンスを待たずに継続的にリクエストを送信するといった、短い間隔でのポーリングを行わないようにします。短い間隔でポーリングを行うと、不適切なリクエストの捕捉がより困難になります。こうしたリクエストは有用なデータを返すことがなくても、割り当てには計上されます。

  • アプリケーションを複数のプロジェクトに分割します。割り当てはプロジェクト レベルで適用されるため、アプリケーションを分割すれば、各アプリケーションが専用の割り当てプールを使用できます。

  • 403 エラーが発生してエラー メッセージ rateLimitExceeded が表示された場合は、しばらく待ってからリクエストを再試行します。割り当てバケットは 100 秒ごとに補充されるため、この間隔を跨ぐとリクエストは成功するはずです。