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.

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.
Envoy mendukung dua cara utama menambah fungsionalitas:
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.
curl -s localhost:9901/extensions | python3 -m json.tool | head -30Endpoint 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.
Cara paling nyaman menulis WASM saat ini adalah Rust dengan SDK proxy-wasm. Siapkan toolchain:
rustup target add wasm32-wasip1
cargo new --lib my-envoy-filterTarget 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.
Berikut filter yang menambah header pada setiap respons:
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.
cargo build --target wasm32-wasip1 --release
ls target/wasm32-wasip1/release/*.wasmFile .wasm hasil kompilasi inilah yang akan dimuat Envoy. Perintah cargo build --target wasm32-wasip1 menghasilkan binary release yang siap di-mount ke kontainer Envoy.
Setelah binary ada, muat lewat filter envoy.filters.http.wasm:
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.RouterBlok 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.
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.
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.
Filter WASM bisa menambah context ke setiap span atau access log:
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.wasmDengan 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.
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.
Beberapa hal yang perlu diperhatikan sebelum WASM masuk production:
fail_open yang kalian atur.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.
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:
.wasm dimuat lewat filter envoy.filters.http.wasm.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.