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 凭证创建路由:
- Admin API
- ADC
- Ingress Controller
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"
}
}
}
}
}'
services:
- name: aws-lambda-service
labels:
docs-example: aws-lambda
routes:
- name: aws-lambda-route
uris:
- /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
upstream:
type: roundrobin
nodes:
- host: httpbin.org
port: 80
weight: 1
预览此示例管理的资源变更,确认差异不包含意外的更新或删除:
adc diff -f adc.yaml \
--include-resource-type service \
--label-selector docs-example=aws-lambda
同步已审查的服务配置:
adc sync -f adc.yaml \
--include-resource-type service \
--label-selector docs-example=aws-lambda
- Gateway API
- APISIX CRD
apiVersion: v1
kind: Service
metadata:
name: httpbin-external-domain
namespace: aic
spec:
type: ExternalName
externalName: httpbin.org
ports:
- name: http
port: 80
protocol: TCP
---
apiVersion: apisix.apache.org/v1alpha1
kind: PluginConfig
metadata:
namespace: aic
name: aws-lambda-plugin-config
spec:
plugins:
- name: proxy-rewrite
config:
headers:
remove:
- X-Forwarded-Host
- X-Forwarded-Port
- X-Forwarded-Proto
- name: aws-lambda
config:
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
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
namespace: aic
name: aws-lambda-route
spec:
parentRefs:
- name: apisix
rules:
- matches:
- path:
type: Exact
value: /aws-lambda
filters:
- type: ExtensionRef
extensionRef:
group: apisix.apache.org
kind: PluginConfig
name: aws-lambda-plugin-config
backendRefs:
- name: httpbin-external-domain
port: 80
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
namespace: aic
name: aws-lambda-route
spec:
ingressClassName: apisix
http:
- name: aws-lambda-route
match:
paths:
- /aws-lambda
plugins:
- name: proxy-rewrite
enable: true
config:
headers:
remove:
- X-Forwarded-Host
- X-Forwarded-Port
- X-Forwarded-Proto
- name: aws-lambda
enable: true
config:
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
应用配置:
kubectl apply -f aws-lambda-ic.yaml
❶ 替换为你的 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。完成触发器配置:

在 API Gateway 控制台中,将方 法配置为要求 API Key,并将 API 部署到某个阶段。创建用量计划,将已部署的阶段关联到该计划,并创建或关联 API Key。记下 API Key 的值和调用 URL。
使用 API Gateway 调用 URL 和 API Key 创建路由:
- Admin API
- ADC
- Ingress Controller
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"
}
}
}
}'
services:
- name: aws-lambda-service
labels:
docs-example: aws-lambda
routes:
- name: aws-lambda-route
uris:
- /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
upstream:
type: roundrobin
nodes:
- host: httpbin.org
port: 80
weight: 1
预览此示例管理的资源变更,确认差异不包含意外的更新或删除:
adc diff -f adc.yaml \
--include-resource-type service \
--label-selector docs-example=aws-lambda
同步已审查的服务配置:
adc sync -f adc.yaml \
--include-resource-type service \
--label-selector docs-example=aws-lambda
- Gateway API
- APISIX CRD
apiVersion: v1
kind: Service
metadata:
name: httpbin-external-domain
namespace: aic
spec:
type: ExternalName
externalName: httpbin.org
ports:
- name: http
port: 80
protocol: TCP
---
apiVersion: apisix.apache.org/v1alpha1
kind: PluginConfig
metadata:
namespace: aic
name: aws-lambda-plugin-config
spec:
plugins:
- name: aws-lambda
config:
function_uri: https://your-api-id.execute-api.us-west-2.amazonaws.com/default/your-resource
authorization:
apikey: YOUR_API_GATEWAY_API_KEY
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
namespace: aic
name: aws-lambda-route
spec:
parentRefs:
- name: apisix
rules:
- matches:
- path:
type: Exact
value: /aws-lambda
filters:
- type: ExtensionRef
extensionRef:
group: apisix.apache.org
kind: PluginConfig
name: aws-lambda-plugin-config
backendRefs:
- name: httpbin-external-domain
port: 80
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
namespace: aic
name: aws-lambda-route
spec:
ingressClassName: apisix
http:
- name: aws-lambda-route
match:
paths:
- /aws-lambda
plugins:
- name: aws-lambda
enable: true
config:
function_uri: https://your-api-id.execute-api.us-west-2.amazonaws.com/default/your-resource
authorization:
apikey: YOUR_API_GATEWAY_API_KEY
应用配置:
kubectl apply -f aws-lambda-ic.yaml
发送请求到路由:
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 以创建子路径:

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

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

选择 HTTP 方法以及上一示例使用的 Lambda 函数。创建方法后,打开 Method request,选择 Edit,启用 API key required,然后保存。
选择 Deploy API,将资源和方法的变更部署到用量计划关联的阶段:
使用 API Gateway 阶段 URL 和 API Key 创建路由:
- Admin API
- ADC
- Ingress Controller
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"
}
}
}
}'
services:
- name: aws-lambda-service
labels:
docs-example: aws-lambda
routes:
- name: aws-lambda-route
uris:
- /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
upstream:
type: roundrobin
nodes:
- host: httpbin.org
port: 80
weight: 1
预览此示例管理的资源变更,确认差异不包含意外的更新或删除:
adc diff -f adc.yaml \
--include-resource-type service \
--label-selector docs-example=aws-lambda
同步已审查的服务配置:
adc sync -f adc.yaml \
--include-resource-type service \
--label-selector docs-example=aws-lambda
- Gateway API
- APISIX CRD
apiVersion: v1
kind: Service
metadata:
name: httpbin-external-domain
namespace: aic
spec:
type: ExternalName
externalName: httpbin.org
ports:
- name: http
port: 80
protocol: TCP
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
namespace: aic
name: aws-lambda-route
spec:
parentRefs:
- name: apisix
rules:
- matches:
- path:
type: PathPrefix
value: /aws-lambda/
filters:
- type: ExtensionRef
extensionRef:
group: apisix.apache.org
kind: PluginConfig
name: aws-lambda-plugin-config
backendRefs:
- name: httpbin-external-domain
port: 80
---
apiVersion: apisix.apache.org/v1alpha1
kind: PluginConfig
metadata:
namespace: aic
name: aws-lambda-plugin-config
spec:
plugins:
- name: aws-lambda
config:
function_uri: https://your-api-id.execute-api.us-west-2.amazonaws.com/default
authorization:
apikey: YOUR_API_GATEWAY_API_KEY
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
namespace: aic
name: aws-lambda-route
spec:
ingressClassName: apisix
http:
- name: aws-lambda-route
match:
paths:
- /aws-lambda/*
plugins:
- name: aws-lambda
enable: true
config:
function_uri: https://your-api-id.execute-api.us-west-2.amazonaws.com/default
authorization:
apikey: YOUR_API_GATEWAY_API_KEY
应用配置:
kubectl apply -f aws-lambda-ic.yaml
❶ 匹配 /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 响应。