调用具有租户隔离功能的 Lambda 函数 - Amazon Lambda
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

调用具有租户隔离功能的 Lambda 函数

在调用启用了租户隔离的函数时,您必须提供一个 tenant-id 参数。此参数确保您的函数调用会在专为该特定租户设置的执行环境中进行处理。

调用具有租户隔离功能的函数(Amazon CLI)

同步调用

要进行同步调用,请将 --tenant-id 参数添加到 Invoke 命令中:

aws lambda invoke \ --function-name image-analysis \ --tenant-id blue \ response.json

异步调用

对于异步调用,请同时包含 --tenant-id--invocation-type Event 参数:

aws lambda invoke \ --function-name image-analysis \ --tenant-id blue \ --invocation-type Event \ response.json

调用具有租户隔离功能的函数(API)

直接使用 Invoke API 操作时,请在请求中使用 X-Amzn-Tenant-Id 参数包含租户标识符。

API 请求示例

POST /2015-03-31/functions/image-analysis/invocations HTTP/1.1 Host: lambda.us-east-1.amazonaws.com Content-Type: application/json Authorization: AWS4-HMAC-SHA256 Credential=... X-Amz-Tenant-Id: blue { "key1": "value1", "key2": "value2" }

调用具有租户隔离功能的函数(API Gateway)

使用 API Gateway REST API 触发租户隔离的 Lambda 函数时,您必须配置 API Gateway,以将客户端请求属性映射到 Lambda 期望的 X-Amz-Tenant-Id 标头中。API Gateway 使用 Lambda 的 Invoke API 操作,该操作要求使用 X-Amz-Tenant-Id HTTP 标头传递租户 ID。您可以对 API Gateway 进行配置,使其在 Lambda 调用请求中插入此 HTTP 标头,并从客户端请求属性(如 HTTP 标头、查询参数或路径参数)中获取该标头的值。您必须先对客户端请求属性进行映射,然后才能覆盖 X-Amz-Tenant-Id 标头。

注意

您无法使用 HTTP API 调用租户隔离的 Lambda 函数,因为无法覆盖 X-Amz-Tenant-Id 标头。

使用请求标头

请配置您的 API Gateway 集成,以将客户端请求中的自定义标头映射到 X-Amz-Tenant-Id 标头。下面是带有 x-tenant-id 标头的客户端请求示例:

POST /api/process HTTP/1.1 Host: your-api-id.execute-api.us-east-1.amazonaws.com Content-Type: application/json x-tenant-id: blue { "data": "sample payload" }

在 API Gateway 方法配置中,您必须:

  1. 启用客户端请求标头参数(例如 method.request.header.x-tenant-id

  2. 使用 integration.request.header.X-Amz-Tenant-Id 将客户端标头映射到 Lambda 集成标头

使用查询参数

同样,您可以将查询参数映射到 X-Amz-Tenant-Id 标头:

GET /api/process?tenant-id=blue&data=sample HTTP/1.1 Host: your-api-id.execute-api.us-east-1.amazonaws.com

配置该方法以启用查询参数,并将其映射到集成标头中。

调用具有租户隔离功能的函数(SDK)

使用 Amazon SDK 调用租户隔离函数时,请在调用请求中包含租户标识符。

Python
import boto3 import json lambda_client = boto3.client('lambda') response = lambda_client.invoke( FunctionName='image-analysis', TenantId='blue', Payload=json.dumps({ 'key1': 'value1', 'key2': 'value2' }) ) result = json.loads(response['Payload'].read())
Node.js
const AWS = require('aws-sdk'); const lambda = new AWS.Lambda(); const params = { FunctionName: 'image-analysis', TenantId: 'blue', Payload: JSON.stringify({ key1: 'value1', key2: 'value2' }) }; lambda.invoke(params, (err, data) => { if (err) { console.error(err); } else { const result = JSON.parse(data.Payload); console.log(result); } });
Java
import software.amazon.awssdk.services.lambda.LambdaClient; import software.amazon.awssdk.services.lambda.model.InvokeRequest; import software.amazon.awssdk.services.lambda.model.InvokeResponse; import software.amazon.awssdk.core.SdkBytes; public class TenantIsolationExample { public static void main(String[] args) { LambdaClient lambdaClient = LambdaClient.create(); String payload = "{\"key1\": \"value1\", \"key2\": \"value2\"}"; InvokeRequest request = InvokeRequest.builder() .functionName("image-analysis") .tenantId("blue") .payload(SdkBytes.fromUtf8String(payload)) .build(); InvokeResponse response = lambdaClient.invoke(request); } }