このページは、まだ日本語ではご利用いただけません。翻訳中です。
Datakit examples
この機能はtech preview(アルファ品質)としてリリースされており、本番環境では依存すべきではありません。
Example configuration by use case.
Authenticating Kong to a third party service
plugins:
- name: datakit
service: my-service
config:
debug: true
nodes:
- name: BUILD_AUTH_HEADERS
jq: |
{
"Authorization": "Basic YGA8NNu8877lkOmNsagsdWAyZXQ=",
}
type: jq
- name: BUILD_AUTH_BODY
type: handlebars
template: |
grant_type=client_credentials
- name: AUTH_CALL
type: call
inputs:
- headers: BUILD_AUTH_HEADERS
- body: BUILD_AUTH_BODY
url: http://auth-server:5000/token
method: post
- name: BUILD_UPSTREAM_AUTH_HEADERS
type: jq
inputs:
- auth: AUTH_CALL
output:
service_request.headers
jq: |
{
"Authorization":$auth.token_type + " " + $auth.access_token
}
Manipulate request headers
plugins:
- name: datakit
service: my-service
config:
debug: true
nodes:
- name: MY_HEADERS
type: jq
inputs:
- req: request.headers
jq: |
{
"X-My-Call-Header": $req.apikey // "default value"
}
- name: CALL
type: call
inputs:
- headers: MY_HEADERS
url: https://httpbin.konghq.com/anything
- name: EXIT
type: exit
inputs:
- body: CALL.body
status: 200
Combine two APIs into one response
plugins:
- name: datakit
service: my-service
config:
debug: true
nodes:
- name: CAT_FACT
type: call
url: https://catfact.ninja/fact
- name: DOG_FACT
type: call
url: https://dogapi.dog/api/v1/facts
- name: JOIN
type: jq
inputs:
- cat: CAT_FACT.body
- dog: DOG_FACT.body
jq: |
{
"cat_fact": $cat.fact,
"dog_fact": $dog.facts[0]
}
- name: EXIT
type: exit
inputs:
- body: JOIN
status: 200
Pass API response data into templates using handlebars
services:
- name: demo
url: http://httpbin.konghq.com
routes:
- name: my-route
paths:
- /anything
strip_path: false
methods:
- GET
- POST
plugins:
- name: datakit
config:
debug: true
nodes:
- name: FIRST
type: call
url: https://api.zippopotam.us/br/93000-000
- name: MY_HEADERS
type: jq
inputs:
- first: FIRST.body
output: service_request.headers
jq: |
{
"X-Hello": "World",
"X-Foo": "Bar",
"X-Country": $first.country
}
- name: MY_BODY
type: handlebars
content_type: text/plain
inputs:
- first: FIRST.body
output: service_request.body
template: |
Coordinates for {{ first.places.0.[place name] }}, {{ first.places.0.state }}, {{ first.country }} are ({{ first.places.0.latitude }}, {{ first.places.0.longitude }}).
Adjust Kong service and route properties
services:
- name: demo
url: http://httpbin.konghq.com
routes:
- name: my-route
paths:
- /anything
strip_path: false
methods:
- GET
- POST
plugins:
- name: post-function
config:
access:
- |
local cjson = require("cjson")
kong.ctx.shared.from_lua = cjson.encode({
nested = {
message = "hello from lua land!",
},
})
header_filter:
- |
local cjson = require("cjson")
local ctx = kong.ctx.shared
local api_response = ctx.api_response or "null"
local res = cjson.decode(api_response)
kong.response.set_header("X-Lua-Encoded-Object", api_response)
kong.response.set_header("X-Lua-Plugin-Country", res.country)
kong.response.set_header("X-Lua-Plugin-My-String", ctx.my_string)
kong.response.set_header("X-Lua-Plugin-My-Encoded-String", ctx.my_encoded_string)
- name: datakit
config:
debug: true
nodes:
#
# read "built-in" kong properties
#
- name: ROUTE_ID
type: property
property: kong.route_id
- name: SERVICE
type: property
property: kong.router.service
content_type: application/json
#
# access values from ctx
#
- name: LUA_VALUE_ENCODED
type: property
property: kong.ctx.shared.from_lua
- name: LUA_VALUE_DECODED
type: property
property: kong.ctx.shared.from_lua
content_type: application/json
#
# make an external API call and stash the result in kong.ctx.shared
#
- name: API
type: call
url: https://api.zippopotam.us/br/93000-000
- name: SET_API_RESPONSE
type: property
property: kong.ctx.shared.api_response
input: API.body
#
# fetch a property that we know does not exist
#
- name: UNSET_PROP
type: property
# should return `null`
property: kong.ctx.shared.nothing_here
#
# emit a JSON-encoded string from jq and store it in kong.ctx.shared
#
- name: JSON_ENCODED_STRING
type: jq
jq: '"my string"'
# encode as `my string`
- name: SET_MY_STRING_PLAIN
type: property
input: JSON_ENCODED_STRING
property: kong.ctx.shared.my_string
# [JSON-]encode as `"my string"`
- name: SET_MY_STRING_ENCODED
type: property
input: JSON_ENCODED_STRING
property: kong.ctx.shared.my_encoded_string
content_type: application/json
# get `my string`, return `my string`
- name: GET_PLAIN_STRING
type: property
property: kong.ctx.shared.my_string
# get `"my string"`, return `"my string"`
- name: GET_JSON_STRING_ENCODED
type: property
property: kong.ctx.shared.my_encoded_string
# get `"my string"`, decode, return `my string`
- name: GET_JSON_STRING_DECODED
type: property
property: kong.ctx.shared.my_encoded_string
content_type: application/json
#
# assemble a response
#
- name: BODY
type: jq
inputs:
# value is also fetched after being set
API_body: API.body
SERVICE: SERVICE
ROUTE_ID: ROUTE_ID
LUA_VALUE_ENCODED: LUA_VALUE_ENCODED
LUA_VALUE_DECODED: LUA_VALUE_DECODED
UNSET_PROP: UNSET_PROP
GET_PLAIN_STRING: GET_PLAIN_STRING
GET_JSON_STRING_ENCODED: GET_JSON_STRING_ENCODED
GET_JSON_STRING_DECODED: GET_JSON_STRING_DECODED
jq: |
{
"API.body": $API_body,
SERVICE: $SERVICE,
ROUTE_ID: $ROUTE_ID,
LUA_VALUE_ENCODED: $LUA_VALUE_ENCODED,
LUA_VALUE_DECODED: $LUA_VALUE_DECODED,
UNSET_PROP: $UNSET_PROP,
GET_PLAIN_STRING: $GET_PLAIN_STRING,
GET_JSON_STRING_ENCODED: $GET_JSON_STRING_ENCODED,
GET_JSON_STRING_DECODED: $GET_JSON_STRING_DECODED,
}
- name: exit
type: exit
inputs:
body: BODY