APIゲートウェイ・バック・エンドへのリクエストの数の制限

リクエスト・ポリシーを使用して、API Gatewayによりバックエンド・サービスに送信されるリクエスト数を制限する方法をご紹介します。

APIゲートウェイを作成し、1つ以上のAPIをデプロイした後で、通常、APIクライアントがバックエンド・サービスにリクエストを作成できるレートを制限します。たとえば、次のためです:

  • 過剰なリクエストからバック・エンドを保護することにより、高可用性およびリソースの公平な使用を維持
  • サービス拒否攻撃の防止
  • リソース使用量のコストの制約
  • APIを収益化するための使用の顧客のユーザーによる制限

APIデプロイメント仕様のすべてのルートにグローバルにレート制限を適用します。

レート制限を超えているためにリクエストが拒否された場合は、リクエストが再試行されるタイミングがレスポンス・ヘッダーで指定されます。

リクエスト・ポリシーを使用して、リクエストの数を制限します(APIデプロイメント仕様へのリクエスト・ポリシーとレスポンス・ポリシーの追加を参照)。

次を実行して、APIデプロイメント仕様にレート制限リクエスト・ポリシーを追加できます:

  • コンソールの使用
  • JSONファイルの編集

コンソールを使用したレート制限リクエスト・ポリシーの追加

コンソールを使用してAPIデプロイメント仕様にレート制限リクエスト・ポリシーを追加するには:

  1. コンソールを使用してAPIデプロイメントを作成し、「最初から」オプションを選択して、「基本情報」ページで詳細を入力します。

    詳細は、APIデプロイメントの作成によるAPIゲートウェイへのAPIのデプロイおよびAPIゲートウェイの更新を参照してください。

  2. 「Basic Information」ページの「API Request Policies」セクションで、「Rate Limiting」の横にある「Add」ボタンを選択し、次を指定します:

    • 1秒当たりのリクエスト数: APIデプロイメントに送信する1秒当たりのリクエストの最大数。
    • レート制限のタイプ: 1秒当たりの最大リクエスト数のしきい値の適用方法。
      • レート・キーとして「合計」を選択し、最大がすべてのAPIクライアントから送信されたリクエストの合計数に適用されるように指定します。
      • レート・キーとして「クライアントごと(IP)」を選択し、APIクライアントから送信されたリクエスト数(IPアドレスで識別される)に最大値が適用されるように指定します。IPv4クライアントの場合、レート制限は個々のAPIクライアントのIPv4アドレスに基づきます。IPv6クライアントの場合、レート制限は、完全なアドレスではなく、APIクライアントのIPv6 /64接頭辞に基づきます。同じIPv6 /64接頭辞を持つAPIクライアントは、レート制限のために同じクライアントとみなされます。
  3. 「Save Changes」を選択します。

  4. 「次へ」を選択し、「認証」ページで認証オプションを指定します。

    認証オプションの詳細は、「APIデプロイメントへの認証と認可の追加」を参照してください。

  5. 「次」を選択して、「ルート」ページのAPIデプロイメント内の個々のルートの詳細を入力します。APIデプロイメント仕様では、個々のルートにレート制限ポリシーを適用できないことに注意してください。

  6. 「次」を選択して、APIデプロイメント用に入力した詳細を確認します。
  7. APIデプロイメントを作成または更新するには、「作成」または「変更の保存」を選択します。
  8. (オプション) コールしてAPIが正常にデプロイされていることを確認します(APIゲートウェイにデプロイされたAPIのコールを参照)。

JSONファイルの編集によるレート制限リクエスト・ポリシーの追加

JSONファイルのAPIデプロイメント仕様にレート制限リクエスト・ポリシーを追加するには:

  1. 任意のJSONエディタを使用して、リクエスト制限を追加する既存のAPIデプロイメント仕様を編集するか、新しいAPIデプロイメント仕様を作成します(APIデプロイメント仕様の作成を参照)。

    たとえば、次の基本的なAPIデプロイメント仕様では、OCI Functionsの単純なHello Worldサーバーレス・ファンクションを単一のバック・エンドとして定義しています:

    {
      "routes": [
        {
          "path": "/hello",
          "methods": ["GET"],
          "backend": {
            "type": "ORACLE_FUNCTIONS_BACKEND",
            "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq"
          }
        }
      ]
    }
  2. routesセクションの前にrequestPoliciesセクションを挿入します(まだ存在しない場合)。例:

    {
      "requestPolicies": {},													
      "routes": [
        {
          "path": "/hello",
          "methods": ["GET"],
          "backend": {
            "type": "ORACLE_FUNCTIONS_BACKEND",
            "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq"
          }
        }
      ]
    }
  3. 次のrateLimitingポリシーを新しいrequestPoliciesセクションに追加して、仕様で定義されたすべてのルートに適用します:

    {
      "requestPolicies": {
        "rateLimiting": {
          "rateKey": "<ratekey-value>",
          "rateInRequestsPerSecond": <requests-per-second>
        }
      },													
      "routes": [
        {
          "path": "/hello",
          "methods": ["GET"],
          "backend": {
            "type": "ORACLE_FUNCTIONS_BACKEND",
            "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq"
          }
        }
      ]
    }

    ここでは:

    • <ratekey-value>は、1秒当たりのリクエストの最大しきい値の適用方法を指定します。
      • レート・キーとしてTOTALを使用して、すべてのAPIクライアントから送信されたリクエストの合計数に最大値が適用されることを指定します。
      • レート・キーとしてCLIENT_IPを使用して、APIクライアントから送信されたリクエスト数(IPアドレスで識別される)に最大値が適用されるように指定します。IPv4クライアントの場合、レート制限は個々のAPIクライアントのIPv4アドレスに基づきます。IPv6クライアントの場合、レート制限は、完全なアドレスではなく、APIクライアントのIPv6 /64接頭辞に基づきます。同じIPv6 /64接頭辞を持つAPIクライアントは、レート制限のために同じクライアントとみなされます。
    • <requests-per-second>は、APIデプロイメントに送信する1秒当たりの最大数です。

    例:

    {
      "requestPolicies": {
        "rateLimiting": {
          "rateKey": "CLIENT_IP",
          "rateInRequestsPerSecond": 10
        }
      },													
      "routes": [
        {
          "path": "/hello",
          "methods": ["GET"],
          "backend": {
            "type": "ORACLE_FUNCTIONS_BACKEND",
            "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq"
          }
        }
      ]
    }
  4. APIデプロイメント仕様を含むJSONファイルを保存します。
  5. APIデプロイメント仕様は、次の方法でAPIデプロイメントを作成または更新するときに使用します:

    • JSONファイルをコンソールで「既存のAPIのアップロード」オプションで指定します
    • APIゲートウェイREST APIへのリクエストでJSONファイルを指定します

    詳細は、APIデプロイメントの作成によるAPIゲートウェイへのAPIのデプロイおよびAPIゲートウェイの更新を参照してください。

  6. (オプション) コールしてAPIが正常にデプロイされていることを確認します(APIゲートウェイにデプロイされたAPIのコールを参照)。