OCI API Gatewayのルートを 迅速かつ簡単に (2021/09/30)
OCI API Gatewayのルートを 迅速かつ簡単に (2021/09/30)
https://www.ateam-oracle.com/post/oci-api-gateway-routes-quickly-and-easily
投稿者: Gustavo Saurez
OCI API Gatewayを使用する目的は、APIクライアントからのトラフィックを、複数のタイプのバックエンドエンドポイントやサービスにルーティングすることです。 各API Gatewayは、多くのバックエンド・エンドポイントを、プライベートまたはパブリックの単一のAPIエンドポイントに統合することができます。 バックエンドエンドポイントはいくつまで可能か? それは後ほど説明します。
まず、API Gatewayを構成する際の重要なコンセプトをいくつか説明しよう。
API デプロイメント: API デプロイメントは、API Gatewayにデプロイされた API の構成を指定します。 各 API デプロイメントには、次のようなパスプレフィックスが必要です。 各 API デプロイメントには、/、/app1、/hrservices、/mywebservice/v2 など、フロントエンドの URL をバックエンドのエンドポイントやサービスのセットにマッピングするためのパスプレフィックスが必要です。 API Gatewayのフロントエンド URL には、この接頭辞 (およびパス、メソッド、ヘッダー、変数など) が含まれ、バックエンドサービスのセットを呼び出すことができます。
https://myapps.ateam.com/app1
ルート:ルートとは、パス(およびメソッド)とバックエンドサービスとの間のマッピングを意味します。 各ルートには、/service1や/getpriceなどのパスが必要で、これを使って呼び出す特定のバックエンドサービスを選択します。 1つのAPIデプロイメントは複数のルートを持つことができ、各ルートはバックエンドサービスに関連付けられています。 このバックエンドサービスは、OCI ファンクションまたは HTTP バックエンド URL になります。 API クライアントが service1 を呼び出すために呼び出す API ゲートウェイフロントエンド URL は、以下のようになります。
https://myapps.ateam.com/app1/service1
1つのルートは、パスパラメータやワイルドカードをルートのパスに使用したり、HTTP(s)バックエンドの定義でコンテキスト変数(パス、クエリ、ヘッダ、認証パラメータ)を呼び出したりすることで、複数のバックエンドにリクエストを動的にマッピングすることができます。 この機能があれば、上記のような制限はほとんど気にならなくなります。 例えば、以下のようになります。
ルートのパスには、以下のような括弧で囲まれたパスパラメータを含めることができます。
/finance/{country}
/{service}
バックエンドの定義では、コンテキスト変数を使用して、それらの値を取得することができます。
http://api.finance.com/${request.path[country]} or
http://apis.com/${request.path[service]}
パラメータとコンテキスト変数の詳細については、「ポリシーと HTTP バックエンド定義へのコンテキスト変数の追加」を参照してください。
次の図は、API デプロイメントのパスのプレフィックス、ルート、バックエンド API の関係をまとめたものです。
さて、ドキュメント「API Gateway Internal Limits」によると、APIデプロイメントごとに定義できるルートの最大数は50です。 これはバックエンドのエンドポイントの数と同じに対応しています。 これでは少なすぎますね。 では、最大20個のAPIデプロイメントを作成すれば、バックエンド・エンドポイントの数は1000に増えます。 これでもまだ少ないし、もし2つか3つのAPIデプロイメントしか定義したくないとしたら?
この図を見てください。
この例では、複数のプライベートバックエンドアプリケーションがあり、それぞれが複数のエンドポイント(API)を提供しています。 APIクライアントは、1つのエントリーポイント(https://myapps.ateam.com)を介して、これらすべてのサービスにアクセスします。 ゲートウェイの「APIデプロイメント」と「ルート」をバックエンドのエンドポイントにマッピングするには、さまざまな方法があります。 3つの基本的な例があります。
1. アプリケーションごとに1つのAPIデプロイメント・プレフィックスを使用し、アプリのエンドポイントごとに1つのルートを使用する(上の図のように)。
この場合、バックエンドのエンドポイントごとに1つのルートが存在することになります。 そのため、このオプションは、特に上述の制限を考慮すると、おそらく良いアイデアではありません。 また、バックエンドエンドポイントの追加、削除、変更には、API Gatewayの設定を変更する必要があるため、メンテナンス性の高いオプションとなります。
2. アプリケーションごとに1つのAPI Deployment prefixを使用し、すべてのアプリケーションのエンドポイントに対して1つのルートを使用します。
このオプションでは、複数のデプロイメントが定義され、デプロイメントごとに 1 つのルートのみが定義されます。 バックエンドのURL(host.domain)が異なる場合、複数のデプロイメントが必要になります。 ルートのパスには{endpoints}のようなパス変数を、バックエンドのURLには${request.path[endpoints]}のようなコンテキスト変数を使用します。
このオプションでは、APIデプロイメントごとに1つのルートのみが必要になる場合があります。 APIクライアントの呼び出しとマッピングの例をいくつかご紹介します。
API Client Call |
Backend Mapping |
https://myapps.ateam.com/app1/finance/us |
http://app1.d1.com/finance/us |
https://myapps.ateam.com/app2/hr/Users |
http://app2.d2.com/hr/Users |
3. 1つのAPI Deploymentプレフィックスと、すべてのアプリのエンドポイント用の1つのルート。
このオプションは、ロードバランサーを使用している場合など、バックエンドのURL(host.domain)がすべてのエンドポイントで同じである場合に使用できます。 そのため、API デプロイメントは 1 つしか必要ありません。
このオプションでは、1 つのデプロイメントと 1 つのルートのデプロイメントのみが必要になる場合があります。 API クライアントの呼び出しとマッピングの例をいくつか紹介します。
API Client Call | Backend Mapping |
https://myapps.ateam.com/apps/finance/us | http://app.d.com/finance/us |
https://myapps.ateam.com/apps/hr/Users | http://app.d.com/hr/Users |
上記は、デプロイメントとルートをバックエンドのURLにマッピングする方法の3つの例に過ぎません。 その他の設定として、ヘッダ(request.headers)、クエリパラメータ(request.query)、認証パラメータ(request.auth)にコンテキスト変数を使用することができます。 これらのオプションを使用すれば、多くのAPIエンドポイントをデプロイする際に、APIのデプロイメントとルートのリソース制限が問題になることはありません。
参考文献
コメント
コメントを投稿