

# 调用具有租户隔离功能的 Lambda 函数
<a name="tenant-isolation-invoke"></a>

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

## 调用具有租户隔离功能的函数（AWS CLI）
<a name="tenant-isolation-invoke-cli"></a>

**同步调用**

要进行同步调用，请将 `--tenant-id` 参数添加到 [Invoke](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html) 命令中：

```
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）
<a name="tenant-isolation-invoke-api"></a>

直接使用 [Invoke](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html) 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）
<a name="tenant-isolation-invoke-apigateway"></a>

使用 API Gateway REST API 触发租户隔离的 Lambda 函数时，您必须配置 API Gateway，以将客户端请求属性映射到 Lambda 期望的 `X-Amz-Tenant-Id` 标头中。API Gateway 使用 Lambda 的 [Invoke](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html) 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`）

1. 使用 `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）
<a name="tenant-isolation-invoke-sdk"></a>

使用 AWS 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);
    }
}
```

------