Lua adalah bahasa skrip yang ringan dan sangat efisien. Dalam pengembangan gateway, Lua dapat digunakan untuk menulis dan menjalankan berbagai program gateway seperti API Gateway, message gateway, dan reverse proxy. Pengembang dapat menggunakan Lua untuk mengimplementasikan fitur-fitur seperti pengarahan permintaan, penyaringan, otentikasi, serta pemrosesan kustom. Lua dapat disematkan ke dalam proxy seperti NGINX dan Envoy untuk pemrosesan permintaan dan respons, output log, serta operasi kustom lainnya. Dalam topik ini, Lua disematkan ke dalam proxy Envoy untuk pemrosesan permintaan dan respons. Topik ini menjelaskan cara menggunakan Lua untuk mencetak header dan badan permintaan serta respons di dalam log.
Batasan
Versi instance Cloud-native API Gateway Anda harus 2.0.0 atau lebih baru.
Perhatian
Untuk alasan keamanan, pustaka dan fungsi Lua berikut dinonaktifkan secara default di Cloud-native API Gateway:
debug.debug
debug.getfenv
debug.getregistry
dofile
io
loadfile
os.execute
os.getenv
os.remove
os.rename
os.tmpname
Prosedur
Masuk ke konsol API Gateway.
Di panel navigasi sisi kiri, klik . Di bilah navigasi atas, pilih wilayah.
Di halaman Instance, klik ID instance target.
Di pohon navigasi sisi kiri, klik Plug-in. Lalu, klik Install Plug-in.
Di kotak pencarian, cari dengan kata kunci lua. Pada kartu lua, klik Instal. Di kotak dialog yang muncul, klik Install and Configure.
Di panel Rule Configurations, konfigurasikan parameter berikut:
Di bagian Effective Scope, pilih cakupan aplikasi untuk plugin Lua.
Jika Anda memilih Operation-/Route-level Plug-in Rules atau Domain-level plug-in rules untuk parameter Cakupan Efektif, klik Add Rule di sebelah kanan dan konfigurasikan parameter di panel yang muncul. Tulis kode Lua Anda di bidang Plug-in Rules dan klik OK.
Jika Anda memilih Instance-level plug-in rules untuk parameter Cakupan Efektif, tulis kode Lua Anda di bidang Plug-in Rules di sebelah kanan dan klik Save.
Referensi API
Untuk informasi lebih lanjut tentang API Lua yang disediakan oleh gateway cloud-native, lihat Lua.
Jika terjadi kesalahan selama serialisasi atau deserialisasi, Lua memanggil fungsi error untuk mengembalikan kesalahan dan menghentikan proses saat ini.
Kasus penggunaan umum
Tampilkan informasi lengkap permintaan dan respons di log plugin
Masuk ke konsol API Gateway.
Di panel navigasi sisi kiri, klik . Di bilah navigasi atas, pilih wilayah.
Di halaman Instance, klik ID instance target.
Di pohon navigasi sisi kiri, klik Plug-in. Temukan plugin yang ingin Anda kelola dan klik Rule Configuration di kolom Actions.
Di panel Rule Configurations, konfigurasikan kode Lua berikut.
CatatanDalam contoh kode, hanya badan permintaan dan badan respons dari
tipe kontenberikut yang ditampilkan. Ukuran badan tidak boleh melebihi 1.024 byte (1 KB).application/x-www-form-urlencoded
application/json
text/plain
local maxBodySize = 1024 function check_content_readable(type) if type == nil then return false end if string.find(type, "application/x-www-form-urlencoded",1,true) or string.find(type, "application/json",1,true) or string.find(type, "text/plain",1,true) then return true end return false end function envoy_on_request(request_handle) local headers = request_handle:headers() local headersStr = "" local contentType for key, value in pairs(headers) do if key == "content-type" then contentType = value end headersStr = headersStr .. key .. "=" .. value .. ", " end request_handle:streamInfo():dynamicMetadata():set("envoy.lua","request_headers",headersStr) local requestBody = "" if check_content_readable(contentType) then for chunk in request_handle:bodyChunks() do if (chunk:length() > 0) then requestBody = requestBody .. chunk:getBytes(0, chunk:length()) end if (#requestBody > maxBodySize) then requestBody = requestBody .. "<truncated>" break end end end request_handle:streamInfo():dynamicMetadata():set("envoy.lua","request_body",string.gsub(requestBody,"\n","\\n")) end function envoy_on_response(response_handle) local headers = response_handle:headers() local headersStr = "" local contentType local contentEncoding = false for key, value in pairs(headers) do if key == "content-type" then contentType = value elseif key == "content-encoding" then contentEncoding = true end headersStr = headersStr .. key .. "=" .. value .. ", " end local responseBody = "" if check_content_readable(contentType) and not contentEncoding then for chunk in response_handle:bodyChunks() do if (chunk:length() > 0) then responseBody = responseBody .. chunk:getBytes(0, chunk:length()) end if (#responseBody > maxBodySize) then responseBody = responseBody .. "<truncated>" break end end end local reqHeaders = "" local reqBody = "" local metadata = response_handle:streamInfo():dynamicMetadata():get("envoy.lua") if metadata ~= nil then local headers = response_handle:streamInfo():dynamicMetadata():get("envoy.lua")["request_headers"] if headers ~= nil then reqHeaders = headers end local body = response_handle:streamInfo():dynamicMetadata():get("envoy.lua")["request_body"] if body ~= nil then reqBody = body end end response_handle:logInfo("request Headers: [" .. reqHeaders .. "] request Body: [" .. string.gsub(reqBody,"\n","\\n") .. "] response Headers: [" .. headersStr .. "] response Body: [" .. string.gsub(responseBody,"\n","\\n") .. "]") endKlik halaman detail plugin lua, klik tab Log lalu klik Enable Log Shipping.
Setelah Anda mengaktifkan pengiriman log, log plugin dikirim ke Layanan Log Sederhana dan dapat dilihat di konsol.
Tambahkan informasi lengkap permintaan dan respons ke log akses
Masuk ke konsol API Gateway.
Di panel navigasi sisi kiri, klik . Di bilah navigasi atas, pilih wilayah.
Di halaman Instance, klik ID instance target.
Di pohon navigasi sisi kiri, klik Plug-in. Temukan plugin yang ingin Anda kelola dan klik Rule Configuration di kolom Actions.
Di panel Rule Configurations, konfigurasikan kode Lua berikut.
Anda dapat mengonfigurasi metadata dinamis kustom untuk parameter log akses gateway. Dalam hal ini, Anda harus mendefinisikan metadata di plugin. Contoh kode berikut mendefinisikan empat jenis informasi metadata, yang sesuai dengan header permintaan, badan permintaan, header respons, dan badan respons.
envoy.lua:request_headers
envoy.lua:request_body
envoy.lua:response_headers
envoy.lua:response_body
local maxBodySize = 1024 function check_content_readable(type) if type == nil then return false end if string.find(type, "application/x-www-form-urlencoded",1,true) or string.find(type, "application/json",1,true) or string.find(type, "text/plain",1,true) then return true end return false end function envoy_on_request(request_handle) local headers = request_handle:headers() local headersStr = "" local contentType for key, value in pairs(headers) do if key == "content-type" then contentType = value end headersStr = headersStr .. key .. "=" .. value .. ", " end request_handle:streamInfo():dynamicMetadata():set("envoy.lua","request_headers",headersStr) local requestBody = "" if check_content_readable(contentType) then for chunk in request_handle:bodyChunks() do if (chunk:length() > 0) then requestBody = requestBody .. chunk:getBytes(0, chunk:length()) end if (#requestBody > maxBodySize) then requestBody = requestBody .. "<truncated>" break end end end request_handle:streamInfo():dynamicMetadata():set("envoy.lua","request_body",string.gsub(requestBody,"\n","\\n")) end function envoy_on_response(response_handle) local headers = response_handle:headers() local headersStr = "" local contentType local contentEncoding = false for key, value in pairs(headers) do if key == "content-type" then contentType = value elseif key == "content-encoding" then contentEncoding = true end headersStr = headersStr .. key .. "=" .. value .. ", " end response_handle:streamInfo():dynamicMetadata():set("envoy.lua","response_headers",headersStr) local responseBody = "" if check_content_readable(contentType) and not contentEncoding then for chunk in response_handle:bodyChunks() do if (chunk:length() > 0) then responseBody = responseBody .. chunk:getBytes(0, chunk:length()) end if (#responseBody > maxBodySize) then responseBody = responseBody .. "<truncated>" break end end end response_handle:streamInfo():dynamicMetadata():set("envoy.lua","response_body",string.gsub(responseBody,"\n","\\n")) endDi pohon navigasi sisi kiri, klik Parameters. Di bagian Observability Parameters, modifikasi format log. Di kotak dialog Adjust Log Format, tambahkan item metadata berdasarkan kebutuhan bisnis Anda. Data yang sesuai akan ditampilkan di log.
