リクエスト要素に基づくAPIゲートウェイ・バック・エンドの動的選択

APIゲートウェイを使用したリクエストの要素に基づいて、同じAPIゲートウェイに送信されたリクエストを異なるバックエンドにルーティングする方法を確認します。

一般的な要件は、同じAPIゲートウェイに送信されたリクエストを、リクエストの要素に基づいて異なるバックエンドにルーティングすることです。たとえば、次に基づいてリクエストを異なるバックエンドにルーティングするには:

  • リクエストが送信されたホスト、ドメインまたはサブドメイン(あるいはその両方)。たとえば、同じAPIゲートウェイに送信されたcars.example.comおよびtrucks.example.comからの受信リクエストを、まったく異なる2つのバックエンドにルーティングします。
  • リクエストを送信するAPIクライアントがサブスクライブされる使用プラン。たとえば、受信リクエストを、Free Tier使用プランにサブスクライブしているAPIクライアントの標準ホスト、またはPremium Tier使用プランにサブスクライブしているAPIクライアントの高パフォーマンス・ホストにルーティングします。
  • リクエストのヘッダーおよびヘッダー値。たとえば、application/xmlの値を持つAcceptヘッダーを含むリクエストを、そのコンテンツ・タイプのレスポンスを返す適切なバックエンドにルーティングします。

バックエンドを動的に選択することで、単一のファサードをAPIコンシューマに提示し、複数のバックエンド・システムの複雑さから守ることができます。

要求を動的にルーティングできます。

  • HTTPバック・エンド
  • サーバーレス機能のバックエンド
  • 在庫応答バック・エンド

同じAPIデプロイメントに対して複数のバックエンドを定義する場合は、元のリクエストの要素に基づいて、リクエストのルーティング先のバックエンドをAPIゲートウェイが動的に選択できるようにするルールを作成します。

APIゲートウェイが正しいバックエンドを動的に選択できるようにするには、次のコンテキスト変数を使用してリクエストの要素を取得します:

  • request.auth[<key>]<key>は、認可プロバイダ・ファンクションによって戻される、またはJWTトークンに含まれるクレームの名前です。
  • request.headers[<key>]<key>は、APIへのリクエストに含まれるヘッダーの名前です。
  • 元のリクエストが送信されたホストの名前としてrequest.host
  • request.path[<key>]<key>は、APIデプロイメント仕様で定義されたパス・パラメータの名前です。
  • request.query[<key>]<key>は、APIへのリクエストに含まれる問合せパラメータの名前です。
  • request.subdomain[<key>]。ここで、<key>は、元のリクエストが送信されたホスト名の先頭部分を取得するときに無視するホスト名の末尾の部分です。
  • request.usage_plan[id]idは、APIクライアントがサブスクライブされる使用プランのOCIDです。

コンテキスト変数に複数の値がある場合は、バックエンドの選択時に最初の値のみが使用されます。コンテキスト変数の詳細は、ポリシーおよびHTTPバック・エンド定義へのコンテキスト変数の追加を参照してください。

次の方法で、APIデプロイメント仕様のバックエンドを動的に選択する基準を定義します。

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

バックエンド・ルール照合に関するノート

使用するバックエンドを決定するルールを作成するときに、特定のバックエンドにルーティングするリクエストに対して、コンテキスト変数値が特定の値と一致する必要がある程度を指定できます。完全一致を要求することも、ワイルドカードで始まる値を指定することもできます。APIゲートウェイは、指定した順序(完全一致ルールが最初に、ワイルドカード・ルールが続く)でルールを評価し、最初の一致ルールを使用します。コンテキスト変数値がバック・エンド・ルールと一致しない場合に使用するデフォルト・ルールを指定することもできます。デフォルトとしてルールが指定されておらず、受信リクエストのコンテキスト変数値がバック・エンド・ルールと一致しない場合、リクエストはエラーを返します。どのバックエンド・ルール(およびどのバックエンド)を使用するかを決定する優先順位は、次のように要約できます。

  • コンテキスト変数値がルールの値と完全に一致する場合は、そのルールを使用します。
  • それ以外の場合、コンテキスト変数値がワイルドカードで開始または終了するルールの値と一致する場合は、一致するワイルドカードを含む最初のルールを使用します。
  • それ以外の場合は、ルールがデフォルト・ルールとして指定されている場合は、そのルールを使用します。
  • そうでない場合は、エラーを返します。

コンソールを使用したAPIデプロイメント仕様への動的バック・エンド選択の追加

コンソールを使用してAPIデプロイメント仕様に動的バックエンド選択を追加するには:

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

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

  2. 「認証」ページで、APIデプロイメントでルートに対して行われたリクエストを認証する方法を指定します。

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

  3. 「ルート」ページで、新しいルートを作成し、次を指定します:

    • パス: リストされたメソッドを使用したバックエンド・サービスへのAPIコールのパス。指定するルート・パスで次の点に注意してください:

    • メソッド: バックエンド・サービスが受け入れた1つ以上のメソッド。たとえば、GET, PUTです。
  4. 「複数のバックエンドの追加」を選択して、入力したコンテキスト変数およびルールに従って、リクエストを異なるバックエンドにルーティングすることを指定します。
    1. 「セレクタ」リストから、次のように、リクエストの送信先のバックエンドを決定する際に使用するコンテキスト表(コンテキスト変数を含む)を選択します。
      • 認証:認可プロバイダ・ファンクションによって戻された、またはJWTに含まれている(およびrequest.authコンテキスト表に保存された)クレームの値を使用して、バックエンドを決定します。
      • ヘッダー:元のリクエストからのヘッダーの値(およびrequest.headersコンテキスト表に保存)を使用して、バックエンドを決定します。
      • ホスト:元のリクエストが送信されたホストの名前(リクエストのホスト・ヘッダーのホスト・フィールドから抽出され、request.hostコンテキスト表に保存)を使用して、バックエンドを決定します。
      • パス:元のリクエストからのパス・パラメータ(およびrequest.pathコンテキスト表に保存)を使用して、バックエンドを決定します。
      • 問合せパラメータ:元のリクエスト(およびrequest.queryコンテキスト表に保存)からの問合せパラメータの値を使用して、バックエンドを決定します。
      • サブドメイン:元のリクエストが送信されたホスト名の先頭部分(キーとして指定されておらず、request.subdomainコンテキスト表に保存されているホスト名のその部分のみ)を使用して、バックエンドを決定します。キーは、使用しないホスト名の末尾の部分です。
      • Usage plan OCID: Use the OCID of a usage plan to which the API client is subscribed (identified from a client token in the original request, and saved in the request.usage_plan context table) to determine the back end.
    2. 選択したコンテキスト表に応じて、リクエストの送信先となるバックエンドを決定する際に使用するキーの名前を入力します。
  5. 「バックエンドの定義」をクリックして、コンテキスト変数のルールを入力します。このルールが満たされると、定義したバックエンドにリクエストがルーティングされます。
  6. 次のようにルールの詳細を入力します。
    • 名前:ルールの名前を入力します。ログおよびメトリックを参照するときに、入力した名前を使用してバックエンドを識別します。
    • 一致タイプ:リクエストをこのバックエンドにルーティングするために入力した値と一致するコンテキスト変数値を指定します。コンテキスト変数を「値」フィールドの値と完全に一致させる場合は、「いずれか」を選択します。コンテキスト変数がワイルドカードを含む「式」フィールドの値と一致する必要がある場合は、「ワイルドカード」を選択します。「いずれか」を選択した場合は値の一致は大/小文字が区別されず、「ワイルドカード」を選択した場合は大/小文字が区別されます。
    • 値: ([マッチング タイプ]フィールドで [いずれか]を選択した場合に表示されます。)コンテキスト変数が完全に一致する必要がある値(またはカンマ区切りリスト内の複数の値)を指定します。「いずれか」を選択した場合、一致では大文字と小文字が区別されないことに注意してください。Also note that values must be unique within a single back end rule, and across all back end rules defined for the API deployment.
    • 式: (「一致タイプ」フィールドで「ワイルドカード」を選択した場合に表示されます)コンテキスト変数が一致する必要があるワイルドカードで始まる値、またはそれで終わる値を指定します。*(アスタリスク)ワイルドカードを使用して0文字以上の文字を指定し、+(プラス記号)ワイルドカードを使用して1文字以上の文字を指定します。「ワイルドカード」を選択した場合、一致では大文字と小文字が区別されることに注意してください。1つの値に複数のワイルドカードを含めることはできません。また、値の途中にワイルドカードを含めることはできません。
    • デフォルトにする:バックエンド・ルールが一致しない場合に、このルールに定義されたバックエンドを使用するかどうかを指定します。
  7. 次のようにバック・エンドの詳細を入力します。
    1. 「バックエンド・タイプ」フィールドで、入力したルールが満たされた場合にリクエストをルーティングするバックエンドとして、「HTTP/HTTPS」「Oracle Functions」「Stock response」または「Logout」を選択します。
    2. 選択したバックエンドの詳細を入力します。入力する詳細は、選択したバックエンド・タイプによって異なり、次の項目で詳細に説明されています。
    3. 「定義」をクリックして、バックエンドおよび関連するルールを作成します。
  8. (オプション)「バックエンドの定義」を再度クリックして、追加のバックエンドおよび関連するルールを定義します。
  9. (オプション)「別のルート」をクリックして、追加ルートの詳細を入力します。
  10. 「次」をクリックして、APIデプロイメント用に入力した詳細を確認します。
  11. APIデプロイメントを作成または更新するには、「作成」または「変更の保存」をクリックします。
  12. (オプション) コールしてAPIが正常にデプロイされていることを確認します(APIゲートウェイにデプロイされたAPIのコールを参照)。

Editing a JSON File to Add Dynamic Back End Selection to an API Deployment Specification

To add dynamic back end selection to an API deployment specification in a JSON file:

  1. 任意のJSONエディタを使用して、次のフォーマットで新しいAPIデプロイメント仕様を作成します(APIデプロイメント仕様の作成を参照):

    {
      "requestPolicies": {},
      "routes": [
        {
          "path": "<api-route-path>",
          "methods": ["<method-list>"],
          "backend": {
            "type": "DYNAMIC_ROUTING_BACKEND",
            "selectionSource": {
              "type": "SINGLE",
              "selector": "<context-table-key>"
            },
            "routingBackends": [
              {
                "key": {
                  "type": "<ANY_OF|WILDCARD>",
                  "values": [
                    "<context-variable-value>"
                  ],
                  "isDefault": "<true|false>",
                  "name": "<rule-name>"
                },
                "backend": {
                  "type": "<backend-type>",
                  "<backend-target>": "<identifier>"
                }
              }
            ]
          }
        }
      ]
    }
    

    ここでは:

    • "requestPolicies"は、APIデプロイメントの動作を制御するオプションのポリシーを指定します。APIデプロイメント仕様のすべてのルートにポリシーを適用する場合は、routesセクションの外にポリシーを配置します。特定のルートのみにポリシーを適用する場合は、ポリシーをroutesセクション内に配置します。APIデプロイメント仕様へのリクエスト・ポリシーとレスポンス・ポリシーの追加を参照してください。
    • <api-route-path>には、バックエンド・サービスに対してリストされているメソッドを使用して、APIコールのパスを指定します。指定するルート・パスで次の点に注意してください:

    • <method-list>は、バックエンド・サービスによって受け入れられる1つ以上のメソッドをカンマで区切って指定します。たとえば、"GET, PUT"です。
    • "type": "DYNAMIC_ROUTING_BACKEND"は、リクエストの要素に基づいてバックエンドを動的に選択することを指定します。
    • "type": "SINGLE"は、単一のコンテキスト変数を使用してバックエンドを動的に選択することを指定します。
    • "selector": "<context-table-key>"は、次のように、リクエストの送信先のバックエンドを決定するコンテキスト変数値を取得するコンテキスト表(および必要に応じてキー)を指定します。
      • request.auth[<key>] Use the value of a claim returned by an authorizer function or contained in a JSON Web Token (JWT) to determine the back end. <key> is the name of the claim.たとえば、request.auth[tenant]です。
      • request.headers[<key>]元のリクエストからのヘッダーの値を使用して、バックエンドを決定します。<key>はヘッダー名です。たとえば、request.headers[Accept]です。
      • request.host元のリクエストが送信されたホストの名前(リクエストのホスト・ヘッダーのホスト・フィールドから抽出されたもの)を使用して、バックエンドを決定します。
      • request.path[<key>]元のリクエストのパス・パラメータを使用してバックエンドを決定します。<key>はパス・パラメータ名です。たとえば、request.path[region]です。
      • request.query[<key>]元のリクエストからの問合せパラメータの値を使用して、バックエンドを決定します。<key>は問合せパラメータ名です。例: request.query[state]
      • request.subdomain[<key>]元のリクエストが送信されたホスト名の先頭部分(キーとして指定されていないホスト名のその部分のみ)を使用して、バックエンドを決定します。<key>は、使用しないホスト名の末尾の部分です。例: request.subdomain[example.com]
      • request.usage_plan[id] Use the OCID of a usage plan to which the API client is subscribed (identified from a client token in the original request) to determine the back end.
    • "key": {...}は、"backend": {...}で指定されたバックエンドにリクエストを送信するために満たす必要があるルールを指定します。
    • "type": "<ANY_OF|WILDCARD>"は、<context-table-key>で識別されるコンテキスト変数の値が、"backend": {...}で指定したバックエンドにリクエストを送信するために、<context-variable-value>に入力する値にどの程度一致する必要があるかを指定します。<context-table-key>で識別されるコンテキスト変数の値が、<context-variable-value>で指定した値と完全に一致する必要がある場合は、 ANY_OFを指定します。<context-table-key>で識別されるコンテキスト変数の値が、<context-variable-value>に指定したワイルドカードを含む値と一致する必要がある場合は、WILDCARDを指定します。値一致では、ANY_OFを指定する場合は大/小文字が区別されず、WILDCARDを指定する場合は大/小文字が区別されます。
    • <context-variable-value>は、<context-table-key>で識別されるコンテキスト変数の値と一致する可能性がある値です。複数の"<context-variable-value>"エントリをvalues:[...]配列にカンマで区切って含めることができます。リクエストは、値が一致すると、次のように"backend": {...}で指定されたバックエンドに送信されます。
      • "type": "ANY_OF"を指定した場合、値は完全に一致する必要があります。Note that values must be unique within a single back end rule, and across all back end rules defined for an API deployment.ANY_OFを指定した場合、値の一致は大/小文字が区別されません。
      • "type": "WILDCARD"を指定した場合は、ワイルドカードで始まる、またはワイルドカードで終わる<context-variable-value>の値を指定できます。*(アスタリスク)ワイルドカードを使用して0文字以上の文字を指定し、+(プラス記号)ワイルドカードを使用して1文字以上の文字を指定します。1つの値に複数のワイルドカードを含めることはできません。また、値の途中にワイルドカードを含めることはできません。WILDCARDを指定した場合、値の一致は大/小文字が区別されます。
      For example, if you want a request from an API client that can accept an xml response (as indicated in the Accept header of the request) to be routed to a back end that returns xml, you might specify:
      • "selector": "request.headers[Accept]"
      • "type": "ANY_OF"
      • "values": ["application/xml"]
    • "isDefault": "<true|false>"はオプションのブール値(trueまたはfalse)で、バックエンド・ルールが一致しない場合にこのルールのバックエンドを使用するかどうかを示します。指定されていない場合、デフォルト値のfalseが使用されます。
    • "name": "<rule-name>"は、ルールの名前を指定します。この名前を使用して、ログおよびメトリックを参照するときにバックエンドを識別します。
    • <backend-type>は、バックエンド・サービスのタイプを指定します。有効な値は、ORACLE_FUNCTIONS_BACKENDHTTP_BACKENDおよびSTOCK_RESPONSE_BACKENDです。
    • <backend-target>および<identifier>は、バックエンド・サービスを指定します。<backend-target>および<identifier>の有効な値は、次に示すように<backend-type>の値に依存します:

    For example, the following basic API deployment specification includes dynamic back end selection that routes requests based on the value of the vehicle-type query parameter passed in the request.vehicle-type問合せパラメータの値がcarの場合、リクエストはcars-api.example.comにルーティングされます。vehicle-type問合せパラメータの値がtruckまたはminivanの場合、リクエストは処理のためにOCI Functionsのサーバーレス・ファンクションにルーティングされます。vehicle-type問合せパラメータ値がcarでもtruckでもminivanでもない場合、リクエストはデフォルトでcars-api.example.comにルーティングされます。

    {
      "routes": [
        {
          "path": "/users/{path1*}",
          "methods": [
            "GET",
            "POST",
            "PUT",
            "DELETE"
          ],
          "backend": {
            "type": "DYNAMIC_ROUTING_BACKEND",
            "selectionSource": {
              "type": "SINGLE",
              "selector": "request.query[vehicle-type]"
            },
            "routingBackends": [
              {
                "key": {
                  "type": "ANY_OF",
                  "values": [
                    "cars"
                  ],
                  "isDefault": "true",
                  "name": "car-rule"
                },
                "backend": {
                  "type": "HTTP",
                  "url": "https://cars-api.example.com"
                }
              },
              {
                "key": {
                  "type": "ANY_OF",
                  "values": [
                    "minivan",
                    "truck"
                  ],
                  "name": "truck-minivan-rule"
                },
                "backend": {
                  "type": "ORACLE_FUNCTIONS_BACKEND",
                  "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq"
                }
              }
            ]
          }
        }
      ]
    }
  2. APIデプロイメント仕様を含むJSONファイルを保存します。
  3. APIデプロイメント仕様は、次の方法でAPIデプロイメントを作成または更新するときに使用します:

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

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

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

Examples of Dynamic Selection of API Gateway Back Ends

The examples in this section assume the following API deployment definition and incomplete API deployment specification in a JSON file:

{
  "displayName": "Marketing Deployment",
  "gatewayId": "ocid1.apigateway.oc1..aaaaaaaab______hga",
  "compartmentId": "ocid1.compartment.oc1..aaaaaaaa7______ysq",
  "pathPrefix": "/marketing",
  "specification": {
    "routes": [
      {
      "path": "/sales",
      "methods": [
        "GET",
        "POST",
        "PUT",
        "DELETE"
      ],
      "backend": {
        "type": "DYNAMIC_ROUTING_BACKEND",
        .
        .
        .
        }
      }
    ]
  },
  "freeformTags": {},
  "definedTags": {}
}

コンソールでダイアログを使用してAPIデプロイメント仕様を定義する場合も、例が適用されます。

例1: ホストによるバックエンドの選択

You can configure an API deployment to dynamically select a back end based on the host to which the original request was sent (extracted from the host field of the Host header in the request). This design enables you to define an API gateway that supports different tenants.

{
  "routes": [
    {
      "path": "/sales",
      "methods": [
        "GET",
        "POST",
        "PUT",
        "DELETE"
      ],
      "backend": {
        "type": "DYNAMIC_ROUTING_BACKEND",
        "selectionSource": {
          "type": "SINGLE",
          "selector": "request.host"
        },
        "routingBackends": [
          {
            "key": {
              "type": "ANY_OF",
              "values": [
                "cars.example.com"
              ],
              "isDefault": "true",
              "name": "car-rule"
            },
            "backend": {
              "type": "HTTP",
              "url": "http://cars-api.example.com"
            }
          },
          {
            "key": {
              "type": "ANY_OF",
              "values": [
                "minivans.examplecloud.com",
                "trucks.example.com"
              ],
              "name": "truck-minivan-rule"
            },
            "backend": {
              "type": "ORACLE_FUNCTIONS_BACKEND",
              "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq"
            }
          }
        ]
      }
    }
  ]
}

In this example, how the API gateway resolves a request to https://<gateway-hostname>/marketing/sales depends on the host to which the original request was sent (extracted from the host field of the Host header in the request), as follows:

  • リクエストがcars.example.comに送信された場合、リクエストはhttp://cars-api.example.comにルーティングされます。
  • リクエストがminivans.examplecloud.comまたはtrucks.example.comに送信された場合、リクエストはOCI Functionsのサーバーレス・ファンクション・バックエンドにルーティングされます。
  • リクエストが別のホストに送信された場合、リクエストはデフォルトでhttp://cars-api.example.comにルーティングされます。

例2: ホスト・サブドメインによるバックエンドの選択

You can configure an API deployment to dynamically select a back end based on a subdomain in the host string to which the original request was sent.ホスト文字列は、リクエストのホスト・ヘッダーから抽出され、指定した文字列でマスクされ、リクエストのルーティングに使用されるサブドメインが残ります。This design enables you to define an API gateway that supports different tenants.

{
  "routes": [
    {
      "path": "/sales",
      "methods": [
        "GET",
        "POST",
        "PUT",
        "DELETE"
      ],
      "backend": {
        "type": "DYNAMIC_ROUTING_BACKEND",
        "selectionSource": {
          "type": "SINGLE",
          "selector": "request.subdomain[example.com]"
        },
        "routingBackends": [
          {
            "key": {
              "type": "ANY_OF",
              "values": [
                "cars"
              ],
              "isDefault": "true",
              "name": "car-rule"
            },
            "backend": {
              "type": "HTTP",
              "url": "https://cars-api.example.com"
            }
          },
          {
            "key": {
              "type": "ANY_OF",
              "values": [
                "minivans",
                "trucks"
              ],
              "name": "truck-minivan-rule"
            },
            "backend": {
              "type": "ORACLE_FUNCTIONS_BACKEND",
              "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq"
            }
          }
        ]
      }
    }
  ]
}

In this example, how the API gateway resolves a request to https://<gateway-hostname>/marketing/sales depends on the host subdomain to which the original request was sent, as follows:

  • リクエストがcars.example.comに送信された場合、リクエストはhttp://cars-api.example.comにルーティングされます
  • リクエストがminivans.example.comまたはtrucks.example.comに送信された場合、リクエストはOCI Functionsのサーバーレス・ファンクション・バック・エンドにルーティングされます
  • リクエストがexample.comの別のサブドメイン(car.example.comsedan.example.comなど)に送信された場合、リクエストはデフォルトでhttp://cars-api.example.comにルーティングされます。

Example 3: Select back end by Host Subdomain (modifying the host name in the back end URL)

APIデプロイメントを構成して、元のリクエストが送信されたホスト文字列のサブドメインに基づいてバックエンドを動的に選択できます。ホスト文字列は、リクエストのホスト・ヘッダーから抽出され、指定した文字列でマスクされ、リクエストのルーティングに使用されるサブドメインが残ります。追加の検証のために、バックエンドURLにコンテキスト変数としてサブドメイン・マスクを含めることで、公開しようとしているバックエンドにのみリクエストがルーティングされるようにできます。

{
  "routes": [
    {
      "path": "/sales",
      "methods": [
        "GET",
        "POST",
        "PUT",
        "DELETE"
      ],
      "backend": {
        "type": "DYNAMIC_ROUTING_BACKEND",
        "selectionSource": {
          "type": "SINGLE",
          "selector": "request.subdomain[example.com]"
        },
        "routingBackends": [
          {
            "key": {
              "type": "ANY_OF",
              "values": [
                "cars",
                "hatchbacks"
              ],
              "name": "car-hatchback-rule"
            },
            "backend": {
              "type": "HTTP",
              "url": "https://${request.subdomain[example.com]}-api.example.com"
            }
          }
        ]
      }
    }
  ]
}

この例では、次のように、APIゲートウェイがリクエストをhttps://<gateway-hostname>/marketing/salesに解決する方法は、元のリクエストが送信されたホスト・サブドメインによって異なります。

  • リクエストがcars.example.comまたはhatchbacks.example.comに送信された場合、リクエストはhttp://cars-api.example.comまたはhttp://hatchbacks-api.example.comにルーティングされます。
  • リクエストがexample.comの別のサブドメイン(suvs.example.comsedans.example.comなど)に送信された場合、リクエストは失敗します。

この例に示すようにコンテキスト変数を含めることで、バックエンドURLのホスト名を変更することを検討している場合は、次の点に注意してください。

  • バックエンドURLは、selectorに指定されたコンテキスト変数を使用してのみ変更できます。
  • 許可されたバックエンドのリストを強制するには、ルールに"isDefault: "true"を設定しないでください。

例4: 使用プランによるバックエンドの選択

APIデプロイメントを構成して、APIクライアントがサブスクライブされている(元のリクエストのクライアント・トークンから識別される)使用プランのOCIDに基づいてバックエンドを動的に選択できます。使用プランのOCIDは、 request.usage_plan[id]コンテキスト変数に格納されます。

{
  "routes": [
    {
      "path": "/sales",
      "methods": [
        "GET",
        "POST",
        "PUT",
        "DELETE"
      ],
      "backend": {
        "type": "DYNAMIC_ROUTING_BACKEND",
        "selectionSource": {
          "type": "SINGLE",
          "selector": "request.usage_plan[id]"
        },
        "routingBackends": [
          {
            "key": {
              "type": "ANY_OF",
              "values": [
                "ocid1.usageplan.oc1..aaaaaaaaab______gap"
              ],
              "name": "free-rule",
              "isDefault": true
            },
            "backend": {
              "type": "HTTP_BACKEND",
              "url": "http://dev.example.com/"
            }
          },
          {
            "key": {
              "type": "ANY_OF",
              "values": [
                "ocid1.usageplan.oc1..aaaaaaaaay______lcf"
              ],
              "name": "premium-rule"
            },
            "backend": {
              "type": "HTTP_BACKEND",
              "url": "http://api.example.com"
            }
          }
        ]
      }
    }
  ]
}

この例では、APIゲートウェイがリクエストをhttps://<gateway-hostname>/marketing/salesに解決する方法は、APIクライアントがサブスクライブされる使用プランによって異なります。次の2つの使用プランが定義されています。

  • Free Tier。OCIDはocid1.usageplan.oc1..aaaaaaaaab______gapです。このOCIDがrequest.usage_plan[id]コンテキスト変数の値である場合、リクエストはhttp://dev.example.com/にルーティングされます。リクエストにクライアント・トークンが含まれていなかった場合、Free Tier使用プランもデフォルトとして使用されます。
  • Premium Tier。OCIDはocid1.usageplan.oc1..aaaaaaaaay______lcfです。このOCIDがrequest.usage_plan[id]コンテキスト変数の値である場合、リクエストはhttp://api.example.comにルーティングされます

例5: ヘッダー・パラメータによるバックエンドの選択

APIデプロイメントを構成して、元のリクエストのヘッダーで渡されたパラメータに基づいてバックエンドを動的に選択できます。

{
  "routes": [
    {
      "path": "/sales",
      "methods": [
        "GET",
        "POST",
        "PUT",
        "DELETE"
      ],
      "backend": {
        "type": "DYNAMIC_ROUTING_BACKEND",
        "selectionSource": {
          "type": "SINGLE",
          "selector": "request.headers[Accept]"
        },
        "routingBackends": [
          {
            "key": {
              "type": "ANY_OF",
              "values": [
                "application/json"
              ],
              "name": "json-rule",
              "isDefault": true
            },
            "backend": {
              "type": "HTTP_BACKEND",
              "url": "http://api.example.com"
            }
          },
          {
            "key": {
              "type": "ANY_OF",
              "values": [
                "application/xml"
              ],
              "name": "xml-rule"
            },
            "backend": {
              "type": "HTTP_BACKEND",
              "url": "http://xml.example.com"
            }
          }
        ]
      }
    }
  ]
}

この例では、次のように、APIゲートウェイがリクエストをhttps://<gateway-hostname>/marketing/salesに解決する方法は、元のリクエストのAcceptヘッダーの値によって異なります。

  • Acceptヘッダーがapplication/json形式のレスポンスをリクエストした場合、リクエストはhttp://api.example.comにルーティングされます。
  • Acceptヘッダーがapplication/xml形式のレスポンスをリクエストした場合、リクエストはhttp://xml.example.comにルーティングされます。

例6: 認証パラメータによるバックエンドの選択

APIデプロイメントを構成して、認可プロバイダ・ファンクションによって返された、またはJSON Webトークン(JWT)に含まれている認証パラメータ('claim'とも呼ばれる)に基づいてバックエンドを動的に選択できます。

{
  "routes": [
    {
      "path": "/sales",
      "methods": [
        "GET",
        "POST",
        "PUT",
        "DELETE"
      ],
      "backend": {
        "type": "DYNAMIC_ROUTING_BACKEND",
        "selectionSource": {
          "type": "SINGLE",
          "selector": "request.auth[tenant]"
        },
        "routingBackends": [
          {
            "key": {
              "type": "ANY_OF",
              "values": [
                "tenant-cars"
              ],
              "name": "cars-tenant-rule",
              "isDefault": true
            },
            "backend": {
              "type": "HTTP_BACKEND",
              "url": "http://cars-api.example.com"
            }
          },
          {
            "key": {
              "type": "ANY_OF",
              "values": [
                "tenant-trucks"
              ],
              "name": "trucks-tenant-rule"
            },
            "backend": {
              "type": "HTTP_BACKEND",
              "url": "http://trucks-api.example.com"
            }
          }
        ]
      }
    }
  ]
}

この例では、次のように、APIゲートウェイがリクエストをhttps://<gateway-hostname>/marketing/salesに解決する方法は、認可プロバイダ・ファンクションによって返されるtenantクレームの値によって異なります。

  • request.auth[tenant]コンテキスト変数がtenant-carsに設定されている場合、リクエストはhttp://cars-api.example.comにルーティングされます
  • request.auth[tenant]コンテキスト変数がtenant-trucksに設定されている場合、リクエストはhttp://trucks-api.example.comにルーティングされます

例7: 問合せパラメータによるバックエンドの選択

APIデプロイメントを構成して、元のリクエストによって渡された問合せパラメータに基づいてバックエンドを動的に選択できます。

{
  "routes": [
    {
      "path": "/sales",
      "methods": [
        "GET",
        "POST",
        "PUT",
        "DELETE"
      ],
      "backend": {
        "type": "DYNAMIC_ROUTING_BACKEND",
        "selectionSource": {
          "type": "SINGLE",
          "selector": "request.query[vehicle-type]"
        },
        "routingBackends": [
          {
            "key": {
              "type": "ANY_OF",
              "values": [
                "car"
              ],
              "isDefault": "true",
              "name": "car-rule"
            },
            "backend": {
              "type": "HTTP",
              "url": "https://cars-api.example.com"
            }
          },
          {
            "key": {
              "type": "ANY_OF",
              "values": [
                "minivan",
                "truck"
              ],
              "name": "truck-rule"
            },
            "backend": {
              "type": "ORACLE_FUNCTIONS_BACKEND",
              "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq"
            }
          }
        ]
      }
    }
  ]
}

この例では、次のように、APIゲートウェイがリクエストをhttps://<gateway-hostname>/marketing/salesに解決する方法は、元のリクエストによって渡されたvehicle-type問合せパラメータの値によって異なります。

  • vehicle-type問合せパラメータの値がcarの場合、リクエストはcars-api.example.comにルーティングされます。
  • vehicle-type問合せパラメータの値がtruckまたはminivanの場合、リクエストは処理のためにOCI Functionsのサーバーレス・ファンクションにルーティングされます。
  • vehicle-type問合せパラメータ値がcarでもtruckでもminivanでもない場合、リクエストはデフォルトでcars-api.example.comにルーティングされます。