aws-lambda

描述

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

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

该插件支持通过 AWS API key 和 AWS IAM secrets 进行授权。当使用 AWS IAM secrets 时,该插件支持 AWS Signature Version 4 signing

属性

名称类型必选项默认值有效值描述
function_uristring触发 lambda serverless 函数的 AWS API Gateway 端点。
authorizationobject访问云函数的授权凭证。
authorization.apikeystring生成的 API 密钥,用于授权对 AWS Gateway 端点的请求。
authorization.iamobject用于通过 AWS v4 请求签名执行的基于 AWS IAM 角色的授权。请参考 IAM 授权方案
authorization.iam.accesskeystring从 AWS IAM 控制台生成的访问密钥 ID。
authorization.iam.secretkeystring从 AWS IAM 控制台生成的访问密钥。
authorization.iam.aws_regionstring“us-east-1”发出请求的 AWS 区域。有关更多 AWS 区域代码的信息请参考 AWS 区域代码表
authorization.iam.servicestring“execute-api”接收该请求的服务。若使用 Amazon API gateway APIs, 应设置为 execute-api。若使用 Lambda function, 应设置为 lambda
timeoutinteger3000[100,…]代理请求超时(以毫秒为单位)。
ssl_verifybooleantruetrue/false当设置为 true 时执行 SSL 验证。
keepalivebooleantruetrue/false当设置为 true 时,保持连接的活动状态以便重复使用。
keepalive_poolinteger5[1,…]在关闭该连接之前,可以在该连接上发送的最大请求数。
keepalive_timeoutinteger60000[1000,…]当连接空闲时,保持该连接处于活动状态的时间,以毫秒为单位。

启用插件

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

aws-lambda - 图1note

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

  1. admin_key=$(yq '.deployment.admin.admin_key[0].key' conf/config.yaml | sed 's/"//g')
  1. curl http://127.0.0.1:9180/apisix/admin/routes/1 \
  2. -H "X-API-KEY: $admin_key" -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: $admin_key" -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 - 图2注意

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

配置路径转发

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

aws-lambda - 图3重要

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

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

  1. curl http://127.0.0.1:9180/apisix/admin/routes/1 \
  2. -H "X-API-KEY: $admin_key" -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: $admin_key" -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. }'