

# テナント分離を使用した Lambda 関数の呼び出し
<a name="tenant-isolation-invoke"></a>

テナント分離が有効になっている関数を呼び出す場合は、`tenant-id` パラメータを指定する必要があります。このパラメータにより、関数の呼び出しがその特定のテナント専用の実行環境で処理されます。

## テナント分離を使用した関数の呼び出し (AWS CLI)
<a name="tenant-isolation-invoke-cli"></a>

**同期呼び出し**

同期呼び出しの場合は、[Invoke](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html) コマンドに `--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)
<a name="tenant-isolation-invoke-api"></a>

[呼び出し](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 関数をトリガーする場合は、クライアントリクエストプロパティを Lambda が想定する `X-Amz-Tenant-Id` ヘッダーにマッピングするように API Gateway を設定する必要があります。API Gateway は Lambda の[呼び出し](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html) API アクションを使用します。このアクションでは、`X-Amz-Tenant-Id` HTTP ヘッダーを使用してテナント ID を渡す必要があります。HTTP ヘッダー、クエリパラメータ、パスパラメータなどのクライアントリクエストプロパティから取得した値を使用して、この HTTP ヘッダーを Lambda 呼び出しリクエストに挿入するように API Gateway を設定できます。`X-Amz-Tenant-Id` ヘッダーを上書きする前に、まずクライアントリクエストプロパティをマッピングする必要があります。

**注記**  
`X-Amz-Tenant-Id` ヘッダーを上書きできないため、HTTP API を使用してテナント分離 Lambda 関数を呼び出すことはできません。

**リクエストヘッダーの使用**

クライアントリクエストから `X-Amz-Tenant-Id` ヘッダーにカスタムヘッダーをマッピングするように API Gateway 統合を設定します。以下に、`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);
    }
}
```

------