Integrasi Apache APISIX dengan Azure Serverless

API7.ai

December 1, 2021

Ecosystem

Integrasi Apache APISIX dengan Azure Serverless

Apache APISIX menyediakan dukungan untuk framework serverless dari vendor cloud populer (lebih banyak akan datang). Alih-alih meng-hardcode URL fungsi ke dalam aplikasi, Apache APISIX menyarankan untuk mendefinisikan rute dengan plugin serverless yang diaktifkan. Ini memberikan fleksibilitas kepada pengembang untuk memperbarui URI fungsi secara dinamis serta mengubah vendor faas ke penyedia cloud yang berbeda tanpa kesulitan. Selain itu, pendekatan ini mengurangi masalah otorisasi dan autentikasi dari logika aplikasi karena Apache APISIX memiliki dukungan autentikasi yang sangat kuat yang dapat digunakan untuk mengidentifikasi dan mengotorisasi klien untuk mengakses rute tertentu dengan faas. Artikel ini membahas tentang penambahan baru plugin azure-functions, dan memberikan instruksi detail tentang cara mengintegrasikan Azure Functions, yang merupakan solusi serverless yang banyak digunakan, ke dalam suite serverless Apache APISIX.

Cara kerja plugin azure-functions

Plugin azure-functions memungkinkan pengguna untuk mendefinisikan upstream ke fungsi serverless HTTP Trigger Azure untuk URI gateway. Jika diaktifkan, plugin ini akan menghentikan permintaan yang sedang berjalan ke URI tertentu dan memulai permintaan baru ke faas Azure (upstream baru) atas nama klien dengan detail otorisasi yang sesuai yang ditetapkan oleh pengguna, header permintaan, body permintaan, parameter (ketiga komponen ini diteruskan dari permintaan asli) dan mengembalikan body respons, kode status, dan header kembali ke klien asli yang telah memanggil permintaan ke agen Apache APISIX.

Plugin ini mendukung otorisasi ke layanan faas Azure melalui kunci API dan direktori aktif Azure.

Cara Menggunakan Azure Functions dengan Apache APISIX

Tujuan utama plugin ini adalah untuk memproksi rute gateway yang ditentukan dalam konfigurasi rute ke URI fungsi Azure. Bagian ini memberikan panduan praktis tentang cara mengonfigurasi dan membuat HTTP Trigger serverless di cloud Azure.

  1. Pertama, daftar/masuk ke Microsoft Azure dan siapkan rencana percobaan. Azure Functions gratis selamanya hingga 1 juta pemanggilan. Untuk mengetahui lebih lanjut tentang harga, kunjungi di sini.

  2. Kunjungi Portal Azure (FYI, layanan Azure dapat diakses melalui portal web, CLI & VSCode. untuk kemudahan pengguna, kami menggunakan web).

    1. Pertama, buat grup sumber daya untuk mempartisi faas yang akan Anda buat secara logis. buat grup sumber daya
    2. Buat aplikasi fungsi dengan URL pilihan Anda (saya akan memilih test-apisix). buat aplikasi fungsi
  3. Instal Azure Functions extension ke editor VSCode. Setelah instalasi, lakukan autentikasi melalui ekstensi dan instal alat inti fungsi Azure untuk pengembangan lokal dengan:

    npm install -g azure-functions-core-tools@3 --unsafe-perm true
  4. Deploy cuplikan berikut ke aplikasi fungsi yang baru saja kita buat melalui panel Azure Functions extension di VSCode:

    module.exports = async function (context, req) { context.log("HTTP trigger invoked on Test-APISIX."); const name = req.query.name || (req.body && req.body.name); const responseMessage = name ? "Hello, " + name : "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body to generate a personalized response."; context.res = { // status: 200, /* Defaults to 200 */ body: responseMessage, }; };

Cuplikan ini mengambil nama dari parameter query (jika ada, jika tidak dari body permintaan) dan menyapa pengguna.

Mengaktifkan plugin azure-functions

Berikut adalah contoh cara mengaktifkan plugin azure-functions untuk rute tertentu. Kami mengasumsikan HTTP Trigger Anda telah di-deploy dan siap untuk dilayani.

# aktifkan plugin untuk rute tertentu curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "plugins": { "azure-functions": { "function_uri": "http://test-apisix.azurewebsites.net/api/HttpTrigger", "authorization": { "apikey": "<Generated API key to access the Azure-Function>" } } }, "uri": "/azure" }'

Sekarang, setiap permintaan (HTTP/1.1, HTTPS, HTTP2) ke URI /azure pada gateway Apache APISIX akan memicu pemanggilan HTTP ke URI fungsi yang disebutkan di atas dan body respons beserta header respons dan kode respons akan diproksi kembali ke klien. Contohnya (di sini fungsi cloud Azure hanya mengambil parameter query name dan mengembalikan Hello $name):

curl -i -XGET http://localhost:9080/azure\?name=Bisakh HTTP/1.1 200 OK Content-Type: text/plain; charset=utf-8 Transfer-Encoding: chunked Connection: keep-alive Request-Context: appId=cid-v1:38aae829-293b-43c2-82c6-fa94aec0a071 Date: Wed, 19 Nov 2021 18:46:55 GMT Server: APISIX/2.10.2 Hello, Bisakh

Mengingat, Apache APISIX juga berjalan dengan enable_http2: true pada config-default.yaml untuk port 9081 (misalnya), komunikasi HTTP/2 antara klien dan agen APISIX akan diproksi ke faas Azure mirip dengan HTTP/1.1 dan respons akan diproksi kembali ke klien dengan header yang sesuai. Contohnya:

curl -i -XGET --http2 --http2-prior-knowledge http://localhost:9081/azure\?name=Bisakh HTTP/2 200 content-type: text/plain; charset=utf-8 request-context: appId=cid-v1:38aae829-293b-43c2-82c6-fa94aec0a071 Date: Wed, 19 Nov 2021 18:46:56 GMT server: APISIX/2.10.2 Hello, Bisakh

Menonaktifkan plugin azure-functions

Sekarang, untuk menonaktifkan plugin, cukup hapus konfigurasi JSON yang sesuai dalam konfigurasi plugin untuk menonaktifkan plugin azure-functions dan tambahkan konfigurasi upstream yang sesuai. Plugin Apache APISIX dimuat ulang secara dinamis, sehingga tidak perlu me-restart Apache APISIX.

curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "uri": "/azure", "plugins": {}, "upstream": { "type": "roundrobin", "nodes": { "127.0.0.1:1980": 1 } } }'

Konfigurasi Kustom

Dalam konfigurasi minimal saat membuat rute baru dengan plugin azure-functions yang diaktifkan, function_uri adalah atribut wajib dari konfigurasi plugin yang menunjuk ke URL fungsi. Ada banyak opsi tambahan yang dapat disesuaikan dengan skema plugin dan skema metadata.

Skema Plugin

NamaTipeDiperlukanDefaultValidDeskripsi
function_uristringdiperlukann/an/aEndpoint fungsi Azure yang memicu kode fungsi serverless (misalnya http://test-apisix.azurewebsites.net/api/HttpTrigger).
authorizationobjectopsionaln/an/aKredensial otorisasi untuk mengakses fungsi cloud.
authorization.apikeystringopsionaln/an/aField di dalam authorization. Kunci API yang dihasilkan untuk mengotorisasi permintaan ke endpoint tersebut.
authorization.clientidstringopsionaln/an/aField di dalam authorization. Client ID (direktori aktif Azure) untuk mengotorisasi permintaan ke endpoint tersebut.
timeoutintegeropsional3000[100,...]Timeout permintaan proxy dalam milidetik.
ssl_verifybooleanopsionaltruetrue/falseApakah verifikasi SSL server diaktifkan.
keepalivebooleanopsionaltruetrue/falseUntuk menggunakan kembali koneksi proxy yang sama di masa mendatang. Setel ke false untuk menonaktifkan keepalive dan segera menutup koneksi.
keepalive_poolintegeropsional5[1,...]Jumlah maksimum koneksi dalam pool.
keepalive_timeoutintegeropsional60000[1000,...]Timeout idle maksimal (ms).

Ini memberikan banyak fleksibilitas untuk mengikat perilaku faas Azure dengan erat - dari mengonfigurasi timeout hingga pool keepalive dan memvalidasi sertifikat SSL dari faas serverless. Sejujurnya, ini sangat berarti ketika berbicara tentang serverless karena layanan bersifat event-driven dan sumber daya dialokasikan oleh penyedia cloud secara dinamis.

Skema Metadata

Demikian pula, ada beberapa atribut yang dapat disesuaikan dengan menggunakan metadata.

NamaTipeDiperlukanDefaultValidDeskripsi
master_apikeystringopsional""n/aKunci API rahasia yang dapat digunakan untuk mengakses URI fungsi Azure.
master_clientidstringopsional""n/aClient ID (direktori aktif) yang dapat digunakan untuk mengotorisasi URI fungsi.

Metadata untuk plugin azure-functions menyediakan fungsionalitas untuk fallback otorisasi. Ini mendefinisikan master_apikey dan master_clientid (client id direktori aktif Azure) di mana pengguna (opsional) dapat mendefinisikan kunci API master atau Client ID untuk deployment aplikasi yang kritis. Jadi, jika tidak ada detail otorisasi yang ditemukan di dalam atribut plugin, detail otorisasi yang ada di metadata akan digunakan.

Urutan prioritas relatif adalah sebagai berikut:

  • Pertama, plugin mencari kunci x-functions-key atau x-functions-clientid di dalam header permintaan ke agen Apache APISIX.
  • Jika tidak ditemukan, plugin azure-functions memeriksa detail otorisasi di dalam atribut plugin. Jika ada, itu akan menambahkan header yang sesuai ke permintaan yang dikirim ke fungsi cloud Azure.
  • Jika tidak ada detail otorisasi yang ditemukan di dalam atribut plugin, Apache APISIX akan mengambil konfigurasi metadata untuk plugin ini dan menggunakan kunci master.

Untuk menambahkan Master APIKEY baru, buat permintaan ke endpoint /apisix/admin/plugin_metadata dengan metadata yang diperbarui sebagai berikut:

curl http://127.0.0.1:9080/apisix/admin/plugin_metadata/azure-functions \ -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "master_apikey" : "<Your azure master access key>" }'

Ringkasan

Plugin azure-functions adalah plugin kedua Apache APISIX yang dirancang untuk serverless. Kami sedang mengembangkan plugin serverless lainnya dan akan menampilkannya dengan rilis Apache APISIX mendatang. Jika Anda tertarik, jangan ragu untuk mengajukan issue untuk berbagi pendapat Anda. Anda juga dapat membahas proposal Anda untuk mengembangkan plugin baru di mailing list kami!

Tags: