全部产品
Search
文档中心

API Gateway:Gunakan plugin Lua

更新时间:Jun 28, 2025

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

  1. Masuk ke konsol API Gateway.

  2. Di panel navigasi sisi kiri, klik Cloud-native API Gateway > Instance. Di bilah navigasi atas, pilih wilayah.

  3. Di halaman Instance, klik ID instance target.

  4. Di pohon navigasi sisi kiri, klik Plug-in. Lalu, klik Install Plug-in.

  5. Di kotak pencarian, cari dengan kata kunci lua. Pada kartu lua, klik Instal. Di kotak dialog yang muncul, klik Install and Configure.

  6. 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 Anda ingin menggunakan JSON, Anda dapat menggunakan metode berikut:

  • Impor paket JSON: local json = require "json".

  • Serialisasi data JSON: local json_str = json.encode(obj).

  • Deserialisasi data JSON: local obj = json.decode(json_str).

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

  1. Masuk ke konsol API Gateway.

  2. Di panel navigasi sisi kiri, klik Cloud-native API Gateway > Instance. Di bilah navigasi atas, pilih wilayah.

  3. Di halaman Instance, klik ID instance target.

  4. Di pohon navigasi sisi kiri, klik Plug-in. Temukan plugin yang ingin Anda kelola dan klik Rule Configuration di kolom Actions.

  5. Di panel Rule Configurations, konfigurasikan kode Lua berikut.

    Catatan

    Dalam contoh kode, hanya badan permintaan dan badan respons dari tipe konten berikut 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") .. "]")
    end
  6. Klik halaman detail plugin lua, klik tab Log lalu klik Enable Log Shipping.

  7. 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

  1. Masuk ke konsol API Gateway.

  2. Di panel navigasi sisi kiri, klik Cloud-native API Gateway > Instance. Di bilah navigasi atas, pilih wilayah.

  3. Di halaman Instance, klik ID instance target.

  4. Di pohon navigasi sisi kiri, klik Plug-in. Temukan plugin yang ingin Anda kelola dan klik Rule Configuration di kolom Actions.

  5. Di panel Rule Configurations, konfigurasikan kode Lua berikut.

  6. 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"))
    end
  7. Di 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.

    image