EnvoyのExternal Processingとはなにか
公式ドキュメントより
EnvoyのExternal Processing(以後ext_procと呼称)はEnvoy外部のFilter Chainに接続します。 HTTP Request/Responseのライフサイクルイベントに対してHeader、Body、Trailersの読み取りや変更を行うことができます。
以下の図の①〜⑧の順番でRequest/Responseが処理されます。
※ この機能は未完成ですが、ほとんどの機能は実装がされています(2021/09/29現在)。
説明にある通り、HTTPのRequest/ResponseのHeader、Body、Trailersの読み込み、変更が可能となります。 Envoyで機能不足だと感じる部分を自ら実装することが可能となります。
具体的な実装サンプルは以下の記事を参照してください。goの実装サンプルを紹介しています。
EnvoyのConfigのhttp_filtersに以下のようにclusterを指定することで利用することができます。
static_resources: listeners: - name: listener_0 address: socket_address: { address: 0.0.0.0, port_value: 8080 } filter_chains: - filters: - name: envoy.filters.network.http_connection_manager typed_config: http_filters: - name: envoy.filters.http.ext_proc typed_config: "@type": type.googleapis.com/envoy.extensions.filters.http.ext_proc.v3alpha.ExternalProcessor failure_mode_allow: false async_mode: false processing_mode: request_header_mode: "SEND" response_header_mode: "SEND" request_body_mode: "NONE" response_body_mode: "NONE" request_trailer_mode: "SKIP" response_trailer_mode: "SKIP" grpc_service: envoy_grpc: cluster_name: ext_proc_cluster - name: envoy.filters.http.router - name: ext_proc_cluster type: STRICT_DNS connect_timeout: 0.25s http2_protocol_options: {} load_assignment: cluster_name: ext_proc_cluster endpoints: - lb_endpoints: - endpoint: address: socket_address: address: localhost # External Processing SErverのHost名 port_value: 18080
External ProcessingがHTTP Request/Responseの変更が自由にできるのに対し、External AuthorizationはRequestの情報のみを利用し、Envoy側に許可されたリクエストかどうかのみ伝えます。 ResponseBodyも書き換えることはできますが、これはUpstreamのServerからのレスポンスを書き換えるわけではなく、直接ext_authzのサーバーがレスポンスを返すだけになります。
gRPCインターフェースによる実装を満たせば言語は問いません。 とはいえ、Istioなどのユースケースを考えると高スループットを維持できるようにgoなどの高速な処理ができる言語選択をするのが望ましいでしょう。