Skip to main content
Version: 3.17

aws-lambda

描述#

aws-lambda 插件简化了 APISIX 与 AWS LambdaAmazon API Gateway 的集成,用于代理至其他 AWS 服务。

该插件支持通过 IAM 用户凭证和 API Gateway 的 API 密钥进行 AWS 身份验证和授权。

属性#

名称类型必选项默认值有效值描述
function_uristring触发 Lambda 函数的 AWS Lambda 函数 URL 或 Amazon API Gateway 端点。
authorizationobject在 AWS 上调用 Lambda 函数时用于身份验证和授权的凭证。
authorization.apikeystring选择 API 密钥作为安全机制时,REST API Gateway 的 API 密钥。
authorization.iamobject使用 AWS Signature Version 4 进行身份验证和授权的 IAM 凭证。
authorization.iam.accesskeystringIAM 用户访问密钥。当配置 authorization.iam 时必填。
authorization.iam.secretkeystringIAM 用户秘密访问密钥。当配置 authorization.iam 时必填。
authorization.iam.aws_regionstring"us-east-1"发送请求的 AWS 区域。
authorization.iam.servicestring"execute-api"接收请求的服务。与 AWS API Gateway 集成时设置为 execute-api,直接与 Lambda 函数集成时设置为 lambda
timeoutinteger3000[100,...]代理请求超时时间,单位为毫秒。
ssl_verifybooleantrue若为 true,执行 SSL 验证。
keepalivebooleantrue若为 true,保持连接以便复用。
keepalive_poolinteger5[1,...]保活连接池中的最大连接数。
keepalive_timeoutinteger60000[1000,...]连接空闲时保持活跃的时间,单位为毫秒。

示例#

以下示例演示如何针对不同场景配置 aws-lambda 插件。

在操作前,请先登录 AWS 控制台并创建一个 Lambda 函数 (使用任意运行时即可)。默认情况下,该函数被调用后应返回 Hello from Lambda!

note

你可以这样从 config.yaml 中获取 admin_key 并存入环境变量:

admin_key=$(yq '.deployment.admin.admin_key[0].key' conf/config.yaml | sed 's/"//g')

使用 IAM 访问密钥安全调用 Lambda 函数#

以下示例演示如何将 APISIX 与 Lambda 函数集成,并使用 IAM 访问密钥进行授权。aws-lambda 插件实现了 AWS Signature Version 4 签名。

对于 IAM 访问密钥,请前往 AWS Identity and Access Management (IAM) 并选择要用于集成的用户。

安全凭证 标签页中,选择 创建访问密钥:

选择 在 AWS 外部运行的应用程序 作为使用场景:

继续创建凭证,并记录访问密钥和秘密访问密钥:

要创建 Lambda 函数 URL,请前往 Lambda 函数的 配置 标签页,在 函数 URL 下创建函数 URL:

最后,在 APISIX 中使用函数 URL 和 IAM 访问密钥创建路由:

curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT \
-H "X-API-KEY: ${admin_key}" \
-d '{
"id": "aws-lambda-iam-route",
"uri": "/aws-lambda",
"plugins": {
"aws-lambda": {
"function_uri": "https://your-lambda-function-url.lambda-url.us-west-2.on.aws/",
"authorization": {
"iam": {
"accesskey": "YOUR_IAM_ACCESS_KEY",
"secretkey": "YOUR_IAM_SECRET_KEY",
"aws_region": "us-west-2",
"service": "lambda"
}
},
"ssl_verify": false
}
}
}'

向路由发送请求:

curl -i "http://127.0.0.1:9080/aws-lambda"

你应该收到 HTTP/1.1 200 OK 响应,内容如下:

"Hello from Lambda!"

通过 API 密钥与 Amazon API Gateway 安全集成#

以下示例演示如何将 APISIX 与 Amazon API Gateway 集成,并配置网关触发 Lambda 函数的执行。

要将 API Gateway 配置为 Lambda 触发器,请前往 Lambda 函数并选择 添加触发器:

选择 API Gateway 作为触发器,REST API 作为 API 类型,完成触发器添加:


info

Amazon API Gateway 支持 HTTP API 和 REST API。只有 REST API 支持 API 密钥,这就是本示例使用 REST API 触发器的原因。

你将被重定向回 Lambda 界面。要查找 API 密钥和网关 API 端点,请前往 Lambda 函数的 配置 标签页,在 触发器 下查看 API Gateway 详情:

最后,在 APISIX 中使用网关端点和 API 密钥创建路由:

curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT \
-H "X-API-KEY: ${admin_key}" \
-d '{
"id": "aws-lambda-apikey-route",
"uri": "/aws-lambda",
"plugins": {
"aws-lambda": {
"function_uri": "https://your-api-id.execute-api.us-west-2.amazonaws.com/default/your-resource",
"authorization": {
"apikey": "YOUR_API_GATEWAY_API_KEY"
},
"ssl_verify": false
}
}
}'

向路由发送请求:

curl -i "http://127.0.0.1:9080/aws-lambda"

你应该收到 HTTP/1.1 200 OK 响应,内容如下:

"Hello from Lambda!"

如果 API 密钥无效,你将收到 HTTP/1.1 403 Forbidden 响应。

将请求转发到 Amazon API Gateway 子路径#

以下示例演示如何将请求转发到 Amazon API Gateway 的子路径,并配置 API 触发 Lambda 函数的执行。

请先参考上一个示例完成 API Gateway 的设置。

要创建子路径,请前往 Lambda 函数的 配置 标签页,在 触发器 下点击进入 API Gateway:

选择 创建资源 以创建子路径:

填写子路径信息并完成创建:

回到网关主控制台后,你将看到新创建的路径。选择 创建方法 为路径配置 HTTP 方法和关联的操作:

在下拉菜单中选择允许的 HTTP 方法。本示例继续使用相同的 Lambda 函数作为请求该路径时的触发操作:

完成方法创建。回到网关主控制台后,点击 部署 API 以部署路径和方法变更:

最后,在 APISIX 中使用网关端点和 API 密钥创建路由:

curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT \
-H "X-API-KEY: ${admin_key}" \
-d '{
"id": "aws-lambda-subpath-route",
"uri": "/aws-lambda/*",
"plugins": {
"aws-lambda": {
"function_uri": "https://your-api-id.execute-api.us-west-2.amazonaws.com/default",
"authorization": {
"apikey": "YOUR_API_GATEWAY_API_KEY"
},
"ssl_verify": false
}
}
}'

向路由发送请求:

curl -i "http://127.0.0.1:9080/aws-lambda/api7-docs"

APISIX 将把请求转发至 https://your-api-id.execute-api.us-west-2.amazonaws.com/default/api7-docs,你应该收到 HTTP/1.1 200 OK 响应,内容如下:

"Hello from Lambda!"

如果 API 密钥无效或请求路径没有关联任何方法,你将收到 HTTP/1.1 403 Forbidden 响应。