跳到主要内容

aws-lambda

aws-lambda 插件将请求转发到 AWS Lambda 函数 URL 和 Amazon API Gateway 端点。它可以使用 IAM 访问密钥,通过 AWS Signature Version 4(SigV4) 对请求签名,也可以在请求中添加 API Gateway API Key。

API Gateway API Key 用于标识用量计划和配额中的调用方;AWS 不建议将其用于身份认证或授权。如果 API 需要访问控制,请使用 IAM 授权、用于请求授权的 AWS Lambda 函数或 Amazon Cognito 用户池。

在 API7 企业版 3.9.20、3.10.7 和 APISIX 3.19.0 中,HTTP 状态码为 400 或更高的上游响应会按警告级别记录。网关错误日志中会包含响应体;如果 AWS 端点会返回敏感错误详情,请审查日志访问权限和保留策略。

示例​

以下示例演示如何调用受 IAM 保护的 Lambda 函数 URL、转发 API Gateway API Key,以及代理到 API Gateway 时保留子路径。

开始前,创建一个返回 Hello from Lambda! 的 Lambda 函数。

使用 IAM 授权调用 Lambda 函数 URL​

此示例使用 SigV4 对网关请求签名,再将请求转发到授权类型为 AWS_IAM 的 Lambda 函数 URL。

打开 Lambda 函数,选择 Configuration → Function URL,创建函数 URL,并将 Auth type 设置为 AWS_IAM。记下函数 URL、函数 ARN 和 AWS 区域。

插件配置的访问密钥所属 IAM 主体需要同时拥有 lambda:InvokeFunctionUrl 和 lambda:InvokeFunction 权限。对于同一账号中的 IAM 用户,请附加为该函数 ARN 授予这两项操作的身份策略。以下策略还将 lambda:InvokeFunction 限制为仅可通过函数 URL 发起的请求:

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "InvokeFunctionUrl",
"Effect": "Allow",
"Action": "lambda:InvokeFunctionUrl",
"Resource": "arn:aws:lambda:us-west-2:123456789012:function:apisix-docs-function",
"Condition": {
"StringEquals": {
"lambda:FunctionUrlAuthType": "AWS_IAM"
}
}
},
{
"Sid": "InvokeFunctionThroughUrl",
"Effect": "Allow",
"Action": "lambda:InvokeFunction",
"Resource": "arn:aws:lambda:us-west-2:123456789012:function:apisix-docs-function",
"Condition": {
"Bool": {
"lambda:InvokedViaFunctionUrl": "true"
}
}
}
]
}

将示例 ARN 替换为实际函数的 ARN。跨账号调用还需要在函数的基于资源的策略中授予相应权限。

插件接受访问密钥 ID 和秘密访问密钥,但不接受会话令牌。请为该集成创建专用的最小权限 IAM 用户,定期轮换访问密钥,不要使用根用户凭证。

在 IAM 中打开此专用用户,进入 Security credentials 页签,选择 Create access key,并选择 Application running outside AWS 用例。

完成凭证创建后,复制访问密钥 ID 和秘密访问密钥。AWS 只会显示一次秘密访问密钥。

网关可能会为传入请求添加 X-Forwarded-Host、X-Forwarded-Port 和 X-Forwarded-Proto 请求头。请在 aws-lambda 为请求签名前移除这些请求头,否则 AWS 可能拒绝签名。

使用函数 URL 和 IAM 凭证创建路由:

curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d '{
"id": "aws-lambda-route",
"uri": "/aws-lambda",
"plugins": {
"proxy-rewrite": {
"headers": {
"remove": [
"X-Forwarded-Host",
"X-Forwarded-Port",
"X-Forwarded-Proto"
]
}
},
"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"
}
}
}
}
}'

❶ 替换为你的 Lambda 函数 URL

❷ 替换为你的 IAM 访问密钥

❸ 替换为你的 IAM 秘密访问密钥

❹ 替换为你的 Lambda 函数所在的 AWS 区域

❺ 与 Lambda 函数集成时设置为 lambda

ADC 和 Gateway API 配置中包含常规备用后端。aws-lambda 处理请求时,网关不会联系该后端;请验证 Lambda 响应,不要将备用后端的响应当成插件已运行的证据。

发送请求到路由:

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

你应该收到 HTTP/1.1 200 OK 响应,并包含以下消息:

"Hello from Lambda!"

向 API Gateway 发送 API Key​

此示例将 API Key 放在 X-API-Key 请求头中,转发到调用 Lambda 函数的 API Gateway REST API。API Gateway 使用此 Key 标识调用方并应用用量计划;该 Key 不是身份认证或授权机制。

要将 API 网关配置为 Lambda 触发器,请转到你的 Lambda 函数并选择 Add trigger:

选择 API Gateway 作为触发器,REST API 作为 API 类型。API Key 适用于 REST API,不适用于 HTTP API。完成触发器配置:

AWS Lambda 的 Add trigger 面板,已选择 API Gateway 和 REST API

在 API Gateway 控制台中,将方法配置为要求 API Key,并将 API 部署到某个阶段。创建用量计划,将已部署的阶段关联到该计划,并创建或关联 API Key。记下 API Key 的值和调用 URL。

使用 API Gateway 调用 URL 和 API Key 创建路由:

curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d '{
"id": "aws-lambda-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"
}
}
}
}'

发送请求到路由:

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 子路径​

此示例将网关路由匹配的路径后缀转发到 API Gateway 阶段下的资源。它沿用上一示例中的 REST API、用量计划和 API Key。

继续前,请完成向 API Gateway 发送 API Key中的设置。

打开 Lambda 函数,选择 Configuration → Triggers,并打开 API Gateway 触发器:

选择 Create resource 以创建子路径:

AWS API Gateway Resources 页面,并突出显示 Create resource 按钮

输入资源详情并创建资源:

完成资源创建

选择新资源,然后选择 Create method:

AWS API Gateway Resources 页面显示 /api7-docs 资源,并突出显示 Create method 按钮

选择 HTTP 方法以及上一示例使用的 Lambda 函数。创建方法后,打开 Method request,选择 Edit,启用 API key required,然后保存。

选择 Deploy API,将资源和方法的变更部署到用量计划关联的阶段:

使用 API Gateway 阶段 URL 和 API Key 创建路由:

curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d '{
"id": "aws-lambda-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"
}
}
}
}'

❶ 匹配 /aws-lambda/ 的所有子路径

❷ 对于 Admin API、ADC 和 APISIX CRD 示例,通配符 * 匹配的子路径将追加到 function_uri 末尾。在 Gateway API 示例中,PathPrefix 匹配 /aws-lambda/ 下的请求,因此转发的请求路径会接在已配置的 function_uri 前缀之后。

发送请求到路由:

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

网关会将请求转发到 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 响应。