

# Lambda 関数コードでのテナント識別子にアクセスする
<a name="tenant-isolation-context"></a>

Lambda 関数でテナント分離が有効になっている場合、関数の呼び出しに使用されるテナント識別子は、関数ハンドラーに渡されるコンテキストオブジェクト内で使用できます。この識別子を使用して、テナント固有のロジック、モニタリング、デバッグ機能を実装できます。

**Topics**
+ [テナント識別子へのアクセス](#tenant-isolation-context-access)
+ [一般的な使用パターン](#tenant-isolation-context-patterns)
+ [モニタリングとデバッグ](#tenant-isolation-context-monitoring)

## テナント識別子へのアクセス
<a name="tenant-isolation-context-access"></a>

テナント識別子は、コンテキストオブジェクトの `tenantId` プロパティから使用できます。このプロパティは、[初期化フェーズ](lambda-runtime-environment.md#runtimes-lifecycle-ib)ではなく、[呼び出しフェーズ](lambda-runtime-environment.md#runtimes-lifecycle-invoke)で使用できます。

------
#### [ Python ]

```
def lambda_handler(event, context):
    tenant_id = context.tenant_id
    print(f"Processing request for tenant: {tenant_id}")
    
    # Implement tenant-specific logic
    if tenant_id == "blue":
        return process_blue_tenant(event)
    elif tenant_id == "green":
        return process_green_tenant(event)
    else:
        return process_default_tenant(event)
```

------
#### [ Node.js ]

```
exports.handler = async (event, context) => {
    const tenantId = context.tenantId;
    console.log(`Processing request for tenant: ${tenantId}`);
    
    // Implement tenant-specific logic
    switch (tenantId) {
        case 'blue':
            return processBlueTenant(event);
        case 'green':
            return processGreenTenant(event);
        default:
            return processDefaultTenant(event);
    }
};
```

------
#### [ Java ]

```
public class TenantHandler implements RequestHandler<Map<String, Object>, String> {
    
    @Override
    public String handleRequest(Map<String, Object> event, Context context) {
        String tenantId = context.getTenantId();
        System.out.println("Processing request for tenant: " + tenantId);
        
        // Implement tenant-specific logic
        switch (tenantId) {
            case "blue":
                return processBlueTenant(event);
            case "green":
                return processGreenTenant(event);
            default:
                return processDefaultTenant(event);
        }
    }
}
```

------

## 一般的な使用パターン
<a name="tenant-isolation-context-patterns"></a>

関数コードでテナント識別子を使用する一般的な方法は次のとおりです。

**テナント固有の設定**

テナント ID を使用して、テナント固有の設定をロードします。

```
def lambda_handler(event, context):
    tenant_id = context.tenant_id
    
    # Load tenant-specific configuration
    config = load_tenant_config(tenant_id)
    database_url = config['database_url']
    api_key = config['api_key']
    
    # Process with tenant-specific settings
    return process_request(event, database_url, api_key)
```

**テナント固有のデータアクセス**

テナント ID を使用して、データの分離とアクセスコントロールを行います。

```
import boto3

def lambda_handler(event, context):
    tenant_id = context.tenant_id
    
    # Ensure data access is scoped to the tenant
    dynamodb = boto3.resource('dynamodb')
    table = dynamodb.Table('user_data')
    
    user_id = event.get('userId')
    
    response = table.get_item(
        Key={
            'tenant_id': tenant_id,
            'user_id': user_id
        }
    )
    
    return process_results(response.get('Item'), tenant_id)
```

## モニタリングとデバッグ
<a name="tenant-isolation-context-monitoring"></a>

[JSON ログ記録が有効](monitoring-cloudwatchlogs-logformat.md)になっている場合、テナント識別子は Lambda ログに自動的に含まれるため、テナント固有の問題のモニタリングとデバッグが容易になります。カスタムメトリクスとトレースにテナント ID を使用することもできます。

**Example テナント ID を使用したカスタムメトリクス**  
次の例は、テナント ID を使用して、テナント別の使用パターンとパフォーマンスをモニタリングするためのテナント固有の CloudWatch メトリクスを作成する方法を示しています。  

```
import boto3

def lambda_handler(event, context):
    tenant_id = context.tenant_id
    cloudwatch = boto3.client('cloudwatch')
    
    # Record tenant-specific metrics
    cloudwatch.put_metric_data(
        Namespace='MyApp/TenantMetrics',
        MetricData=[
            {
                'MetricName': 'RequestCount',
                'Dimensions': [
                    {
                        'Name': 'TenantId',
                        'Value': tenant_id
                    }
                ],
                'Value': 1,
                'Unit': 'Count'
            }
        ]
    )
    
    return process_request(event, tenant_id)
```