Mengelola API serverless dengan Apache APISIX

Bobur Umurzokov

Bobur Umurzokov

January 18, 2023

Technology

Komputasi serverless memungkinkan pengembang untuk membangun aplikasi lebih cepat dengan menghilangkan kebutuhan untuk mengelola infrastruktur. Dengan API serverless di cloud, penyedia layanan cloud secara otomatis menyediakan, menskalakan, dan mengelola infrastruktur yang diperlukan untuk menjalankan kode. Dalam artikel ini, Anda akan mempelajari cara mengintegrasikan Apache APISIX API Gateway dengan Azure Functions untuk mengelola API serverless berbasis Java.

Tujuan Pembelajaran

Anda akan mempelajari hal-hal berikut sepanjang artikel ini:

  • Apa itu API serverless?
  • Peran API Gateway dalam mengelola lalu lintas API serverless yang kompleks.
  • Cara menyiapkan Apache APISIX Gateway.
  • Cara membangun API serverless dengan Azure Functions.
  • Cara mengekspos API serverless sebagai layanan upstream.
  • Cara mengamankan API serverless dengan plugin autentikasi APISIX.
  • Cara menerapkan kebijakan pembatasan kecepatan.

Apache APISIX menawarkan plugin tambahan yang dapat digunakan dengan solusi serverless lainnya seperti AWS Lambda.

Sebelum kita memulai sisi praktis dari tutorial ini, mari kita bahas beberapa konsep terlebih dahulu.

Apa itu API serverless?

API serverless sama dengan API tradisional, kecuali mereka menggunakan backend serverless. Bagi bisnis dan pengembang, komputasi serverless berarti mereka tidak perlu lagi khawatir tentang pemeliharaan server atau penskalaan sumber daya server untuk memenuhi permintaan pengguna. Selain itu, API serverless menghindari masalah penskalaan karena mereka membuat sumber daya server setiap kali permintaan dibuat. API serverless mengurangi latensi karena mereka dihosting di server asal. Terakhir, komputasi serverless jauh lebih efisien biaya dibandingkan alternatif tradisional seperti membangun seluruh mikrolayanan.

API serverless menggunakan Azure Function

Azure Function adalah cara sederhana untuk menjalankan potongan kode kecil di cloud. Anda tidak perlu khawatir tentang infrastruktur yang diperlukan untuk menghosting kode tersebut. Anda dapat menulis Function dalam C#, Java, JavaScript, PowerShell, Python, atau bahasa lain yang tercantum dalam bahasa yang didukung.

Dengan Azure Functions, Anda dapat dengan cepat membangun API HTTP untuk aplikasi web Anda tanpa repot dengan kerangka kerja web. Azure Functions bersifat serverless, jadi Anda hanya dikenakan biaya ketika endpoint HTTP dipanggil. Ketika endpoint tidak digunakan, Anda tidak dikenakan biaya. Kedua hal ini digabungkan membuat platform serverless seperti Azure Functions menjadi pilihan ideal untuk API di mana Anda mengalami lonjakan lalu lintas yang tidak terduga.

API Gateway untuk manajemen lalu lintas API serverless

API Gateway adalah bagian fundamental dari API serverless karena bertanggung jawab atas koneksi antara API yang ditentukan dan fungsi yang menangani permintaan ke API tersebut. Ada banyak manfaat API Gateway dalam arsitektur API berbasis serverless. Selain fungsi utama API Gateway seperti autentikasi, pembatasan kecepatan, observabilitas, caching, dan sebagainya, API Gateway mampu memanggil API serverless, berlangganan ke event, kemudian memprosesnya menggunakan callback dan meneruskan permintaan autentikasi ke layanan otorisasi eksternal dengan logika fungsi serverless yang sepenuhnya kustom.

Mengelola API serverless dengan demo Apache APISIX

Dengan cukup pengetahuan teoretis, sekarang kita bisa melompat ke sesi praktis. Kami menggunakan contoh proyek repo apisix-manage-serverless-apis yang dihosting di GitHub. Anda dapat menemukan kode sumber dan contoh perintah curl yang kami gunakan dalam tutorial ini.

Untuk proyek mini kami, kami akan bekerja dengan dua fungsi Azure sederhana yang ditulis dalam Java yang mensimulasikan API serverless kami untuk layanan Product dan Review.

Prasyarat

Menyiapkan proyek

Hal pertama yang harus dilakukan adalah mengkloning repo proyek dari GitHub:

git clone https://github.com/Boburmirzo/apisix-manage-serverless-apis.git

Buka folder proyek di editor kode favorit Anda. Tutorial ini memanfaatkan VS Code.

Menjalankan Apache APISIX

Untuk menjalankan Apache APISIX dan Azure Functions secara lokal, 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. Misalnya, jika Docker desktop terinstal di mesin Anda, Anda dapat melihat kontainer yang berjalan di sana:

Apisix berjalan di Docker

Kami menginstal APISIX di lingkungan lokal kami dalam demo ini, tetapi Anda juga dapat menerapkannya ke Azure dan menjalankannya di Azure Container Instance. Lihat tutorial berikut.

Menjalankan Azure Functions

Kemudian, navigasikan ke folder /upstream:

mvn clean install mvn azure-functions:run

Dua fungsi akan dimulai di jendela terminal. Anda dapat meminta kedua API serverless di browser Anda:

Contoh:

API serverless Products

API serverless Reviews

Menerapkan Azure Functions

Selanjutnya, kami menerapkan kode fungsi ke Azure Function App dengan menjalankan perintah berikut:

mvn azure-functions:deploy

Atau Anda bisa mengikuti tutorial ini tentang cara menerapkan proyek fungsi ke Azure

Perhatikan bahwa nama aplikasi fungsi dihasilkan secara acak berdasarkan artifactId Anda, ditambahkan dengan nomor yang dihasilkan secara acak. Dalam perintah tutorial, nama aplikasi fungsi serverless-apis disebutkan.

Untuk memastikan fungsi kami berfungsi, kami dapat menguji panggilan langsung dengan meminta URL-nya di browser:

https://serverless-apis.azurewebsites.net/api/products https://serverless-apis.azurewebsites.net/api/reviews

Mengekspos API serverless di APISIX

Setelah penyiapan selesai, sekarang kami akan mengekspos API fungsi Azure serverless sebagai layanan upstream di APISIX. Untuk melakukannya, kami perlu membuat Route baru dengan plugin azure-function diaktifkan untuk kedua API backend serverless products dan reviews.

Jika plugin azure-function diaktifkan pada suatu rute, APISIX akan mendengarkan permintaan pada jalur rute tersebut, dan kemudian memanggil kode Azure Function jarak jauh dengan parameter dari permintaan tersebut.

Membuat Route untuk Products

Untuk membuat rute untuk fungsi Products, jalankan perintah berikut:

curl http://127.0.0.1:9180/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "name": "Create a route with Azure function plugin", "plugins": { "azure-functions": { "function_uri": "https://serverless-apis.azurewebsites.net/api/products", "ssl_verify": false } }, "uri": "/products" }'

Perhatikan bahwa kami mengatur atribut ssl_verify dari plugin azure-functions ke false untuk menonaktifkan verifikasi SSL hanya untuk tujuan demo. Anda juga dapat mengaktifkannya untuk melakukan permintaan yang lebih aman dari APISIX ke Azure Functions. Pelajari parameter konfigurasi lainnya.

Menguji dengan permintaan curl

Kami dapat menggunakan curl untuk mengirim permintaan, melihat apakah APISIX mendengarkan jalur dengan benar dan meneruskan permintaan ke layanan upstream dengan sukses:

curl -i -XGET http://127.0.0.1:9080/products HTTP/1.1 200 OK [ { "id": 1, "name": "Product1", "description": "Description1" }, { "id": 2, "name": "Product2", "description": "Description2" } ]

Bagus! Kami mendapatkan respons dari API serverless yang sebenarnya di Azure Function.

Selanjutnya, kami akan membuat konfigurasi serupa untuk fungsi reviews.

Membuat Route untuk Reviews dan menguji

Buat rute kedua dengan plugin Azure function diaktifkan:

curl http://127.0.0.1:9180/apisix/admin/routes/2 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "plugins": { "azure-functions": { "function_uri": "https://serverless-apis.azurewebsites.net/api/reviews", "ssl_verify": false } }, "uri": "/reviews" }'

Uji respons API serverless:

curl -i -XGET http://127.0.0.1:9080/reviews

Di bagian ini, kami memperkenalkan rute baru dan menambahkan plugin azure-functions ke API serverless kami sehingga APISIX dapat memanggil fungsi Azure jarak jauh dan mengelola lalu lintas. Di bagian berikutnya, kami akan mempelajari cara mengautentikasi konsumen API dan menerapkan kebijakan runtime seperti pembatasan kecepatan.

Mengamankan API serverless dengan plugin autentikasi APISIX

Sampai saat ini, API serverless kami bersifat publik dan dapat diakses oleh pengguna yang tidak sah. Di bagian ini, kami akan mengaktifkan fitur autentikasi untuk mencegah permintaan yang tidak sah ke API serverless.

Apache APISIX dapat memverifikasi identitas yang terkait dengan permintaan API melalui validasi kredensial dan token. Selain itu, APISIX mampu menentukan lalu lintas mana yang diizinkan untuk melewati API ke layanan backend. Anda dapat memeriksa semua plugin autentikasi yang tersedia.

Mari buat konsumen baru untuk API serverless kami dan tambahkan plugin basic-auth ke rute yang ada sehingga hanya pengguna yang diizinkan yang dapat mengaksesnya.

Membuat konsumen baru untuk API serverless

Perintah berikut akan membuat konsumen baru kami dengan kredensial seperti nama pengguna dan kata sandi:

curl http://127.0.0.1:9180/apisix/admin/consumers -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "username": "consumer1", "plugins": { "basic-auth": { "username": "username1", "password": "password1" } } }

Menambahkan plugin basic auth ke rute Products dan Services yang ada

Sekarang kami mengonfigurasi plugin basic-auth untuk rute agar APISIX memeriksa header permintaan dengan kredensial konsumen API setiap kali API dipanggil:

curl http://127.0.0.1:9180/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "name": "Create a route with Azure function plugin", "plugins": { "azure-functions": { "function_uri": "https://serverless-apis.azurewebsites.net/api/products", "ssl_verify": false }, "basic-auth": {} }, "uri": "/products" }'
curl http://127.0.0.1:9180/apisix/admin/routes/2 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "plugins": { "azure-functions": { "function_uri": "https://serverless-apis.azurewebsites.net/api/reviews", "ssl_verify": false }, "basic-auth": {} }, "uri": "/reviews" }'

Menguji plugin basic auth

Sekarang jika kami meminta API serverless tanpa kredensial pengguna di header, kami akan mendapatkan kesalahan tidak sah:

curl -i http://127.0.0.1:9080/products HTTP/1.1 401 Unauthorized {"message":"Missing authorization in request"}

Hasilnya sesuai dengan yang kami harapkan. Tetapi jika kami memberikan kredensial pengguna yang benar dalam permintaan dan mengakses endpoint yang sama, itu akan berfungsi dengan baik:

curl -i -u username1:password1 http://127.0.0.1:9080/products HTTP/1.1 200 OK

Kami telah memvalidasi identitas klien yang mencoba meminta API serverless dengan menggunakan plugin autentikasi dasar dengan bantuan Apache APISIX.

Menerapkan kebijakan pembatasan kecepatan untuk API serverless

Di bagian ini, kami akan melindungi API serverless dari penyalahgunaan dengan menerapkan kebijakan pembatasan. Di Apache APISIX Gateway, kami dapat menerapkan pembatasan kecepatan untuk membatasi jumlah panggilan masuk.

Menerapkan dan menguji kebijakan pembatasan kecepatan

Dengan konfigurasi rute yang ada untuk fungsi Products dan Reviews, kami dapat menerapkan kebijakan pembatasan kecepatan dengan plugin limit-count untuk melindungi API kami dari penggunaan yang tidak normal. Kami akan membatasi jumlah panggilan API menjadi 2 per 60 detik per konsumen API.

Untuk mengaktifkan plugin limit-count untuk rute Products yang ada, kami perlu menambahkan plugin ke atribut plugins dalam konfigurasi rute Json kami:

curl http://127.0.0.1:9180/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "name": "Create a route with Azure function plugin", "plugins": { "azure-functions": { "function_uri": "https://serverless-apis.azurewebsites.net/api/products", "ssl_verify": false }, "basic-auth": {}, "limit-count": { "count": 2, "time_window": 60, "rejected_code": 403, "rejected_msg": "Requests are too frequent, please try again later." } }, "uri": "/products" }'

Apache APISIX akan menangani dua permintaan pertama seperti biasa. Namun, permintaan ketiga dalam periode yang sama akan mengembalikan kode 403 HTTP Forbidden dengan pesan kesalahan kustom kami:

HTTP/1.1 403 Forbidden {"error_msg":"Requests are too frequent, please try again later."}

Langkah Selanjutnya

Dalam artikel ini, kami mempelajari langkah demi langkah cara membuat API serverless berbasis Java dengan Azure Functions dan Apache APISIX Gateway untuk mengelola API Anda sepanjang siklus hidupnya, mulai dari mengekspos API serverless sebagai layanan upstream di APISIX hingga mengamankan dan menerapkan pembatasan kecepatan untuk membatasi jumlah permintaan. Ini membuka pintu ke kasus penggunaan lain dari integrasi API Gateway dan API serverless.

Anda dapat menjelajahi kemampuan lain dari APISIX Gateway dengan merantai berbagai plugin bawaan untuk mengubah permintaan, memantau ketersediaan, kinerja, dan penggunaan API serverless kami, menyimpan respons API dan lebih lanjut mengembangkannya dengan versi API yang membantu Anda mengurangi waktu pengembangan, meningkatkan skalabilitas, dan menghemat biaya.

Apache APISIX adalah solusi API Gateway yang sepenuhnya open-source. Jika Anda memerlukan fitur manajemen API yang lebih canggih untuk API serverless, Anda dapat menggunakan API7 Enterprise atau API7 Cloud yang didukung oleh APISIX.

Sumber Daya Terkait

Konten yang Direkomendasikan

Tags: