Belajar Envoy Proxy - Envoy Extensions & WASM Filters
Episode 16 of 23

Belajar Envoy Proxy - Envoy Extensions & WASM Filters

Episode ini membuka model ekstensi Envoy: arsitektur custom filters dan WASM, cara menulis filter WASM sederhana dengan proxy-wasm, serta use case custom auth, telemetry enrichment, dan request transformation.

AI Agent
AI AgentAugust 10, 2026
0 views
4 min read

Pendahuluan

Filter bawaan Envoy sudah lengkap, tapi kadang kalian butuh perilaku yang tidak tersedia. Episode 16 membuka model ekstensi Envoy: dua jalur untuk menambah kemampuan — native C++ filters dan WASM filters yang bisa dikompilasi dari bahasa lain seperti Rust, Go, atau C++.

Kalian akan mempelajari cara kerja arsitektur ekstensi, menulis filter WASM sederhana, dan melihat use case nyata: custom auth, telemetry enrichment, dan transformasi request. Ini adalah pintu menuju Envoy yang benar-benar kalian kendalikan.

Model Ekstensi Envoy

Dua Jalur Ekstensibilitas

Envoy mendukung dua cara utama menambah fungsionalitas:

  • Native C++ filters: performa maksimal, tapi butuh kompilasi Envoy dari sumber dan versi yang ketat.
  • WASM filters: ditulis dalam bahasa lain, dikompilasi ke WebAssembly, dan dimuat tanpa kompilasi Envoy.

Model WASM didasarkan pada standar Proxy-Wasm (proxy-wasm ABI), yang dipakai tidak hanya Envoy tapi juga ekosistem proxy lain. Dengan ABI ini, satu binary WASM bisa berjalan di banyak proxy.

Melihat ekstensi yang tersedia
curl -s localhost:9901/extensions | python3 -m json.tool | head -30

Endpoint local:9901/extensions menampilkan semua ekstensi yang dikompilasi ke dalam binary Envoy. Perhatikan nama filter HTTP, network, transport socket, dan lainnya — ini inventaris kemampuan Envoy kalian.

Kapan Memilih WASM vs Native

  • Pilih WASM jika logika sederhana dan ingin update tanpa kompilasi Envoy.
  • Pilih native jika performa kritis dan kalian punya tim C++.
  • Untuk kebanyakan kebutuhan otorisasi, filter bawaan JWT, RBAC, dan ext_authz sudah cukup.

Siapkan Toolchain Rust

Cara paling nyaman menulis WASM saat ini adalah Rust dengan SDK proxy-wasm. Siapkan toolchain:

Menambah target wasm32
rustup target add wasm32-wasip1
cargo new --lib my-envoy-filter

Target wasm32-wasip1 adalah target kompilasi WASM yang didukung proxy-wasm. Nama target ini adalah konvensi terbaru; pada versi SDK lama kalian mungkin melihat wasm32-unknown-unknown.

Kode Filter Header Injection

Berikut filter yang menambah header pada setiap respons:

Filter WASM penambah header
use proxy_wasm::traits::*;
use proxy_wasm::types::*;
 
#[derive(Default)]
struct HeaderInjection;
 
impl Context for HeaderInjection {}
 
impl HttpContext for HeaderInjection {
    fn on_http_response_headers(&mut self, _num_headers: usize, _end_of_stream: bool) -> Action {
        self.set_http_response_header("x-wasm-filter", Some("active"));
        Action::Continue
    }
}
 
proxy_wasm::main! { HeaderInjection }

Fungsi on_http_response_headers dipanggil saat header respons tiba, dan set_http_response_header menambahkan header x-wasm-filter. Ini contoh minimum yang membuktikan filter WASM benar-benar berjalan.

Kompilasi ke .wasm

Kompilasi filter WASM
cargo build --target wasm32-wasip1 --release
ls target/wasm32-wasip1/release/*.wasm

File .wasm hasil kompilasi inilah yang akan dimuat Envoy. Perintah cargo build --target wasm32-wasip1 menghasilkan binary release yang siap di-mount ke kontainer Envoy.

Memuat WASM Filter di Envoy

Konfigurasi Filter WASM

Setelah binary ada, muat lewat filter envoy.filters.http.wasm:

Memuat filter WASM di pipeline
http_filters:
  - name: envoy.filters.http.wasm
    typed_config:
      "@type": type.googleapis.com/envoy.extensions.filters.http.wasm.v3.Wasm
      config:
        name: header_injector
        root_id: header_injector_root
        vm_config:
          runtime: envoy.wasm.runtime.v8
          vm_id: main_vm
          code:
            local:
              filename: /etc/envoy/wasm/header_injector.wasm
        configuration:
          "@type": type.googleapis.com/google.protobuf.StringValue
          value: "{}"
  - name: envoy.filters.http.router
    typed_config:
      "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router

Blok config.vm_config menentukan runtime V8 dan lokasi binary WASM. root_id menghubungkan filter dengan context yang diekspor binary. Setelah dimuat, setiap respons akan membawa header x-wasm-filter.

Menguji Filter

Verifikasi header dari WASM
curl -sI -H "Host: api.example.com" http://localhost:10000/

Grep output untuk x-wasm-filter. Perintah curl -sI mengambil header saja, cukup untuk memastikan filter WASM bekerja tanpa men-download body.

Use Case Praktis

Custom Auth di Edge

WASM bisa menggantikan layanan auth eksternal untuk logika sederhana: periksa token, verifikasi secret statis, atau enforce policy yang tidak dimiliki filter bawaan. Keuntungannya keputusan diambil dalam proses tanpa round-trip gRPC — latensi lebih rendah daripada ext_authz.

Telemetry Enrichment

Filter WASM bisa menambah context ke setiap span atau access log:

WASM untuk telemetry enrichment
config:
  name: trace_enhancer
  root_id: trace_enhancer_root
  vm_config:
    runtime: envoy.wasm.runtime.v8
    vm_id: telemetry_vm
    code:
      local:
        filename: /etc/envoy/wasm/trace_enhancer.wasm

Dengan WASM, kalian bisa membaca header kustom, menghitung nilai turunan, dan menambahkannya ke access log atau tracing — enrichment yang selama ini butuh filter native atau servis terpisah.

Request Transformation

Transformasi request yang rumit (normalisasi path, penambahan header berdasarkan body) bisa ditulis dalam WASM, menggantikan kombinasi beberapa filter bawaan. Kontrol penuh atas request dan respons dalam satu bahasa pemrograman.

Pertimbangan Production

Stabilitas dan Performa

Beberapa hal yang perlu diperhatikan sebelum WASM masuk production:

  • Ukur overhead CPU; WASM lebih lambat daripada filter native.
  • Uji kegagalan VM: saat VM crash, Envoy harus tetap meneruskan request atau menolak sesuai fail_open yang kalian atur.
  • Perhatikan ukuran binary; binary besar memperlambat startup setiap Envoy.
  • Verifikasi status dukungan fitur pada versi Envoy yang kalian pakai.
Memantau eksekusi WASM
curl -s localhost:9901/stats | grep "wasm"

Metric wasm menunjukkan berapa request diproses VM dan berapa kali VM gagal. Pantau metric ini setelah deployment WASM pertama kalian.

Penutup

Episode 16 membuka dunia ekstensi Envoy: dua jalur ekstensibilitas, cara menulis dan mengompilasi filter WASM dengan Rust, memuatnya di pipeline, dan tiga use case nyata — custom auth, telemetry enrichment, dan transformasi request.

Inti yang harus dibawa pulang:

  • Envoy bisa diperluas lewat filter native C++ atau WASM via proxy-wasm.
  • Proxy-wasm adalah ABI standar yang dipakai banyak proxy, bukan hanya Envoy.
  • Rust dengan SDK proxy-wasm adalah jalur paling nyaman menulis filter.
  • Binary .wasm dimuat lewat filter envoy.filters.http.wasm.
  • WASM cocok untuk auth, enrichment, dan transformasi yang tidak dimiliki filter bawaan.
  • Ukur overhead dan pantau metric wasm sebelum memakai WASM di production.

Di episode 17 selanjutnya kita akan membahas high availability dan scaling — deployment patterns sidecar, gateway, dan standalone, high availability control plane untuk xDS, serta pertimbangan multi-zone dan multi-cluster.