테넌트 격리로 Lambda 함수 호출

테넌트 격리로 Lambda 함수 호출

테넌트 격리(tenant isolation)가 활성화된 함수를 호출할 때는 tenant-id 파라미터를 제공해야 합니다. 이 파라미터는 함수 호출이 특정 테넌트 전용 실행 환경에서 처리되도록 보장합니다.

출처: AWS Lambda 개발자 안내서

본문

테넌트 격리로 함수 호출 (AWS CLI)

동기 호출(Synchronous invocation) – 동기 호출의 경우 Invoke 명령에 --tenant-id 파라미터를 추가하세요.

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

비동기 호출(Asynchronous invocation) – 비동기 호출의 경우 --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 ***
X-Amz-Tenant-Id: blue

{
    "key1": "value1",
    "key2": "value2"
}

테넌트 격리로 함수 호출 (API Gateway)

API Gateway REST API로 테넌트 격리 Lambda 함수를 트리거할 때는 클라이언트 요청 속성을 Lambda가 기대하는 X-Amz-Tenant-Id 헤더에 매핑하도록 API Gateway를 구성해야 합니다. API Gateway는 Lambda의 Invoke API 작업을 사용하며, 이는 테넌트 ID를 X-Amz-Tenant-Id HTTP 헤더로 전달해야 합니다. 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).
  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)

AWS SDK로 테넌트 격리 함수를 호출할 때는 호출 요청에 테넌트 식별자를 포함하세요.

Python (boto3)

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())

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

더 알아보기 (Learn more)