Service Extensions を使用すると、ロード バランシング データパスからユーザー管理のコールアウト サービスまたは Google サービスにコールアウトを送信するように、サポートされているアプリケーション ロードバランサに指示できます。
吹き出しのデータフロー
ロードバランサは、次のいずれかの Envoy gRPC プロトコルを使用してコールアウトと通信します。
外部処理または
ext_procプロトコル。このプロトコルは、ルート、トラフィック、認可の拡張機能でサポートされており、デフォルトで使用されます。
ext_procプロトコルを使用すると、拡張サービスはリクエストのヘッダーまたは本文を検査して変更することで、HTTP リクエストのライフサイクル内のイベントに応答できます。外部認可または
ext_authzプロトコル。このプロトコルは、認可拡張機能でのみサポートされています。
ext_authzのサポートはプレビュー版です。ext_authzプロトコルは、受信リクエストの認可の決定を外部の独立したサービスに委任します。この API を使用すると、拡張機能サービスは、リクエストのヘッダーまたはメタデータを調べて、複雑な認可判断を行う HTTP リクエストのライフサイクル内のイベントに応答できます。このプロトコルは、認可拡張機能を構成するときに
wireFormatオプションで指定できます。
これらの拡張サービスは、仮想マシン(VM)インスタンスまたは GKE にデプロイできます。また、これらのサービスのエンドポイントを表すようにインスタンス グループまたはネットワーク エンドポイント グループ(NEG)を構成できます。
次の図は、VM インスタンスや Google Kubernetes Engine(GKE)クラスタなどのユーザー管理のコンピューティング リソースに gRPC サーバーを使用してコールアウト バックエンド サービスをデプロイし、通常のバックエンド サービスとしてロードバランサに表す方法を示しています。
ext_proc でのコールアウトの仕組み
ext_proc gRPC API の短縮版は次のとおりです。
// The gRPC API to be implemented by the external processing server service ExternalProcessor { rpc Process(stream ProcessingRequest) returns (stream ProcessingResponse) { } } // Envoy sets one of these fields depending on the processing stage. message ProcessingRequest { oneof request { HttpHeaders request_headers = 2; HttpHeaders response_headers = 3; HttpBody request_body = 4; HttpBody response_body = 5; } } message ProcessingResponse { oneof response { HeadersResponse request_headers = 1; HeadersResponse response_headers = 2; BodyResponse request_body = 3; BodyResponse response_body = 4; ImmediateResponse immediate_response = 7; } }
HTTP リクエストのヘッダーを受信すると、ロードバランサは ProcessingRequest メッセージを拡張サービスに送信します。このとき、request_headers フィールドはクライアントからの HTTP ヘッダーに設定されます。
拡張サービスは、ProcessingRequest メッセージのヘッダーまたは本文に構成された変更を含む、対応する ProcessingResponse メッセージで ProcessingRequest メッセージに応答する必要があります。また、サービスは immediate_response フィールドを設定して、ロードバランサがリクエスト処理を終了し、指定されたレスポンスをクライアントに送信するようにすることもできます。
REQUEST_HEADER イベントと RESPONSE_HEADER イベントの場合、拡張機能サービスはリクエストまたはレスポンスの HTTP ヘッダーを操作できます。サービスは、ProcessingResponse メッセージの request_headers フィールドまたは response_headers フィールドを適切に設定することで、ヘッダーの追加、変更、削除を行うことができます。ヘッダーには raw_value フィールドを使用します。
トラフィック拡張機能を使用すると、リクエストとレスポンスの両方のヘッダーと本文を変更できます。拡張機能サーバーは処理モードを動的にオーバーライドし、リクエスト処理の後続フェーズで拡張機能を有効または無効にできます。ロードバランサは、トラフィック拡張機能を呼び出した後にルートルールを再評価しません。
エッジ、認可、ルートの拡張機能は HTTP ヘッダーのみをサポートします。これらの拡張機能は、HTTP 本文を検査または変更できません。
ext_authz でのコールアウトの仕組み
ext_authz API は、認可コールアウト拡張機能のみをサポートします。
API の省略形は次のとおりです。
// A generic interface for performing authorization checks on incoming // requests to a networked service. service Authorization { // Performs an authorization check based on the attributes associated with // the incoming request and return status. rpc Check(CheckRequest) returns (CheckResponse) { } } message CheckRequest { // The request attributes. AttributeContext attributes = 1; } message CheckResponse { google.rpc.Status status = 1; oneof http_response { DeniedHttpResponse denied_response = 2; OkHttpResponse ok_response = 3; } google.protobuf.Struct dynamic_metadata = 4; }
HTTP リクエストのヘッダーを受信すると、ロードバランサは拡張機能サービスに CheckRequest メッセージを送信します。
拡張機能サービスは、CheckRequest メッセージに対して、次の情報を含む対応する CheckResponse メッセージで応答する必要があります。
status: ステータスを示します。OKは、リクエストが許可されていることを示します。それ以外のステータスは、リクエストが拒否されたことを示します。denied_responseまたはok_response: レスポンスが許可されたか拒否されたかを示します。このフィールドには、認可チェックに関連する HTTP レスポンス属性が伴います。ok_responseフィールドは、認可サービスがリクエストを許可するときに使用されます。このサービスは、元のリクエスト ヘッダーを変更、追加、削除し、クライアントに送信される HTTP レスポンス ヘッダーを更新できます。ヘッダーにはraw_valueフィールドを使用します。denied_responseフィールドは、認可サービスがリクエストを拒否した場合に使用されます。サービスは、クライアントに送信される HTTP レスポンス ヘッダーを更新できます。
拡張機能サービスが
CheckResponseメッセージで許可されていないヘッダー名または値を返した場合、リクエストは500 Internal Errorステータス コードで拒否されます。許可されていないヘッダーについては、ヘッダー操作に関する制限事項をご覧ください。dynamic_metadata: 認可拡張機能の後に呼び出される拡張機能(トラフィック拡張機能など)で使用されるオプションのメタデータが含まれます。
本文の処理モード
本文処理をサポートする拡張機能では、request_body_send_mode フィールドまたは response_body_send_mode フィールドの値を設定することで、リクエストとレスポンスの本文処理用に次の 2 つの送信モードのいずれかを構成できます。
デフォルト モードは STREAMED で、ほとんどのユースケースで推奨されます。
| モード | 説明 | サポートされているイベントが必要 | サポートされている拡張機能 |
|---|---|---|---|
STREAMED
|
呼び出しはストリーミング モードで実行されます。このデフォルト設定は、モードが設定されていない場合にも使用されます。 プロキシは、本文チャンクを拡張サービスに送信し、チャンクごとに 1 つのレスポンスを想定します。拡張機能は、変更されたチャンクを送信し直したり、変更なしでチャンクを承認したり、チャンクを削除したりできます。 プロキシは一度に送信するデータ量を制限します。そのため、拡張機能サービスはできるだけ早くチャンクを認識する必要があります。 ボディモードは動的に変更できませんが、高度な拡張機能サーバーは、受信する将来の HTTP イベントを動的に選択できます。ヘッダー リクエスト中に |
リクエストの場合は REQUEST_BODY、レスポンスの場合は RESPONSE_BODY を含める必要があります。 |
トラフィック拡張機能(リクエストとレスポンスの両方)。 |
FULL_DUPLEX_STREAMED |
通話は全二重モードで実行されます。 プロキシはチャンクが到着するとすぐに送信し、バッファリングしません。バッファリングがないため、プロキシは拡張機能のレイテンシの影響を受けにくくなります。 プロキシは、必要に応じて多くの返信チャンクを受信できます。返信チャンクは、プロキシが送信するチャンクから切り離されます。後続のチャンクは、前のチャンクとイベントが完全に処理されるのを待たずに、プロキシに到着した時点で処理のために送信されます。 拡張機能は、本文の内容を自由にバッファリング、変更、再チャンクできます。拡張機能が本文の内容を返さない場合、チェーン内の次の拡張機能は空の本文を受け取ります。
|
リクエストの場合は REQUEST_BODY と REQUEST_TRAILERS、レスポンスの場合は RESPONSE_BODY と RESPONSE_TRAILERS を含める必要があります。 |
トラフィック拡張機能(リクエストとレスポンスの両方)。 ルート拡張機能(リクエスト用)。 |
ユーザー管理のコールアウト バックエンド サービスでサポートされているバックエンド
Envoy gRPC サービスを実行する次のいずれかのタイプのバックエンドを使用するバックエンド サービスで、ユーザー管理のコールアウト拡張機能をホストできます。
- すべてのマネージド インスタンス グループと非マネージド インスタンス グループのバックエンド
- すべてのゾーン NEG
- すべてのハイブリッド接続 NEG
- VPC サービスを指す Private Service Connect NEG
- Cloud Run サービスを指すサーバーレス NEG
コールアウト表示オプションの推奨される最適化
拡張機能をロード バランシング処理パスに統合すると、リクエストとレスポンスのレイテンシが追加されます。拡張機能サービスが処理する各タイプのデータ(リクエスト ヘッダー、リクエスト本文、レスポンス ヘッダー、レスポンス本文など)は、レイテンシを追加します。
レイテンシを最小限に抑えるには、次の最適化を検討してください。
- ロードバランサの通常の宛先バックエンド サービスと同じゾーンにコールアウトをデプロイします。クロスリージョン内部アプリケーション ロードバランサを使用する場合は、ロードバランサのプロキシ専用サブネットと同じリージョンに拡張サービス バックエンドを配置します。
- グローバル外部アプリケーション ロードバランサを使用する場合は、通常のロードバランサの宛先 VM、GKE ワークロード、Cloud Run functions がある地理的リージョンにコールアウト サービス バックエンドを配置します。
- 可能な場合は、必要なデータのみを処理するように拡張機能を構成します。たとえば、ルート拡張機能とトラフィック拡張機能のリクエスト ヘッダーのみを変更するには、拡張機能の
supported_eventsフィールドをREQUEST_HEADERSに設定します。
制限事項
このセクションでは、コールアウトに関する制限事項をいくつか示します。
ヘッダー操作の制限事項
一部のヘッダーは変更できません。ヘッダー操作には次の制限があります。
次のヘッダーではヘッダー操作はサポートされていません。
X-user-IPCDN-LoopX-Forwarded、X-Google、X-GFE、X-Amz-で始まるヘッダーconnectionkeep-alivetransfer-encoding、teupgradeproxy-connection、proxy-authenticate、proxy-authorizationtrailers
トラフィック拡張機能と認可拡張機能では、
:method、:authority、:scheme、ホストヘッダーのヘッダー操作もサポートされていません。gRPC サーバーが
HeaderMutationでヘッダー値を指定すると、ロードバランサはvalueフィールドを無視します。
本文の処理に関する制限事項
メッセージ本文に関する HTTP/1.1 クライアントとバックエンドの制限事項は次のとおりです。これは ext_proc には適用されますが、ext_authz には適用されません。
拡張機能に
REQUEST_BODYまたはRESPONSE_BODYのいずれかを構成すると、ロードバランサは一致するリクエストを受信した場合、レスポンスからContent-Lengthヘッダーを削除し、チャンク化されたボディ エンコードに切り替えます。メッセージ本文を
ext_procサーバーにストリーミングしている間、最後に、ロードバランサは、ストリームが終了したことを示すために、end_streamがtrueに設定された空の本文を含む末尾のProcessingRequestメッセージを送信する場合があります。
その他の制限
gRPC レスポンス メッセージには次の制限があります。
レスポンス メッセージの最大サイズは 128 KB です。受信したメッセージがこの上限を超えると、ストリームは
RESOURCE_EXHAUSTEDエラーで閉じられます。コールアウト バックエンド サービスでは、Cloud Armor、IAP、Cloud CDN のポリシーを使用できません。
コールアウト バックエンド サービスは、プロトコルとして HTTP/2 を使用する必要があります。
認可拡張機能の場合、ロードバランサはリクエスト本文をコールアウト バックエンド サービスに転送しません。
ルート拡張機能の場合、コールアウト バックエンド サービスは
ext_procストリームの処理モードをオーバーライドできません。
次のステップ
ユーザー管理のコールアウト バックエンド サービスを構成する
コールアウト バックエンド サービスは、コールアウトを使用してルート、認可、ユーザー管理のトラフィック拡張機能を構成するための前提条件です。