Plugin di Kong yang Customizable

Sekarang kita akan belajar membuat plugin di Kong. Sebenarnya Kong sudah menyediakan beberapa plugin yang bisa kita gunakan, misalnya saja JWT, Request Transformer, Pre Plugin, dan lain-lain. Akan tetapi ada keadaan dimana kita harus membuat plugin custom yang sesuai dengan kebutuhan kita. Oleh karena itu tidak ada salahnya kita belajar untuk membuat plugin sendiri. Oh ya, untuk mengikuti materi ini pastikan teman-teman sudah membaca cara memasang Kong di Docker ya. Selain itu teman-teman juga wajib membaca tentang integrasi Kong dengan Backend.

Plugin di Kong yang akan kita coba buat pada tulisan ini adalah plugin untuk memodifikasi header. Mari kita beri nama plugin tersebut dengan custom-header. Nantinya, plugin custom-header akan menambahkan beberapa header terhadap request yang masuk ke Kong. Setelah itu, request akan diteruskan ke backed. Kita pastikan backend dapat membaca header tambahan yang diset oleh custom-header.

Menyiapkan File dan Docker

Sebelum kita membuat plugin, kita harus menyiapkan dulu kebutuhannya. Pertama kita buat folder dengan nama plugins, dan di dalamnya terdapat folder lagi dengan nama custom-header. Di dalam folder custom-header kita buat 2 file, yaitu handler.lua dan schema.lua (kosongkan dulu saja). Jadi struktur folder yang kita buat pada materi sebelumnya kita modifikasi menjadi seperti ini:

kong/
├── docker-compose.yml
├── Dockerfile
├── kong.yml
├── plugins/
│   └── custom-header/
│       ├── handler.lua
│       └── schema.lua

Sebelumnya kita tidak menggunakan Dockerfile, tapi sekarang kita menggunakan Dockerfile yang digunakan untuk mengcopy plugins custom-header ke dalam Kong. Isilah Dockerfile seperti ini:

FROM kong:3.9

COPY plugins /usr/local/share/lua/5.1/kong/plugins

ENV KONG_PLUGINS="bundled,custom-header"

Karena sekarang kita menggunakan Dockerfile, jangan lupa untuk memodifikasi docker compose kong.yml seperti berikut:

#sebelumnya menggunakan Dockerfile
services:
  kong:
    image: kong:3.9
    container_name: kong

#setelah menggunakan docker file
services:
  kong:
    image: kong:3.9
    build:
      context: .
    container_name: kong
.........dst

Membuat Plugin di Kong

Jika struktur folder sudah siap, sekarang kita modifikasi file schema.lua dan handler.lua. schema.lua ini berisi definisi metadata plugin yang kita buat, misalnya nama plugin atau pengaturan input, sedangkan file handler.lua berisi implementasi logika plugin.

-- schema.lua
return {
  name = "custom-header",
  fields = {
    { config = { type = "record", fields = {} } }
  }
}
-- handler.lua
local plugin = {
  PRIORITY = 1000,
  VERSION = "1.0.0"
}

function plugin.access(self, conf)
    kong.service.request.set_header("x-user-id", "123")
    kong.service.request.set_header("x-user-name", "ardhanx")
end

return plugin

Seperti yang kita sebutkan di awal, kita akan menambahkan beberapa header menggunakan plugin Custom Header. Header yang kita tambahkan adalah x-user-id dan x-user-name.

Build Ulang Kong

Untuk menjalankan Custom Plugin di Kong kita harus melakukan build ulang kong terlebih dahulu. Gunakan langkah-langkah berikut ini untuk melakukan build ulang:

Stop kong yang sedang berjalan dengan perintah:

sudo docker stop kong

Build ulang kong dengan parameter –no-cache

sudo docker compose -f kong.yml build --no-cache

Jalankan kembali kong

sudo docker compose -f kong.yml up -d

Jangan lupa memastikan kong kembali terkoneksi dengan kong-network

sudo docker network connect kong-network kong

Cek kembali kong manager di port 8002 dan masuklah ke menu Plugins dan klik New Plugin. Scroll ke bawah hingga menemukan Custom Plugins, dan kita akan melihat plugin yang kita buat akan muncul di sana:

custom plugin di kong

Menambah Plugin di Kong Gateway Service

Plugin yang kita buat harus kita enable dan kita kaitkan dengan Gateway Service. Jadi, ingat kembali bagaimana kita membuat integrasi kong dengan backend. Masuk ke Gateway Service yang sudah kita buat, lalu pilih tab Plugins

menambahkan custom plugin di kong ke gateway service

Pada tampilan di atas, klik tombol New Plugin dan pilihlah custom-header untuk di enable. Jika berhasil tampilan Plugins akan berubah seperti ini:

berhasil menambahkan custom plugin di kong

Menyesuaikan Backend User Service

Karena menguji apakah plugin custom-header berhasil, kita harus memastikannya di backend User Service. Jadi kita buat method pada UserController agar dapat membaca header. Jadi mari kita modifikasi seperti ini:

package com.myapp.user_service;

import org.springframework.web.bind.annotation.*;

@RestController
public class UserController {
    /*source code sebelumnya*/
    @GetMapping("/check_header")
    public String checkHeader(
        @RequestHeader("x-user-id") String userId,
        @RequestHeader("x-user-name") String name
    ) {
        return "user id: "+userId+", user name: "+name;
    }
}

Jangan lupa ritual commandnya ya:

  1. sudo docker compose stop user-service
  2. mvn package
  3. sudo docker compose build –no-cache
  4. sudo docker compose up -d
  5. sudo docker network connect kong-network user-service

Jika sudah, mari kita lihat hasilnya menggunakan insomnia.

berhasil melakukan request dengan custom plugin di kong

Nah, pada insomnia, kita dapat melihat response yang sesuai harapan. Backend kita sudah dapat membaca header yang dibuat oleh custom-header.

Penutup Plugin di Kong

Nah, sekarang kita sudah bisa membuat custom plugin di kong. Apakah custom plugin hanya sebatas itu saja? tentu saja tidak, ada banyak hal yang bisa lakukan. Mungkin teman-teman melihat di custom plugin milikku ada custom plugin jwt-claims-to-header. Plugin itu digunakan untuk mendapatkan authorization header berupa JWT dan meng-extract claims lalu mengirim claims ke backend lewat header. Jika teman-teman ingin membuat plugin yang lain, coba teman-teman pikirkan kira-kira apa yang bisa dikreasikan dari request. Selamat mencoba ya. Semoga berhasil

Ardhan Wahyu Rahmanu
Ardhan Wahyu Rahmanu

Aku adalah seorang pemikir sistematis yang idealis, mandiri, dan reflektif — terus-menerus membangun hidup yang bermakna melalui belajar, bekerja, menulis, dan menjaga arah hidup yang sadar.

Articles: 98

Tinggalkan Balasan

error: Content is protected !!