| title | Serverless Functions (serverless) | ||||
|---|---|---|---|---|---|
| keywords |
|
||||
| description | The serverless plugins, `serverless-pre-function` and `serverless-post-function`, allow you to dynamically run Lua functions at specified phases in APISIX. |
There are two serverless Plugins in APISIX: serverless-pre-function and serverless-post-function. The former runs at the beginning of the specified phase, while the latter runs at the end of the specified phase.
Both Plugins have the same attributes.
| Name | Type | Required | Default | Valid values | Description |
|---|---|---|---|---|---|
| phase | string | False | "access" | ["rewrite", "access", "header_filter", "body_filter", "log", "before_proxy"] | Phase before or after which the serverless function is executed. |
| functions | array[string] | True | List of functions that are executed sequentially. |
:::note
Only Lua functions are allowed here and not other Lua code.
For example, anonymous functions are legal:
return function()
ngx.log(ngx.ERR, 'one')
endClosures are also legal:
local count = 1
return function()
count = count + 1
ngx.say(count)
endBut code other than functions are illegal:
local count = 1
ngx.say(count)From v2.6, conf and ctx are passed as the first two arguments to a serverless function like regular Plugins.
Prior to v2.12.0, the phase before_proxy was called balancer. This was updated considering that this method would run after access and before the request goes Upstream and is unrelated to balancer.
:::
:::note
You can fetch the admin_key from config.yaml and save to an environment variable with the following command:
admin_key=$(yq '.deployment.admin.admin_key[0].key' conf/config.yaml | sed 's/"//g'):::
The following example enables serverless-pre-function and serverless-post-function Plugins on a Route:
curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT \
-H "X-API-KEY: ${admin_key}" \
-d '{
"id": "serverless-route",
"uri": "/index.html",
"plugins": {
"serverless-pre-function": {
"phase": "rewrite",
"functions": ["return function() ngx.log(ngx.ERR, \"serverless pre function\"); end"]
},
"serverless-post-function": {
"phase": "rewrite",
"functions": ["return function(conf, ctx) ngx.log(ngx.ERR, \"match uri \", ctx.curr_req_matched and ctx.curr_req_matched._path); end"]
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"127.0.0.1:1980": 1
}
}
}'Send a request to the Route:
curl -i "http://127.0.0.1:9080/index.html"You will find messages serverless pre function and match uri /index.html in the error log.