Pass Lua code as files and run in multiple phase
You can run the Pre-Function plugin in multiple phases.
For example, if you want to run code in the access and header_filter phases, configure both parameters,
pointing each parameter to your Lua code files or including the code directly. This example uses file syntax.
Using decK environment variables with Lua files
To pass the contents of a file to decK, pass it to an environment variable:
- Create your Lua script and save it in a file, for example,
access-function.lua.- Load the content of the Lua script into an environment variable using the following command:
export DECK_ACCESS_FUNCTION=$(cat access-function.lua)Copied!
If you’re using the API, you can also pass each Lua file as a form parameter and a filename, for example:
--form "config.access=@access-function.lua" \
Environment variables
-
ACCESS_FUNCTION: Lua code to run in the access phase. -
HEADER_FILTER_FUNCTION: Lua code to run in the header filter phase.
Add this section to your kong.yaml configuration file:
_format_version: "3.0"
plugins:
- name: pre-function
config:
access:
- ${{ env "DECK_ACCESS_FUNCTION" }}
header_filter:
- ${{ env "DECK_HEADER_FILTER_FUNCTION" }}
Make the following request:
curl -i -X POST http://localhost:8001/plugins/ \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
--data '
{
"name": "pre-function",
"config": {
"access": [
"'$ACCESS_FUNCTION'"
],
"header_filter": [
"'$HEADER_FILTER_FUNCTION'"
]
},
"tags": []
}
'
Make the following request:
curl -X POST https://{region}.api.konghq.com/v2/control-planes/{controlPlaneId}/core-entities/plugins/ \
--header "accept: application/json" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer $KONNECT_TOKEN" \
--data '
{
"name": "pre-function",
"config": {
"access": [
"'$ACCESS_FUNCTION'"
],
"header_filter": [
"'$HEADER_FILTER_FUNCTION'"
]
},
"tags": []
}
'
Make sure to replace the following placeholders with your own values:
-
region: Geographic region where your Kong Konnect is hosted and operates. -
KONNECT_TOKEN: Your Personal Access Token (PAT) associated with your Konnect account. -
controlPlaneId: Theidof the control plane.
See the Konnect API reference to learn about region-specific URLs and personal access tokens.
echo "
apiVersion: configuration.konghq.com/v1
kind: KongClusterPlugin
metadata:
name: pre-function
namespace: kong
annotations:
kubernetes.io/ingress.class: kong
konghq.com/tags: ''
labels:
global: 'true'
config:
access:
- '$ACCESS_FUNCTION'
header_filter:
- '$HEADER_FILTER_FUNCTION'
plugin: pre-function
" | kubectl apply -f -
Prerequisite: Configure your Personal Access Token
terraform {
required_providers {
konnect = {
source = "kong/konnect"
}
}
}
provider "konnect" {
personal_access_token = "$KONNECT_TOKEN"
server_url = "https://us.api.konghq.com/"
}
Add the following to your Terraform configuration to create a Konnect Gateway Plugin:
resource "konnect_gateway_plugin_pre_function" "my_pre_function" {
enabled = true
config = {
access = [var.access_function]
header_filter = [var.header_filter_function]
}
tags = []
control_plane_id = konnect_gateway_control_plane.my_konnect_cp.id
}
This example requires the following variables to be added to your manifest. You can specify values at runtime by setting TF_VAR_name=value.
variable "header_filter_function" {
type = string
}
Add this section to your kong.yaml configuration file:
_format_version: "3.0"
plugins:
- name: pre-function
service: serviceName|Id
config:
access:
- ${{ env "DECK_ACCESS_FUNCTION" }}
header_filter:
- ${{ env "DECK_HEADER_FILTER_FUNCTION" }}
Make sure to replace the following placeholders with your own values:
-
serviceName|Id: Theidornameof the service the plugin configuration will target.
Make the following request:
curl -i -X POST http://localhost:8001/services/{serviceName|Id}/plugins/ \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
--data '
{
"name": "pre-function",
"config": {
"access": [
"'$ACCESS_FUNCTION'"
],
"header_filter": [
"'$HEADER_FILTER_FUNCTION'"
]
},
"tags": []
}
'
Make sure to replace the following placeholders with your own values:
-
serviceName|Id: Theidornameof the service the plugin configuration will target.
Make the following request:
curl -X POST https://{region}.api.konghq.com/v2/control-planes/{controlPlaneId}/core-entities/services/{serviceId}/plugins/ \
--header "accept: application/json" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer $KONNECT_TOKEN" \
--data '
{
"name": "pre-function",
"config": {
"access": [
"'$ACCESS_FUNCTION'"
],
"header_filter": [
"'$HEADER_FILTER_FUNCTION'"
]
},
"tags": []
}
'
Make sure to replace the following placeholders with your own values:
-
region: Geographic region where your Kong Konnect is hosted and operates. -
KONNECT_TOKEN: Your Personal Access Token (PAT) associated with your Konnect account. -
controlPlaneId: Theidof the control plane. -
serviceId: Theidof the service the plugin configuration will target.
See the Konnect API reference to learn about region-specific URLs and personal access tokens.
echo "
apiVersion: configuration.konghq.com/v1
kind: KongPlugin
metadata:
name: pre-function
namespace: kong
annotations:
kubernetes.io/ingress.class: kong
konghq.com/tags: ''
config:
access:
- '$ACCESS_FUNCTION'
header_filter:
- '$HEADER_FILTER_FUNCTION'
plugin: pre-function
" | kubectl apply -f -
Next, apply the KongPlugin resource by annotating the service resource:
kubectl annotate -n kong service SERVICE_NAME konghq.com/plugins=pre-function
Prerequisite: Configure your Personal Access Token
terraform {
required_providers {
konnect = {
source = "kong/konnect"
}
}
}
provider "konnect" {
personal_access_token = "$KONNECT_TOKEN"
server_url = "https://us.api.konghq.com/"
}
Add the following to your Terraform configuration to create a Konnect Gateway Plugin:
resource "konnect_gateway_plugin_pre_function" "my_pre_function" {
enabled = true
config = {
access = [var.access_function]
header_filter = [var.header_filter_function]
}
tags = []
control_plane_id = konnect_gateway_control_plane.my_konnect_cp.id
service = {
id = konnect_gateway_service.my_service.id
}
}
This example requires the following variables to be added to your manifest. You can specify values at runtime by setting TF_VAR_name=value.
variable "header_filter_function" {
type = string
}
Add this section to your kong.yaml configuration file:
_format_version: "3.0"
plugins:
- name: pre-function
route: routeName|Id
config:
access:
- ${{ env "DECK_ACCESS_FUNCTION" }}
header_filter:
- ${{ env "DECK_HEADER_FILTER_FUNCTION" }}
Make sure to replace the following placeholders with your own values:
-
routeName|Id: Theidornameof the route the plugin configuration will target.
Make the following request:
curl -i -X POST http://localhost:8001/routes/{routeName|Id}/plugins/ \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
--data '
{
"name": "pre-function",
"config": {
"access": [
"'$ACCESS_FUNCTION'"
],
"header_filter": [
"'$HEADER_FILTER_FUNCTION'"
]
},
"tags": []
}
'
Make sure to replace the following placeholders with your own values:
-
routeName|Id: Theidornameof the route the plugin configuration will target.
Make the following request:
curl -X POST https://{region}.api.konghq.com/v2/control-planes/{controlPlaneId}/core-entities/routes/{routeId}/plugins/ \
--header "accept: application/json" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer $KONNECT_TOKEN" \
--data '
{
"name": "pre-function",
"config": {
"access": [
"'$ACCESS_FUNCTION'"
],
"header_filter": [
"'$HEADER_FILTER_FUNCTION'"
]
},
"tags": []
}
'
Make sure to replace the following placeholders with your own values:
-
region: Geographic region where your Kong Konnect is hosted and operates. -
KONNECT_TOKEN: Your Personal Access Token (PAT) associated with your Konnect account. -
controlPlaneId: Theidof the control plane. -
routeId: Theidof the route the plugin configuration will target.
See the Konnect API reference to learn about region-specific URLs and personal access tokens.
echo "
apiVersion: configuration.konghq.com/v1
kind: KongPlugin
metadata:
name: pre-function
namespace: kong
annotations:
kubernetes.io/ingress.class: kong
konghq.com/tags: ''
config:
access:
- '$ACCESS_FUNCTION'
header_filter:
- '$HEADER_FILTER_FUNCTION'
plugin: pre-function
" | kubectl apply -f -
Next, apply the KongPlugin resource by annotating the httproute or ingress resource:
kubectl annotate -n kong httproute konghq.com/plugins=pre-function
kubectl annotate -n kong ingress konghq.com/plugins=pre-function
Prerequisite: Configure your Personal Access Token
terraform {
required_providers {
konnect = {
source = "kong/konnect"
}
}
}
provider "konnect" {
personal_access_token = "$KONNECT_TOKEN"
server_url = "https://us.api.konghq.com/"
}
Add the following to your Terraform configuration to create a Konnect Gateway Plugin:
resource "konnect_gateway_plugin_pre_function" "my_pre_function" {
enabled = true
config = {
access = [var.access_function]
header_filter = [var.header_filter_function]
}
tags = []
control_plane_id = konnect_gateway_control_plane.my_konnect_cp.id
route = {
id = konnect_gateway_route.my_route.id
}
}
This example requires the following variables to be added to your manifest. You can specify values at runtime by setting TF_VAR_name=value.
variable "header_filter_function" {
type = string
}