aws-lambda

描述

aws-lambda 插件用于将 AWS Lambda 作为动态上游集成至 APISIX,从而实现将访问指定 URI 的请求代理到 AWS 云。

启用 aws-lambda 插件后,该插件会终止对已配置 URI 的请求,并代表客户端向 AWS Lambda Gateway URI 发起一个新的请求。这个新请求中携带了之前配置的授权详细信息,包括请求头、请求体和参数(以上参数都是从原始请求中传递的),然后 aws-lambda 插件会将带有响应头、状态码和响应体的响应信息返回给使用 APISIX 发起请求的客户端。

该插件支持通过 AWS API key 和 AWS IAM secrets 进行授权。

属性

名称类型必选项默认值有效值描述
function_uristring触发 lambda serverless 函数的 AWS API Gateway 端点。
authorizationobject访问云函数的授权凭证。
authorization.apikeystring生成的 API 密钥,用于授权对 AWS Gateway 端点的请求。
authorization.iamobject用于通过 AWS v4 请求签名执行的基于 AWS IAM 角色的授权。请参考 IAM 授权方案
timeoutinteger3000[100,…]代理请求超时(以毫秒为单位)。
ssl_verifybooleantruetrue/false当设置为 true 时执行 SSL 验证。
keepalivebooleantruetrue/false当设置为 true 时,保持连接的活动状态以便重复使用。
keepalive_poolinteger5[1,…]在关闭该连接之前,可以在该连接上发送的最大请求数。
keepalive_timeoutinteger60000[1000,…]当连接空闲时,保持该连接处于活动状态的时间,以毫秒为单位。

IAM 授权方案

名称类型必选项默认值描述
accesskeystring从 AWS IAM 控制台生成的访问密钥 ID。
secret_keystring从 AWS IAM 控制台生成的访问密钥。
aws_regionstring“us-east-1”发出请求的 AWS 区域。有关更多 AWS 区域代码的信息请参考 AWS 区域代码表
servicestring“execute-api”接收该请求的服务。请注意,对于 HTTP 触发器是 “execute-api”

启用插件

你可以通过以下命令在指定路由中启用该插件:

  1. curl http://127.0.0.1:9180/apisix/admin/routes/1 \
  2. -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
  3. {
  4. "plugins": {
  5. "aws-lambda": {
  6. "function_uri": "https://x9w6z07gb9.execute-api.us-east-1.amazonaws.com/default/test-apisix",
  7. "authorization": {
  8. "apikey": "<Generated API Key from aws console>",
  9. },
  10. "ssl_verify":false
  11. }
  12. },
  13. "uri": "/aws"
  14. }'

通过上述示例配置插件后,任何对 /aws URI 的请求(HTTP/1.1HTTPSHTTP2)都将调用已配置的 AWS 函数的 URI,并且会将响应信息返回给客户端。

下述命令的含义是:AWS Lambda 从请求中获取 name 参数,并返回一条 "Hello $name" 消息:

  1. curl -i -XGET localhost:9080/aws\?name=APISIX

正常返回结果:

  1. HTTP/1.1 200 OK
  2. Content-Type: application/json
  3. ...
  4. "Hello, APISIX!"

以下示例是客户端通过 HTTP/2 协议与 APISIX 进行通信。

在进行测试之前,由于该 enable_http2: true 默认是禁用状态,你可以通过在 ./conf/config.yaml 中添加 apisix.node_listen 下的 - port: 9081enable_http2: true 字段启用。示例如下

  1. apisix:
  2. node_listen: # 支持监听多个端口
  3. - 9080
  4. - port: 9081
  5. enable_http2: true # 该字段如果不设置,默认值为 `false`

使用 curl 命令测试:

  1. curl -i -XGET --http2 --http2-prior-knowledge localhost:9081/aws\?name=APISIX

正常返回结果:

  1. HTTP/2 200
  2. content-type: application/json
  3. ...
  4. "Hello, APISIX!"

与上面的示例类似,AWS Lambda 函数也可以通过 AWS API Gateway 触发,但需要使用 AWS IAM 权限进行授权。aws-lambda 插件的配置文件中包含了 "authorization" 字段,用户可以在 HTTP 调用中通过 AWS v4 请求签名。

以下示例展示了如何通过配置文件实现授权:

  1. curl http://127.0.0.1:9180/apisix/admin/routes/1 \
  2. -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
  3. {
  4. "plugins": {
  5. "aws-lambda": {
  6. "function_uri": "https://ajycz5e0v9.execute-api.us-east-1.amazonaws.com/default/test-apisix",
  7. "authorization": {
  8. "iam": {
  9. "accesskey": "<access key>",
  10. "secretkey": "<access key secret>"
  11. }
  12. },
  13. "ssl_verify": false
  14. }
  15. },
  16. "uri": "/aws"
  17. }'
aws-lambda - 图1注意

使用该方法时已经假设你有一个启用了程序化访问的 IAM 用户,并具有访问端点的必要权限(AmazonAPIGatewayInvokeFullAccess)。

配置路径转发

aws-lambda 插件在代理请求到 AWS 上游时也支持 URL 路径转发。基本请求路径的扩展被附加到插件配置中指定的 function_uri 字段上。

aws-lambda - 图2重要

因为 APISIX 路由是严格匹配的,所以为了使 aws-lambda 插件正常工作,在路由上配置的 uri 字段必须以 * 结尾,* 意味着这个 URI 的任何子路径都会被匹配到同一个路由。

以下示例展示了如何通过配置文件实现路径转发:

  1. curl http://127.0.0.1:9180/apisix/admin/routes/1 \
  2. -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
  3. {
  4. "plugins": {
  5. "aws-lambda": {
  6. "function_uri": "https://x9w6z07gb9.execute-api.us-east-1.amazonaws.com",
  7. "authorization": {
  8. "apikey": "<Generate API key>"
  9. },
  10. "ssl_verify":false
  11. }
  12. },
  13. "uri": "/aws/*"
  14. }'

通过上述示例配置插件后,任何访问 aws/default/test-apisix 的请求都会调用 AWS Lambda 函数,并转发附加的参数。

使用 curl 命令测试:

  1. curl -i -XGET http://127.0.0.1:9080/aws/default/test-apisix\?name\=APISIX

正常返回结果:

  1. HTTP/1.1 200 OK
  2. Content-Type: application/json
  3. ...
  4. "Hello, APISIX!"

删除插件

当你需要删除该插件时,可以通过如下命令删除相应的 JSON 配置,APISIX 将会自动重新加载相关配置,无需重启服务:

  1. curl http://127.0.0.1:9180/apisix/admin/routes/1 \
  2. -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
  3. {
  4. "uri": "/aws",
  5. "plugins": {},
  6. "upstream": {
  7. "type": "roundrobin",
  8. "nodes": {
  9. "127.0.0.1:1980": 1
  10. }
  11. }
  12. }'