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などの高速な処理ができる言語選択をするのが望ましいでしょう。