Google Cloud Armor でレート制限を構成する

このドキュメントでは、Cloud Service Mesh クライアントに fairshare レート制限を適用して、サービスの公平な使用を管理し、悪意のあるクライアントや不正な動作をするクライアントがサービスに過剰な負荷をかけるのを防ぐ方法について説明します。

構成プロセスでは、Cloud Armor セキュリティ ポリシーとエンドポイント ポリシーを作成する必要があります。Cloud Armor セキュリティ ポリシーの詳細については、セキュリティ ポリシーの概要をご覧ください。

レート制限の仕組み

レート制限は、サービスの可用性を向上させ、使用可能な容量をクライアント間で公平に共有するために、一定の時間間隔内にサービスがクライアントから受信できるリクエストの数を制限します。Cloud Armor がレート制限しきい値を超える受信トラフィックに適用するリクエストしきい値、間隔、アクションは、ユーザーが構成できます。Cloud Service Mesh のレート制限では、Cloud Armor はセキュリティ ポリシー タイプ CLOUD_ARMOR_INTERNAL_SERVICE を使用し、セキュリティ ポリシー ルールは fairshare アクションを使用します。

各 Cloud Armor セキュリティ ポリシーには 1 つ以上のルールが含まれています。各ルールは、一致条件とアクションで構成されます。リクエストが一致条件を満たすと、Cloud Armor は構成済みのアクションをリクエストに適用します。レート制限を構成するときには、前述のレート制限アクションのいずれかと、ユースケースに適合する一致条件(フラグ --src-ip-ranges "*" を使用してすべての受信リクエストを照合するなど)を含むセキュリティ ポリシー ルールを作成します。ポリシー内のルールは優先度の順に評価されます。数値優先度が最も小さいルールが、最も高い論理優先度を持ち、最初に評価されます。Cloud Armor はサーバーサイドのレート制限を実行します。つまり、レート制限はクライアント デバイスではなくサーバーによって適用されます。

レート制限アクションには、レート制限しきい値を微調整するために使用する追加のフィールドがあります。次のフィールドは、すべてのレート制限ルールで共有されます。

  • rate_limit_threshold_count: ユーザーが構成した時間間隔あたりのリクエスト数。Cloud Armor はこの構成でレート制限を適用します。
  • interval_sec: rate_limit_threshold_count の時間間隔(秒単位)。
  • exceed_action: レート制限のしきい値を超えるリクエストに対して実行するアクション。
  • conform_action: レート制限のしきい値を超えないリクエストに対して実行するアクション。

Cloud Service Mesh によるレート制限

このセクションでは、Cloud Service Mesh でレート制限を構成するために必要な手順の概要について説明します。

まず、エンドポイント ポリシーを作成し、EndpointMatcher が Cloud Service Mesh インスタンスを選択して、インバウンド トラフィックにレート制限を適用するようにします。EndpointMatcher は、エンドポイント ラベルを使用して、アタッチするインスタンスを識別します。

次に、タイプ CLOUD_ARMOR_INTERNAL_SERVICE の Cloud Armor セキュリティ ポリシーを作成します。このセキュリティ ポリシー タイプで使用できるアクションは fairshare のみです。このポリシーでは、優先度の高いルールに一致しないすべてのトラフィックに fairshare レート制限を適用する fairshare アクションを含むデフォルト ルールを作成します。優先度の高い新しいルールを追加して、さまざまな種類のトラフィックに異なるレート制限を適用できます。たとえば、特定の IP アドレス範囲に低いレート制限または高いレート制限を設定できます。

最後に、1 つ以上のレート制限ルールを含むセキュリティ ポリシーを作成したら、エンドポイント ポリシーに接続します。セキュリティ ポリシーに接続すると、Cloud Armor は、ルールの一致条件に一致し、EndpointMatcher によって選択されたサービス メッシュ インスタンスに接続するすべての受信トラフィックにサーバーサイドのレート制限を適用します。

Cloud Service Mesh は、すべてのインスタンスにグローバル レート制限を構成します。つまり、すべてのサーバー インスタンスの合計トラフィック量が集計され、レート制限を適用するタイミングが決定されます。このようなサービスにリクエストを送信するクライアントには、同じ適用しきい値とポリシーが適用されます。つまり、集計されたトラフィック レートがしきい値を超えると、一部のリクエストがドロップされます。

Cloud Service Mesh でレート制限を構成するには、Envoy で Google Cloud Armor のレート制限を構成するをご覧ください。

制限事項

Cloud Armor でレート制限を構成する場合は、次の制限事項を考慮してください。

  • Cloud Armor の割り当てにより、作成できるカスタムルールの数が制限されます。20 個を超えるカスタムルールを作成する前に、割り当てを確認することをおすすめします。
  • 各エンドポイント ポリシー リソースは、異なるセキュリティ ポリシーを参照する必要があります。セキュリティ ポリシーが既存のエンドポイント ポリシーですでに参照されている場合、そのセキュリティ ポリシーを新しいエンドポイント ポリシーに接続することはできません。
  • fairshare アクションを含むセキュリティ ポリシーは、ALL レート制限キーに制限されます。
  • fairshare アクションを使用してセキュリティ ポリシーをデプロイすると、Cloud Armor はルールの適用時に preview フィールドを無視します。
  • TCP トラフィック ルーティングを使用している場合は、Cloud Armor セキュリティ ポリシーを構成できません。

また、CLOUD_ARMOR_INTERNAL_SERVICE タイプの Cloud Armor セキュリティ ポリシーは、次のカスタム式言語(CEL)属性に制限されます。

  • request.headers
  • request.method
  • request.path
  • request.scheme
  • request.query

CEL 属性の詳細については、カスタムルール言語属性の構成をご覧ください。