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:

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

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

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:
- sudo docker compose stop user-service
- mvn package
- sudo docker compose build –no-cache
- sudo docker compose up -d
- sudo docker network connect kong-network user-service
Jika sudah, mari kita lihat hasilnya menggunakan insomnia.

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