Pass Lua code as files and run in multiple phasev1.0+
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.
- 
    controlPlaneId: Theidof the control plane.
- 
    KONNECT_TOKEN: Your Personal Access Token (PAT) associated with your Konnect account.
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.
- 
    controlPlaneId: Theidof the control plane.
- 
    KONNECT_TOKEN: Your Personal Access Token (PAT) associated with your Konnect account.
- 
    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.
- 
    controlPlaneId: Theidof the control plane.
- 
    KONNECT_TOKEN: Your Personal Access Token (PAT) associated with your Konnect account.
- 
    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
}
