🤔 Introducing APISIX AI Gateway – Built for LLMs and AI workloads. Learn More

aws-lambda

描述

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

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

属性

名称类型必选项默认值有效值描述
function_uristring触发 Lambda 函数的 AWS Lambda 函数 URL 或 Amazon API Gateway 端点。
authorizationobject在 AWS 上调用 Lambda 函数时用于身份验证和授权的凭证。
authorization.apikeystring选择 API 密钥作为安全机制时,REST API Gateway 的 API 密钥。
authorization.iamobject使用 AWS Signature Version 4 进行身份验证和授权的 IAM 凭证。
authorization.iam.accesskeystringIAM 用户访问密钥。当配置 authorization.iam 时必填。
authorization.iam.secretkeystringIAM 用户秘密访问密钥。当配置 authorization.iam 时必填。
authorization.iam.aws_regionstring”us-east-1”发送请求的 AWS 区域。
authorization.iam.servicestring”execute-api”接收请求的服务。与 AWS API Gateway 集成时设置为 execute-api,直接与 Lambda 函数集成时设置为 lambda
timeoutinteger3000[100,…]代理请求超时时间,单位为毫秒。
ssl_verifybooleantrue若为 true,执行 SSL 验证。
keepalivebooleantrue若为 true,保持连接以便复用。
keepalive_poolinteger5[1,…]保活连接池中的最大连接数。
keepalive_timeoutinteger60000[1000,…]连接空闲时保持活跃的时间,单位为毫秒。

示例

以下示例演示如何针对不同场景配置 aws-lambda 插件。

在操作前,请先登录 AWS 控制台并创建一个 Lambda 函数 (使用任意运行时即可)。默认情况下,该函数被调用后应返回 Hello from Lambda!

NOTE

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

admin_key=$(yq '.deployment.admin.admin_key[0].key' conf/config.yaml | sed 's/"//g')

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

以下示例演示如何将 APISIX 与 Lambda 函数集成,并使用 IAM 访问密钥进行授权。aws-lambda 插件实现了 AWS Signature Version 4 签名。

对于 IAM 访问密钥,请前往 AWS Identity and Access Management (IAM) 并选择要用于集成的用户。

安全凭证 标签页中,选择 创建访问密钥:

create access keys

选择 在 AWS 外部运行的应用程序 作为使用场景:

select use case

继续创建凭证,并记录访问密钥和秘密访问密钥:

save access keys

要创建 Lambda 函数 URL,请前往 Lambda 函数的 配置 标签页,在 函数 URL 下创建函数 URL:

create function URL

最后,在 APISIX 中使用函数 URL 和 IAM 访问密钥创建路由:

admin-api

curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT \
  -H "X-API-KEY: ${admin_key}" \
  -d '{
    "id": "aws-lambda-iam-route",
    "uri": "/aws-lambda",
    "plugins": {
      "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"
          }
        },
        "ssl_verify": false
      }
    }
  }'

adc

adc.yaml
services:
  - name: aws-lambda-service
    routes:
      - name: aws-lambda-iam-route
        uris:
          - /aws-lambda
        plugins:
          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

同步配置到网关:

adc sync -f adc.yaml

aic

gateway-api

aws-lambda-ic.yaml
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-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
        ssl_verify: false
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  namespace: aic
  name: aws-lambda-iam-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

apisix-crd

aws-lambda-ic.yaml
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
  namespace: aic
  name: aws-lambda-iam-route
spec:
  ingressClassName: apisix
  http:
    - name: aws-lambda-iam-route
      match:
        paths:
          - /aws-lambda
      plugins:
        - 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
            ssl_verify: false

应用配置:

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 密钥与 Amazon API Gateway 安全集成

以下示例演示如何将 APISIX 与 Amazon API Gateway 集成,并配置网关触发 Lambda 函数的执行。

要将 API Gateway 配置为 Lambda 触发器,请前往 Lambda 函数并选择 添加触发器:

add trigger for lambda function

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

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

INFO

Amazon API Gateway 支持 HTTP API 和 REST API。只有 REST API 支持 API 密钥,这就是本示例使用 REST API 触发器的原因。

你将被重定向回 Lambda 界面。要查找 API 密钥和网关 API 端点,请前往 Lambda 函数的 配置 标签页,在 触发器 下查看 API Gateway 详情:

API gateway endpoint and API key

最后,在 APISIX 中使用网关端点和 API 密钥创建路由:

admin-api

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

adc

adc.yaml
services:
  - name: aws-lambda-service
    routes:
      - name: aws-lambda-apikey-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
            ssl_verify: false

同步配置到网关:

adc sync -f adc.yaml

aic

gateway-api

aws-lambda-ic.yaml
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
        ssl_verify: false
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  namespace: aic
  name: aws-lambda-iam-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

apisix-crd

aws-lambda-ic.yaml
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
  namespace: aic
  name: aws-lambda-apikey-route
spec:
  ingressClassName: apisix
  http:
    - name: aws-lambda-apikey-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
            ssl_verify: false

应用配置:

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

以下示例演示如何将请求转发到 Amazon API Gateway 的子路径,并配置 API 触发 Lambda 函数的执行。

请先参考上一个示例完成 API Gateway 的设置。

要创建子路径,请前往 Lambda 函数的 配置 标签页,在 触发器 下点击进入 API Gateway:

click into the API gateway

选择 创建资源 以创建子路径:

create resource

填写子路径信息并完成创建:

complete resource creation

回到网关主控制台后,你将看到新创建的路径。选择 创建方法 为路径配置 HTTP 方法和关联的操作:

click on create method

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

create method and lambda function

完成方法创建。回到网关主控制台后,点击 部署 API 以部署路径和方法变更:

deploy changes to API gateway

最后,在 APISIX 中使用网关端点和 API 密钥创建路由:

admin-api

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

adc

adc.yaml
services:
  - name: aws-lambda-service
    routes:
      - name: aws-lambda-subpath-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
            ssl_verify: false

同步配置到网关:

adc sync -f adc.yaml

aic

gateway-api

aws-lambda-ic.yaml
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
        ssl_verify: false
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  namespace: aic
  name: aws-lambda-subpath-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

apisix-crd

aws-lambda-ic.yaml
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
  namespace: aic
  name: aws-lambda-subpath-route
spec:
  ingressClassName: apisix
  http:
    - name: aws-lambda-subpath-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
            ssl_verify: false

应用配置:

kubectl apply -f aws-lambda-ic.yaml

向路由发送请求:

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

APISIX 将把请求转发至 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 响应。