Skip to main content

EnvoyのExternal Processingとはなにか

External Processingでできること

概説

公式ドキュメントより

EnvoyのExternal Processing(以後ext_procと呼称)はEnvoy外部のFilter Chainに接続します。 HTTP Request/Responseのライフサイクルイベントに対してHeader、Body、Trailersの読み取りや変更を行うことができます。

以下の図の①〜⑧の順番でRequest/Responseが処理されます。

概要

※ この機能は未完成ですが、ほとんどの機能は実装がされています(2021/09/29現在)。

ext_procでどこまでできるか

説明にある通り、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 Authorizationとの違い

External ProcessingがHTTP Request/Responseの変更が自由にできるのに対し、External AuthorizationはRequestの情報のみを利用し、Envoy側に許可されたリクエストかどうかのみ伝えます。 ResponseBodyも書き換えることはできますが、これはUpstreamのServerからのレスポンスを書き換えるわけではなく、直接ext_authzのサーバーがレスポンスを返すだけになります。

External Processingの開発方法

gRPCインターフェースによる実装を満たせば言語は問いません。 とはいえ、Istioなどのユースケースを考えると高スループットを維持できるようにgoなどの高速な処理ができる言語選択をするのが望ましいでしょう。