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

API Gatewayを使用したリクエストの要素に基づいて、同じ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ゲートウェイの更新を参照してください。

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

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

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

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

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

JSONファイルの編集によるAPIデプロイメント仕様への動的バックエンド選択の追加

JSONファイルのAPIデプロイメント仕様に動的バック・エンド選択を追加するには:

  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>]認可プロバイダ・ファンクションによって戻された、またはJSON Webトークン(JWT)に含まれているクレームの値を使用して、バックエンドを決定します。<key>はクレームの名前です。たとえば、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] APIクライアントがサブスクライブされている(元のリクエストのクライアント・トークンから識別される)使用プランのOCIDを使用して、バックエンドを決定します。
    • "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"を指定した場合、値は完全に一致する必要があります。値は、単一のバック・エンド・ルール内、およびAPIデプロイメントに定義されているすべてのバック・エンド・ルール間で一意である必要があります。ANY_OFを指定した場合、値の一致は大/小文字が区別されません。
      • "type": "WILDCARD"を指定した場合、ワイルドカードで始まる、またはワイルドカードで終わる<context-variable-value>の値を指定できます。* (アスタリスク)ワイルドカードは、0文字以上の文字を示す場合、+ (プラス記号)ワイルドカードは1文字以上の文字を示す場合に使用します。1つの値に複数のワイルドカードを含めることはできず、値の途中にワイルドカードを含めることもできないことに注意してください。WILDCARDを指定した場合、値の一致では大文字と小文字が区別されます。また、ワイルドカード構成が正しくないと、リクエストが意図しないバックエンドにルーティングされる可能性があります。
      たとえば、(リクエストのAcceptヘッダーに示されている) xmlレスポンスを受け入れることができるAPIクライアントからのリクエストを、xmlを返すバック・エンドにルーティングする場合は、次のように指定します。
      • "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>の値に依存します:

    たとえば、次の基本的なAPIデプロイメント仕様には、リクエストで渡されたvehicle-type問合せパラメータの値に基づいてリクエストをルーティングする動的バック・エンド選択が含まれています。vehicle-type問合せパラメータの値がcarの場合、リクエストはcars-api.example.comにルーティングされます。vehicle-type問合せパラメータの値がtruckまたはminivanの場合、リクエストは処理のためにOCI関数のサーバーレス関数にルーティングされます。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_BACKEND",
                  "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デプロイメントを作成または更新するときに使用します:

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

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

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

APIゲートウェイ・バックエンドの動的選択の例

このセクションの例では、JSONファイルの次のAPIデプロイメント定義および不完全なAPIデプロイメント仕様を想定しています:

{
  "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: ホストによるバックエンドの選択

APIデプロイメントを構成して、元のリクエストの送信先ホスト(リクエストのホスト・ヘッダーのホスト・フィールドから抽出)に基づいてバックエンドを動的に選択できます。この設計により、様々なテナントをサポートするAPIゲートウェイを定義できます。

{
  "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_BACKEND",
              "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"
            }
          }
        ]
      }
    }
  ]
}

この例では、APIゲートウェイがリクエストをhttps://<gateway-hostname>/marketing/salesに解決する方法は、次のように、元のリクエストが送信されたホスト(リクエストのホスト・ヘッダーのホスト・フィールドから抽出されたホスト)によって異なります。

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

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

APIデプロイメントを構成して、元のリクエストが送信されたホスト文字列のサブドメインに基づいてバックエンドを動的に選択できます。ホスト文字列は、リクエストのホスト・ヘッダーから抽出され、指定した文字列でマスクされ、リクエストのルーティングに使用されるサブドメインが残ります。この設計により、様々なテナントをサポートするAPIゲートウェイを定義できます。

{
  "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_BACKEND",
              "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"
            }
          }
        ]
      }
    }
  ]
}

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

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

例3a: ホスト・サブドメインでバックエンドを選択します(バックエンドURLのホスト名を変更し、一致タイプANY_OFを使用)。

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

{
  "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_BACKEND",
              "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"を設定しないでください。

例3b: ホスト・サブドメインでバックエンドを選択します(バックエンドURLのホスト名を変更し、一致タイプWILDCARDを使用)。

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

{
  "routes": [
    {
      "path": "/sales",
      "methods": [
        "GET",
        "POST",
        "PUT",
        "DELETE"
      ],
      "backend": {
        "type": "DYNAMIC_ROUTING_BACKEND",
        "selectionSource": {
          "type": "SINGLE",
          "selector": "request.subdomain[example.com]"
        },
        "routingBackends": [
          {
            "key": {
              "type": "WILDCARD",
              "values": [
                "*s"
              ],
              "name": "domestic-rule"
            },
            "backend": {
              "type": "HTTP_BACKEND",
              "url": "https://${request.subdomain[example.com]}-api.example.com"
            }
          }
        ]
      }
    }
  ]
}

この例では、APIゲートウェイがリクエストをhttps://<gateway-hostname>/marketing/salesに解決する方法は、元のリクエストが送信されたホスト・サブドメインがワイルドカードを含むroutes.routingBackends.key値と一致するかどうかによって異なります。この場合、元のリクエストが文字's'で終わるホスト・サブドメインに送信されたかどうかは、次のようになります。

  • リクエストが文字's'で終わるサブドメインに送信された場合、リクエストは適切にルーティングされます。たとえば、cars.example.comhatchbacks.example.comsuvs.example.comまたはsedans.example.comに送信されたリクエストは、それぞれhttp://cars-api.example.comhttp://hatchbacks-api.example.comhttp://suvs-api.example.comまたはhttp://sedans-api.example.comにルーティングされます。
  • リクエストが文字's'で終わらないサブドメインに送信された場合、リクエストは失敗します。たとえば、truck.example.comまたはtractor.example.comに送信されたリクエストは失敗します。

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

  • バックエンドURLは、selectorに指定されたコンテキスト変数を使用してのみ変更できます。
  • ワイルドカードを使用する場合は、ワイルドカードを慎重に構成します。ワイルドカード構成が正しくないと、要求が意図しないバックエンドにルーティングされる可能性があります。たとえば、buses.example.comに送信されたリクエストは、想定どおりにhttp://buses-api.example.comに正しくルーティングされます。ただし、この構成では、最初にbus.example.comおよびs.example.comに送信されたリクエストがそれぞれhttp://bus-api.example.comおよびhttp://s-api.example.comにルーティングされ、いずれも意図されていませんでした。

例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_BACKEND",
              "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関数のサーバーレス関数にルーティングされます。
  • vehicle-type問合せパラメータ値がcarでもtruckでもminivanでもない場合、リクエストはデフォルトでcars-api.example.comにルーティングされます。