Plugin Apache APISIX Serverless untuk Event Hooks
February 15, 2023
Apache APISIX adalah API gateway sumber terbuka dan berkinerja tinggi yang dibangun di atas Nginx. Salah satu fitur kuatnya adalah kemampuan untuk membuat fungsi serverless, yaitu program kecil dan tanpa status yang dapat memperluas fungsionalitas Apache APISIX. Dalam artikel ini, kita akan membahas dasar-dasar plugin serverless Apache APISIX dan bagaimana plugin ini dapat digunakan untuk memicu fungsi serverless sebagai respons terhadap suatu peristiwa.
Tujuan pembelajaran
Anda akan mempelajari hal-hal berikut sepanjang artikel ini:
- Apa itu plugin serverless Apache APISIX?
- Bagaimana plugin serverless bekerja dan bagaimana menggunakannya?
- Kasus penggunaan plugin serverless.
- Bagaimana Anda dapat menggunakan plugin serverless untuk berintegrasi dengan webhook.
Apa itu plugin serverless Apache APISIX?
Plugin serverless Apache APISIX untuk event hooks memungkinkan Anda menulis fungsi serverless dan mengintegrasikannya ke dalam API gateway. Plugin ini menyediakan cara yang sederhana dan fleksibel untuk menjalankan kode kustom sebagai respons terhadap suatu peristiwa, tanpa harus mengelola infrastruktur yang mendasarinya.
Plugin serverless memisahkan logika untuk menangani peristiwa ke dalam fungsi serverless yang terpisah, sehingga Anda dapat menyederhanakan arsitektur API dan memudahkan pengelolaannya. Apache APISIX menyediakan dukungan untuk framework serverless dari vendor cloud populer seperti Azure Functions, AWS Lambda.
Bagaimana menggunakan plugin serverless?
Untuk menggunakan plugin serverless Apache APISIX untuk event hooks, Anda perlu menulis kode fungsi serverless dalam bahasa pemrograman Lua yang mengimplementasikan logika yang ingin Anda jalankan sebagai respons terhadap suatu peristiwa dan mengaktifkan plugin serverless-pre-function atau serverless-post-function tergantung pada fase siklus permintaan-respons yang Anda pilih.
Saat ini, APISIX hanya mendukung Lua untuk menulis kode fungsi. Jika Anda lebih memilih bahasa pemrograman lain, Anda selalu dapat menggunakan plugin runners untuk membuat plugin kustom baru dari awal.
Kasus penggunaan plugin serverless
Berikut adalah beberapa kasus penggunaan plugin serverless Apache APISIX untuk event hooks:
-
Routing Dinamis: Plugin serverless dapat digunakan untuk merutekan permintaan API yang masuk secara dinamis berdasarkan kriteria tertentu, seperti metode permintaan, jalur URL, atau nilai header. Ini memungkinkan Anda dengan mudah mengimplementasikan skenario routing yang kompleks tanpa harus mengubah konfigurasi Apache APISIX yang mendasarinya.
-
Autentikasi dan Otorisasi: Anda dapat menggunakan plugin serverless untuk mengimplementasikan pemeriksaan autentikasi dan otorisasi untuk API Anda. Misalnya, Anda dapat menulis fungsi serverless yang memverifikasi keberadaan kunci API yang valid di header permintaan sebelum mengizinkan permintaan untuk melanjutkan. Atau dapat digunakan sebagai layanan otorisasi eksternal dengan kombinasi plugin forward-auth.
-
Transformasi Permintaan: Plugin serverless dapat digunakan untuk mengubah permintaan API yang masuk sebelum diproses oleh layanan backend. Misalnya, Anda dapat menulis fungsi serverless yang memodifikasi header atau body permintaan agar sesuai dengan format yang diharapkan oleh layanan backend.
-
Transformasi Respons: Anda juga dapat menggunakan plugin serverless untuk mengubah respons dari layanan backend sebelum dikirim kembali ke klien. Misalnya, Anda dapat menulis fungsi serverless yang memodifikasi header atau body respons agar sesuai dengan format yang diharapkan oleh klien.
-
Pencatatan dan Pemantauan: Anda dapat menggunakan plugin serverless untuk mengimplementasikan pencatatan dan pemantauan untuk API Anda. Misalnya, Anda dapat menulis fungsi serverless yang mencatat informasi detail tentang setiap permintaan API, seperti metode permintaan, URL, header, dan body, untuk analisis lebih lanjut.
Mengintegrasikan Apache APISIX dengan webhooks (Demo)
Untuk mengintegrasikan Apache APISIX dengan webhooks, Anda perlu membuat fungsi serverless yang mendengarkan permintaan POST yang masuk ke endpoint URL, memeriksa apakah metode permintaan adalah POST, dan mengirim notifikasi webhook ke layanan pihak ketiga setiap kali pesan baru diposting.
Fungsi serverless juga harus mengembalikan respons dari webhook, sehingga Anda dapat melihat status webhook dan pesan kesalahan jika terjadi masalah. Dalam kedua kasus tersebut, APISIX dapat berkomunikasi dengan layanan target, memberi tahu target bahwa suatu peristiwa dipicu dengan memanggil URL yang disediakan dengan informasi tentang peristiwa tersebut.

Prasyarat
- Docker terinstal di mesin Anda untuk menjalankan APISIX.
- Pengetahuan dasar tentang beberapa konsep inti APISIX seperti Route, Upstream dan Plugin.
Menyiapkan proyek
Hal pertama yang perlu Anda lakukan adalah mengkloning repositori proyek apisix-docker dari GitHub:
git clone https://github.com/apache/apisix-docker.git
Buka folder proyek di editor kode favorit Anda. Tutorial ini menggunakan VS Code.
Menginstal dan menjalankan Apache APISIX
Untuk menjalankan Apache APISIX, Anda dapat mengikuti langkah-langkah berikut:
Buka jendela terminal baru dan jalankan perintah docker compose up dari folder root proyek:
docker compose up -d
Perintah di atas akan menjalankan Apache APISIX dan etcd bersama dengan Docker.
Kami menginstal APISIX menggunakan Docker dalam demo ini. Namun, ada opsi lain untuk menginstalnya di panduan instalasi.
Mengonfigurasi fungsi serverless di Apache APISIX
Untuk menyiapkan fungsi serverless di Apache APISIX, Anda perlu membuat route baru untuk endpoint dan mengonfigurasi plugin serverless dengan kode fungsi kustom kami dalam Lua.
Berikut adalah contoh fungsi serverless dalam Lua yang mendengarkan permintaan POST yang masuk ke endpoint dan mengirim notifikasi webhook:
function webhook(conf, ctx) -- Impor library yang diperlukan local http = require("resty.http") local core = require("apisix.core") -- Kirim notifikasi webhook hanya jika metode permintaan adalah POST, jika tidak, lewati dan kirim ke upstream seperti biasa if core.request.get_method() == "POST" then -- Kirim notifikasi webhook ke URL yang ditentukan local httpc = http.new() local res, err = httpc:request_uri("http://webhook.site/9db3d3a0-ab64-4142-a39f-d4852ca50f8d", { method = "POST", headers = { ["Content-Type"] = "application/json" }, body = core.request.get_body(), }) -- Periksa respons dari webhook if not res then core.log.error("Gagal mengirim webhook: ", err) return 500, err end end -- Kembalikan respons dari layanan upstream return conf.status, conf.body end
Seperti yang Anda lihat dalam contoh kode fungsi webhook di atas, ia membuat permintaan POST JSON ke URL yang disediakan dengan body permintaan (body permintaan dari klien ke API Gateway) sebagai payload. Situs web pengujian webhooks digunakan untuk meniru endpoint webhook kami: https://webhook.site.
Untuk membuat dan mengatur endpoint webhook Anda:
- Hasilkan URL dengan menavigasi ke https://webhook.site di browser web Anda.
- Pilih Copy to clipboard di sebelah Your unique URL.
- Tempelkan ke metode request_uri dari permintaan HTTP dalam kode fungsi.
Selain itu, semua permintaan lain termasuk POST akan diteruskan ke layanan upstream. Pada langkah selanjutnya, kita akan mengonfigurasi route dan upstream.
Mengonfigurasi Route dan Upstream
Sekarang kita akan membuat route baru dengan plugin fungsi serverless yang diaktifkan dan upstream yang bertindak sebagai layanan backend kami.
curl -X PUT 'http://127.0.0.1:9180/apisix/admin/routes/1' \ -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' \ -H 'Content-Type: application/json' \ -d '{ "uri": "/post", "plugins": { "serverless-pre-function": { "phase": "rewrite", "functions" : [" return function(conf, ctx) -- Impor library yang diperlukan local http = require(\"resty.http\") local core = require(\"apisix.core\") -- Kirim notifikasi webhook hanya jika metode permintaan adalah POST, jika tidak, lewati dan kirim ke upstream seperti biasa if core.request.get_method() == \"POST\" then -- Kirim notifikasi webhook ke URL yang ditentukan local httpc = http.new() local res, err = httpc:request_uri(\"http://webhook.site/9db3d3a0-ab64-4142-a39f-d4852ca50f8d\", { method = \"POST\", headers = { [\"Content-Type\"] = \"application/json\" }, body = core.request.get_body(), }) -- Periksa respons dari webhook if not res then core.log.error(\"Gagal mengirim webhook: \", err) return 500, err end end -- Kembalikan respons dari layanan upstream return conf.status, conf.body end"] } }, "upstream": { "nodes": { "httpbin.org:80": 1 }, "type": "roundrobin" } }'
Dalam contoh konfigurasi route sebelumnya, kami membuat route pertama kami dengan mengirim permintaan curl ke Admin API APISIX. Dalam body permintaan Route, kami menentukan bahwa setiap permintaan ke jalur /post akan memicu kode fungsi serverless dan diteruskan ke target httpbin.org. Ini berarti permintaan akan dirutekan ke endpoint httpbin.org/post setelah memeriksa apakah metode permintaan adalah POST dan peristiwa tersebut harus dikirim ke endpoint webhook layanan pihak ketiga atau tidak. Layanan backend dapat diganti dengan layanan backend Anda.
Anda mungkin juga memperhatikan bahwa kami menambahkan kode fungsi ke properti functions dari serverless-pre-function dalam objek Json.
Menguji konfigurasi
Akhirnya, kami menguji dengan memanggil endpoint /post API Gateway untuk memastikan semuanya bekerja seperti yang diharapkan dan peristiwa POST akan dikirim ke situs web webhook.
curl -i http://127.0.0.1:9080/post -X POST -d \ '{ "message": "A new webhook message" }'
Setelah itu, navigasikan ke URL webhook dari halaman https://webhook.site yang Anda hasilkan pada langkah sebelumnya. Anda akan melihat permintaan POST, memberi tahu endpoint webhook kami tentang peristiwa tersebut dan mengirim body permintaan.

Selain itu, kami mendapatkan respons kembali dari layanan upstream tiruan httpbin.org:
HTTP/1.1 200 OK Content-Type: application/json { ... "form": { "{\n \"message\": \"A new webhook message\"\n}": "" }, "headers": { "Accept": "*/*", "Content-Length": "41", "Content-Type": "application/x-www-form-urlencoded", "Host": "127.0.0.1", "X-Forwarded-Host": "127.0.0.1" }, "json": null, "url": "http://127.0.0.1/post" }
Jelas, jika Anda mengirim metode permintaan HTTP selain POST, kode fungsi serverless tidak akan memicu endpoint webhook.
Ini adalah contoh dasar dari penyiapan fungsi serverless di Apache APISIX. Anda dapat memperluas fungsionalitas ini dengan menambahkan logika yang lebih kompleks ke fungsi serverless Anda, seperti memicu fungsi lain sebagai respons terhadap webhooks.
Kesimpulan
Plugin serverless Apache APISIX untuk event hooks menyediakan cara yang fleksibel dan skalabel untuk memicu fungsi serverless sebagai respons terhadap peristiwa yang terjadi selama pemrosesan permintaan API. Dengan menggunakan plugin ini, Anda dapat menyederhanakan arsitektur API, meningkatkan kinerja dan keandalan layanan Anda, dan mengurangi biaya pengelolaan infrastruktur aplikasi Anda.
Sumber daya terkait
Konten yang direkomendasikan
Komunitas
🙋 Bergabunglah dengan Komunitas Apache APISIX 🐦 Ikuti kami di Twitter 📝 Temukan kami di Slack