Files
2026-07-13 12:32:21 +08:00

151 lines
6.4 KiB
Lua

local typedefs = require "kong.db.schema.typedefs"
return {
name = "aws-lambda",
fields = {
{ protocols = typedefs.protocols_http },
{ config = {
type = "record",
fields = {
{ timeout = {
type = "number",
required = true,
default = 60000,
description = "An optional timeout in milliseconds when invoking the function.",
} },
{ keepalive = {
type = "number",
required = true,
default = 60000,
description = "An optional value in milliseconds that defines how long an idle connection lives before being closed.",
} },
{ aws_key = {
type = "string",
encrypted = true, -- Kong Enterprise-exclusive feature, does nothing in Kong CE
referenceable = true,
description = "The AWS key credential to be used when invoking the function.",
} },
{ aws_secret = {
type = "string",
encrypted = true, -- Kong Enterprise-exclusive feature, does nothing in Kong CE
referenceable = true,
description = "The AWS secret credential to be used when invoking the function. ",
} },
{ aws_assume_role_arn = { description = "The target AWS IAM role ARN used to invoke the Lambda function.", type = "string",
encrypted = true, -- Kong Enterprise-exclusive feature, does nothing in Kong CE
referenceable = true,
} },
{ aws_role_session_name = { description = "The identifier of the assumed role session.", type = "string",
default = "kong"
} },
{ aws_sts_endpoint_url = typedefs.url },
{ aws_region = typedefs.host },
{ function_name = {
type = "string",
required = false,
description = "The AWS Lambda function to invoke. Both function name and function ARN (including partial) are supported."
} },
{ qualifier = {
type = "string",
description = "The qualifier to use when invoking the function."
} },
{ invocation_type = {
description = "The InvocationType to use when invoking the function. Available types are RequestResponse, Event, DryRun.",
type = "string",
required = true,
default = "RequestResponse",
one_of = { "RequestResponse", "Event", "DryRun" }
} },
{ log_type = {
description = "The LogType to use when invoking the function. By default, None and Tail are supported.",
type = "string",
required = true,
default = "Tail",
one_of = { "Tail", "None" }
} },
{ host = typedefs.host },
{ port = typedefs.port { default = 443 }, },
{ disable_https = { type = "boolean", default = false }, },
{ unhandled_status = {
description = "The response status code to use (instead of the default 200, 202, or 204) in the case of an Unhandled Function Error.",
type = "integer",
between = { 100, 999 },
} },
{ forward_request_method = {
description = "An optional value that defines whether the original HTTP request method verb is sent in the request_method field of the JSON-encoded request.",
type = "boolean",
default = false,
} },
{ forward_request_uri = {
description = "An optional value that defines whether the original HTTP request URI is sent in the request_uri field of the JSON-encoded request.",
type = "boolean",
default = false,
} },
{ forward_request_headers = {
description = "An optional value that defines whether the original HTTP request headers are sent as a map in the request_headers field of the JSON-encoded request.",
type = "boolean",
default = false,
} },
{ forward_request_body = {
description = "An optional value that defines whether the request body is sent in the request_body field of the JSON-encoded request. If the body arguments can be parsed, they are sent in the separate request_body_args field of the request. ",
type = "boolean",
default = false,
} },
{ is_proxy_integration = {
description = "An optional value that defines whether the response format to receive from the Lambda to this format.",
type = "boolean",
default = false,
} },
{ awsgateway_compatible = {
description = "An optional value that defines whether the plugin should wrap requests into the Amazon API gateway.",
type = "boolean",
default = false,
} },
{ proxy_url = typedefs.url },
{ skip_large_bodies = {
description = "An optional value that defines whether Kong should send large bodies that are buffered to disk",
type = "boolean",
default = true,
} },
{ base64_encode_body = {
description = "An optional value that Base64-encodes the request body.", type = "boolean",
default = true,
} },
{ aws_imds_protocol_version = {
description = "Identifier to select the IMDS protocol version to use: `v1` or `v2`.", type = "string",
required = true,
default = "v1",
one_of = { "v1", "v2" }
} },
{ empty_arrays_mode = { -- TODO: this config field is added for backward compatibility and will be removed in next major version
description = "An optional value that defines whether Kong should send empty arrays (returned by Lambda function) as `[]` arrays or `{}` objects in JSON responses. The value `legacy` means Kong will send empty arrays as `{}` objects in response",
type = "string",
required = true,
default = "legacy",
one_of = { "legacy", "correct" }
} },
}
},
} },
entity_checks = {
{ mutually_required = { "config.aws_key", "config.aws_secret" } },
{ custom_entity_check = {
field_sources = { "config.proxy_url" },
fn = function(entity)
local proxy_url = entity.config and entity.config.proxy_url
if type(proxy_url) == "string" then
local scheme = proxy_url:match("^([^:]+)://")
if scheme and scheme ~= "http" then
return nil, "proxy_url scheme must be http"
end
end
return true
end,
}
},
}
}