使用租戶隔離調用 Lambda 函數 - AWS Lambda

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用租戶隔離調用 Lambda 函數

叫用已啟用租用戶隔離的函數時,您必須提供 tenant-id 參數。此參數可確保您的函數叫用是在專用於該特定租用戶的執行環境中處理。

使用租用戶隔離調用函數 (AWS CLI)

同步調用

對於同步調用,請將 --tenant-id 參數新增至您的調用命令:

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) 叫用函數

直接使用叫用 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 APIs 觸發租戶隔離的 Lambda 函數時,您必須設定 API Gateway 將用戶端請求屬性映射至 Lambda 預期的X-Amz-Tenant-Id標頭。API Gateway 使用 Lambda 的調用 API 動作,這需要使用 X-Amz-Tenant-Id HTTP 標頭傳遞租用戶 ID。您可以設定 API Gateway,使用從 HTTP 標頭、查詢參數或路徑參數等用戶端請求屬性取得的值,將此 HTTP 標頭注入 Lambda 調用請求。您必須先映射用戶端請求屬性,才能覆寫 X-Amz-Tenant-Id標頭。

注意

您無法使用 HTTP APIs 叫用租戶隔離的 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. 使用 將用戶端標頭映射至 Lambda 整合標頭 integration.request.header.X-Amz-Tenant-Id

使用查詢參數

同樣地,您可以將查詢參數映射至 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)

使用 AWS SDKs 調用租戶隔離的函數時,請在調用請求中包含租戶識別符。

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); } }