

# 테넌트 격리를 사용하여 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>

[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 함수를 트리거할 때 클라이언트 요청 속성을 Lambda가 예상하는 `X-Amz-Tenant-Id` 헤더에 매핑하도록 API Gateway를 구성해야 합니다. API Gateway는 Lambda의 [Invoke](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);
    }
}
```

------