跳到主要内容

aws-lambda

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

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

示例

以下示例演示了如何在不同场景下配置 aws-lambda

要跟随示例操作,请先登录你的 AWS 控制台并使用任意运行时创建一个 Lambda 函数。你不需要自定义该函数,默认情况下,该函数在被调用时应返回 Hello from Lambda!

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

以下示例演示了如何将 APISIX 与 Lambda 函数集成,并配置 IAM 访问密钥进行授权。aws-lambda 插件实现了用于 IAM 访问密钥的 AWS Signature Version 4。首先,你将在 AWS 控制台上创建 IAM 访问密钥和 Lambda 函数 URL。

对于 IAM 访问密钥,请转到 AWS Identity and Access Management (IAM) 并点击你想要用于集成的用户。

接下来,在 Security credentials 选项卡中,选择 Create access key

create access keys

选择 Application running outside AWS 作为用例:

select use case

继续创建凭证并记下访问密钥 (access key) 和秘密访问密钥 (secret access key):

save access keys

要创建 Lambda 函数 URL,请转到 Lambda 函数的 Configuration 选项卡,在 Function URL 下创建一个函数 URL:

create function URL

最后,在 APISIX 中创建一个带有你的函数 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": {
"aws-lambda": {
// Annotate 1
"function_uri": "https://jbihqn4bfwewfrz6typjmcvjh40iuamw.lambda-url.us-west-2.on.aws/",
"authorization": {
"iam": {
// Annotate 2
"accesskey": "AKIARK7HKSJVWCOIIMW6",
// Annotate 3
"secretkey": "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",
// Annotate 4
"aws_region": "us-west-2",
// Annotate 5
"service": "lambda"
}
},
"ssl_verify": false
}
}
}'

❶ 替换为你的 Lambda 函数 URL

❷ 替换为你的 IAM 访问密钥

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

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

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

发送请求到路由:

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 网关配置为 Lambda 触发器,请转到你的 Lambda 函数并选择 Add trigger

add trigger for lambda function

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

select REST to be the API type and secure the API with API key

信息

Amazon API Gateway 支持两种类型的 RESTful API:HTTP API 和 REST API。只有 REST API 提供 API 密钥和 IAM 作为安全措施。

你现在应该被重定向回 Lambda 界面。要查找 API 密钥和网关 API 端点,请转到 Lambda 函数的 Configuration 选项卡,在 Triggers 下,你可以找到 API 网关的详细信息:

API gateway endpoint and API key

最后,在 APISIX 中创建一个带有你的网关端点和 API 密钥的路由:

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://xwbs1bjiy3.execute-api.us-west-2.amazonaws.com/default/api7-docs",
"authorization": {
"apikey": "hpr8KdMxlR37p0Sq8aIhi28cq2thilcF5wziOsvJ"
},
"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 的子路径,并配置 API 以触发 Lambda 函数的执行。

请先按照[上一个示例](#使用 API 密钥安全集成 Amazon API Gateway)设置 API 网关。

要创建子路径,请转到 Lambda 函数的 Configuration 选项卡,在 Triggers 下,点击 API 网关:

click into the API gateway

接下来,选择 Create resource 以创建子路径:

create resource

输入子路径信息并完成创建:

complete resource creation

重定向回主网关控制台后,你应该能看到新创建的路径。选择 Create method 为路径配置 HTTP 方法及关联的操作:

click on create method

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

create method and lambda function

完成方法创建。重定向回主网关控制台后,点击 Deploy API 以部署路径和方法更改:

deploy changes to API gateway

最后,在 APISIX 中创建一个带有你的网关端点和 API 密钥的路由:

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

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

❷ 通配符 * 匹配的子路径将追加到 function_uri 的末尾

发送请求到路由:

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

APISIX 将把请求转发到 https://xwbs1bjiy3.execute-api.us-west-2.amazonaws.com/default/api7-docs,你应该收到 HTTP/1.1 200 OK 响应,并包含以下消息:

"Hello from Lambda!"

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