翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
ポリシーセッションと ID の伝播
一時ポリシーを使用すると、現在のリクエストだけでなく、セッション内で発生した過去のイベントに基づいてルールを定義できます。次のような制約を適用できます。
-
「セッションごとに最大 5 つのツール呼び出しを許可」
-
「ツール A がこのセッションで最初に呼び出されない限り、ツール B へのアクセスをブロックする」
-
「このセッションで機密データにアクセスした後に外部 API コールを拒否する」
ポリシーセッションは、複数の Gateway 呼び出しを 1 つの論理セッションにグループ化します。セッションは、時間ポリシールールが評価される境界です。
トピック
仕組み
-
アプリケーションは、 ヘッダーを使用して Gateway へのリクエストにセッション識別子を渡します。
x-amzn-bedrock-agentcore-policy-session-id -
Gateway は、呼び出し元の認証された ID (プリンシパル) にセッションをバインドします。
-
各呼び出しで、ゲートウェイはそのセッションのアクションの累積履歴に対して時間ポリシーを評価します。
-
マルチホップシナリオ (ゲートウェイ → ランタイム → ゲートウェイ) では、プラットフォームはサービスマネージドヘッダー を介してセッションと発信者 ID を自動的に伝播します
X-Amz-Bedrock-AgentCore-Identity-WAT。エージェントコードはこのヘッダーを管理する必要はありません — AgentCore はそれを透過的に処理します。
重要
マルチホップシナリオは、単一の AWS アカウントとリージョン内でのみ機能します。AgentCore は、アカウントまたはリージョンをまたぐマルチホップシナリオをサポートしていません。
ポリシーセッション ID を渡す
Gateway へのリクエストに x-amzn-bedrock-agentcore-policy-session-idヘッダーを含めます。セッション ID を生成し、最初のリクエストから始めて、すべてのリクエストで送信する必要があります。Gateway は、ユーザーに代わってセッション ID を生成しません。値はセッションを識別する文字列であり、UUIDv4 をお勧めします。同じセッション内のすべてのリクエストで同じ ID を送信します。
ヘッダーを省略するか、空の値を送信した場合、ゲートウェイはセッションを確立しません。関連付けられたポリシーエンジンに一時ポリシーが含まれている場合、セッション ID のないリクエストは検証エラーで失敗します。
受け入れられる形式とゲートウェイによる検証方法については、「ヘッダーの検証とランタイム以外のデプロイ」を参照してください。
最初のリクエスト (セッションを作成します):
curl -X POST \ https://mygateway-abcdefghij.gateway.bedrock-agentcore.us-west-2.amazonaws.com/mcp \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ACCESS_TOKEN" \ -H "x-amzn-bedrock-agentcore-policy-session-id: 12345678-1234-1234-1234-123456789012" \ -d '{ "jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": { "name": "PaymentTool___transfer_funds", "arguments": { "amount": 500, "recipient": "account-789" } } }'
後続のリクエスト (セッションを続行):
curl -X POST \ https://mygateway-abcdefghij.gateway.bedrock-agentcore.us-west-2.amazonaws.com/mcp \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ACCESS_TOKEN" \ -H "x-amzn-bedrock-agentcore-policy-session-id: 12345678-1234-1234-1234-123456789012" \ -d '{ "jsonrpc": "2.0", "id": 2, "method": "tools/call", "params": { "name": "PaymentTool___transfer_funds", "arguments": { "amount": 600, "recipient": "account-456" } } }'
一時ポリシーで各セッションが 1 回の転送に制限されている場合、前の例に示す 2 番目のリクエストは拒否されます。
Python の例
import requests import uuid GATEWAY_URL = "https://mygateway-abcdefghij.gateway.bedrock-agentcore.us-west-2.amazonaws.com/mcp" ACCESS_TOKEN = "YOUR_ACCESS_TOKEN" # Generate or reuse a session ID for the conversation session_id = str(uuid.uuid4()) # for example, "12345678-1234-1234-1234-123456789012" def call_tool(tool_name, arguments, session_id): headers = { "Content-Type": "application/json", "Authorization": f"Bearer {ACCESS_TOKEN}", "x-amzn-bedrock-agentcore-policy-session-id": session_id } payload = { "jsonrpc": "2.0", "id": "request-1", "method": "tools/call", "params": { "name": tool_name, "arguments": arguments } } response = requests.post(GATEWAY_URL, headers=headers, json=payload) return response.json() # First call - allowed result1 = call_tool( "PaymentTool___transfer_funds", {"amount": 500, "recipient": "account-789"}, session_id ) print(result1) # Success # Second call in same session - may be denied by temporal policy result2 = call_tool( "PaymentTool___transfer_funds", {"amount": 600, "recipient": "account-456"}, session_id ) print(result2) # Denied if rate-limit policy applies
セッションライフサイクル
| プロパティ | 値 |
|---|---|
|
作成 |
セッション ID を持つ最初のリクエストに暗黙的 |
|
アイドルタイムアウト |
最後のアクティビティから 24 時間 |
|
明示的なクローズ |
サポートされていない。セッションは自然に期限切れになる |
|
最大有効期間 |
アイドルタイムアウトによって制限される |
マルチホップシナリオでの ID の伝播
エージェントアーキテクチャでは、多くの場合、リクエストは複数の AgentCore プリミティブを経由します。
User -> Gateway1 -> Runtime (agent) -> Gateway1 (tool call) -> Target
これらのホップ間で時間ポリシーを機能させるには、セッション ID を保持する必要があります。AgentCore は、ワークロードアイデンティティチェーン (WIC) を使用してこれを自動的に処理します。
-
オリジンゲートウェイ: ゲートウェイは、
sessionIdと (元の発信者の ID) を埋め込むワークロードアクセストークンcallerPrincipal(WAT) をミントします。 -
ゲートウェイ → ランタイム: WAT は内部
X-Amz-Bedrock-AgentCore-Identity-WATヘッダーに渡されます。 -
ランタイム → ゲートウェイ (ツール呼び出し): ランタイムはインバウンド WAT を新しい WAT (チェーン拡張) と交換し、
sessionIdと を自動的に保持しますcallerPrincipal。拡張 WAT はアウトバウンドリクエストでスタンプされます。 -
受信ゲートウェイ: 同じセッションに対して一時的なポリシーを評価し、継続性を維持します。
これが意味すること:
-
Gateway への最初のリクエストのみを渡す必要があります。
x-amzn-bedrock-agentcore-policy-session-idプラットフォームは、すべてのダウンストリームホップへの伝播を処理します。 -
エージェントコードは、 ヘッダーの読み取り、変更、転送を行う必要はありません。
X-Amz-Bedrock-AgentCore-Identity-WATこれは AgentCore インフラストラクチャ (ランタイム、ゲートウェイ、および AgentCore Identity サービス) によって管理されます。 -
セッション ID は WAT 内を移動し、仲介者によるなりすましや改ざんはできません。
End-to-endのフロー:
User Gateway1 Runtime Gateway1 Target | POST /mcp | | | | | + session-id X | | | | | + Authorization| | | | |---------------->| | | | | | mint WAT1 | | | | | (sid=X, cpn=user) | | | | | forward + WAT1 | | | | |------------------>| | | | | |exchange WAT1->WAT2| | | | | (sid=X preserved) | | | | | tool call + WAT2 | | | | |------------------>| | | | | | evaluate temporal| | | | | policy, session X| | | | | forward | | | | |----------------->|
重要な考慮事項
-
セッション IDsはカスタマー管理です。新しいセッションを作成するタイミングと、既存のセッションを続行するタイミングを選択します。新しいセッション ID は、新しい時間ポリシーの評価境界を意味します。
-
X-Amz-Bedrock-AgentCore-Identity-WATヘッダーは内部です。エージェントコードでこのヘッダーを設定、変更、または削除しないでください。AgentCore がエンドツーエンドで管理します。 -
マルチゲートウェイシナリオ (Gateway1 → Runtime → Gateway2): セッション状態は WAT を介して自動的に伝播されます。Gateway2 は、同じセッション ID を使用して独自の一時ポリシーを評価します。
-
authorizerType=NONEゲートウェイは、発信者ごとのセッション分離を提供しません。認証が設定されていない場合、ゲートウェイにはセッションをバインドする発信者 ID はありません。同じセッション ID を提供するすべての発信者は、単一の一時ポリシーイベントストリームを共有します。ある発信者のアクションは、別の発信者のレート制限またはシーケンス制約にカウントされます。認証されていないゲートウェイの一時ポリシーはアドバイザリのみです。グローバル制限 (たとえば、「セッションごとにこのツールへの呼び出しの最大数 100 件」) を適用できますが、個々の発信者を区別または分離することはできません。発信者ごとの分離については、CUSTOM_JWTまたはAWS_IAM認証を使用してゲートウェイを設定します。
SDKs
Gateway リクエストでカスタムヘッダーをサポートする任意のクライアントを介してポリシーセッション ID を渡すことができます。次の例は、MCP Python SDK および Strands エージェントを使用するときにこれを含める方法を示しています。
同じ論理セッション内のすべての呼び出しで同じセッション ID 値を使用します。新しい会話が開始されたら、新しいセッション ID を生成します。
MCP クライアント (Python SDK):
ストリーミング可能な HTTP トランスポートで MCP Python SDK を使用する場合は、接続ヘッダーにセッション ID を含めます。
from mcp import ClientSession from mcp.client.streamable_http import streamablehttp_client import asyncio SESSION_ID = "12345678-1234-1234-1234-123456789012" async def call_with_session(gateway_url, token, tool_name, arguments): headers = { "Authorization": f"Bearer {token}", "x-amzn-bedrock-agentcore-policy-session-id": SESSION_ID } async with streamablehttp_client(url=gateway_url, headers=headers) as (read, write, _): async with ClientSession(read, write) as session: await session.initialize() result = await session.call_tool(name=tool_name, arguments=arguments) return result result = asyncio.run(call_with_session( "https://mygateway-abcdefghij.gateway.bedrock-agentcore.us-west-2.amazonaws.com/mcp", "YOUR_TOKEN", "PaymentTool___transfer_funds", {"amount": 500, "recipient": "account-789"} ))
ストランドエージェント:
AgentCore Gateway をツールソースとして Strands Agents を使用する場合は、MCP クライアントトランスポートヘッダーでセッション ID を渡します。セッション中にエージェントが行うすべてのツール呼び出しは同じセッションを持ち、一時ポリシーは完全な履歴を評価します。
from strands.tools.mcp.mcp_client import MCPClient from mcp.client.streamable_http import streamablehttp_client SESSION_ID = "12345678-1234-1234-1234-123456789012" def create_transport(mcp_url, access_token): return streamablehttp_client( mcp_url, headers={ "Authorization": f"Bearer {access_token}", "x-amzn-bedrock-agentcore-policy-session-id": SESSION_ID } ) mcp_client = MCPClient(lambda: create_transport(gateway_url, token)) with mcp_client: result = mcp_client.call_tool_sync( tool_use_id="tool-1", name="PaymentTool___transfer_funds", arguments={"amount": 500, "recipient": "account-789"} )
実際のお客様のユースケース
次のシナリオは、一時的なポリシーがエージェントアプリケーションの一般的なセキュリティとコンプライアンスの課題にどのように対処するかを示しています。
金融サービス — 転送レート制限
fintech アプリケーションを使用すると、エンドユーザーは会話エージェントを介して銀行送金を開始できます。一時的なポリシーがない場合、侵害されたエージェントまたはループエージェントは 1 つのセッションで無制限の転送を実行できます。セッション範囲のレート制限では、ゲートウェイはセッションあたりの転送の最大数を適用します。
User: "Transfer $500 to Alice" -> Allowed (1 of 3) User: "Transfer $200 to Bob" -> Allowed (2 of 3) User: "Transfer $1000 to Charlie" -> Allowed (3 of 3) User: "Transfer $50 to Dave" -> DENIED by temporal policy
各ユーザーセッションは、独自のセッション ID を使用します。新しいセッション ID は新しい評価境界を作成するため、レート制限は新しいセッションの開始時にリセットされます。
ヘルスケア — エスカレーションコントロール
ヘルスケアエージェントは患者レコードにアクセスし、外部通知システムにメッセージを送信することもできます。一時ポリシーでは、患者データにアクセスすると、セッションの残りの期間、外部 API コールは許可されません。これにより、エージェントのプロンプトがセッション中に操作された場合でも、データの流出を防ぐことができます。
Agent: calls PatientRecords___read_chart -> Allowed Agent: calls ExternalAPI___send_notification -> DENIED (sensitive data was accessed in this session)
制約はツール自体にはありません。患者データにアクセスしないセッションでは許可send_notificationされます。このポリシーは、この特定のセッションの前半で何が起こったかを考慮します。
DevOps — シーケンスの制約
デプロイエージェントは必須シーケンスに従う必要があります。デプロイを続行する前にテストに合格する必要があります。一時ポリシーは、同じセッションで が呼び出RunTestsされた後にのみ呼び出Deployせる を適用します。
Agent: calls Deploy___to_production -> DENIED (RunTests not yet called in this session) Agent: calls RunTests___execute -> Allowed Agent: calls Deploy___to_production -> Allowed (RunTests was called earlier in this session)
これにより、エージェントのプロンプトや制御するオーケストレーションフレームワークに関係なく、デプロイシーケンスが保証されます。
マルチテナント SaaS — ユーザーごとの予算の適用
SaaS プラットフォームは、共有アプリケーション認証情報 (CUSTOM_JWTOn-Behalf-Of (OBO) フローによるユーザーごとのsubクレームを含む) の背後にある複数のエンドユーザーの AI エージェントをホストします。各ユーザーのセッションは、一意のセッション ID を受け取ります。Gateway はセッション ID と認証されたプリンシパルの両方にセッションをバインドするため、異なるユーザーのセッションは自動的に分離されます。一時ポリシーは、「セッションあたりのツール呼び出しで最大 100 USD」を適用します。これは、すべてのトラフィックが同じアプリケーション認証情報を介して到着した場合でも、ユーザーごとに個別に評価されます。
セッションスコープの選択: 広範なセッションと狭いセッション
指定するセッション ID によって、一時ポリシーの評価境界が決まります。適切なスコープを選択すると、セキュリティと使いやすさの両方に影響します。
| 方針 | セッション ID パターン | 長所 | 短所 |
|---|---|---|---|
|
会話ごと (推奨) |
ユーザー会話あたりの新しい UUID |
自然な境界、会話間のレート制限のリセット、ユーザーのメンタルモデルのクリア |
エージェントは新しい制限のために新しいセッションを開始する必要があります |
|
ユーザーごと (広範囲) |
ユーザーあたりの安定した ID (ユーザー ID のハッシュなど) |
ポリシーはすべての会話に適用されます。毎日の予算の適用に役立ちます |
TTL (24h) 内で制限がリセットされることはありません。無関係なタスク間で共有されます。 |
|
リクエストごと (ナロー) |
リクエストあたりの新しい UUID |
すべてのリクエストは独立しています |
一時ポリシーは効果的に無効になっている — 評価する履歴がない |
|
タスクごと |
論理タスクあたりの UUID (例:「この順序を処理する」) |
特定のワークフローを対象とするポリシー。複数ステップのエージェントタスクに対応 |
アプリケーションはタスク → セッション ID マッピングを管理する必要があります |
ガイダンス:
-
会話ごとに開始します。これは、ほとんどのインタラクティブエージェントのユースケースに自然に一致します。
-
クロス会話の適用が必要な場合 (たとえば、「会話の数に関係なく 1 日あたり 10 回以下の転送」)、ユーザーごとに を使用します。
-
一時的なポリシー評価を意図的に必要でない限り、リクエストごとに を使用しないでください。
-
過度に広範なセッション (すべてのユーザーに 1 つのセッション ID など) を避ける — すべての発信者のアクションを 1 つのイベントストリームに集約し、ユーザーあたりのレート制限を無意味にします。
ヘッダー検証と非ランタイムデプロイ
Gateway がセッション ID を検証する方法
Gateway は x-amzn-bedrock-agentcore-policy-session-idヘッダーを受け取ると、次の検証を実行します。
-
形式チェック: 値は 1~128 文字で、英数字とハイフン () のみを含む必要があります
[A-Za-z0-9-]。不正な形式またはオーバーサイズの値は HTTP 400 で拒否されます。このチェックに合格しない限り、ヘッダーが使用または反映されることはありません。 -
プリンシパルバインド: 認証されたゲートウェイ (
CUSTOM_JWTまたはAWS_IAM) では、ゲートウェイはセッションを呼び出し元の認証された ID にバインドします。同じセッション ID を提供する 2 つの異なる発信者は、分離されたセッションを取得します。アイデンティティはセッションキーの一部です。 -
暗黙的な作成: セッションを事前登録する必要はありません。特定のセッション ID を持つ最初のリクエストは、暗黙的にセッションを作成します。個別の「セッションの作成」 API コールは必要ありません。
Gateway を直接呼び出す場合 (AgentCore ランタイムなし)
アプリケーションがゲートウェイ URL への HTTP リクエストを行うバックエンドサービスなど、ゲートウェイエンドポイントを直接呼び出す場合、セッション ID は自分で管理します。
-
各論理会話の開始時にセッション ID を生成する ( を推奨
uuid4)。 -
会話のすべてのリクエストに を HTTP ヘッダー
x-amzn-bedrock-agentcore-policy-session-id: <your-session-id>として含めます。 -
セッション ID クライアント側を会話中に保存し、後続のリクエストが同じセッションを参照するようにします。
追加の設定、アクセス許可、または API コールは必要ありません。Gateway は、初回使用時にセッションを作成し、24 時間の非アクティブ後にセッションを期限切れにします。
リクエストが AgentCore ランタイムを経由する場合
呼び出しが User → Gateway → Runtime (エージェント) → Gateway (ツール呼び出し) パスを通過する場合、最初のリクエストでセッション ID を最初の Gateway に渡すだけで済みます。プラットフォームは、セッション ID をワークロードアクセストークン (WAT) 内に埋め込み、すべてのダウンストリームホップを通じて自動的に伝達します。エージェントコードは、セッション ID を読み取り、保存、または転送する必要はありません。受信側ゲートウェイに透過的に到着します。
ワークロードアクセストークン (WAT) について
ワークロードアクセストークンは AWS、AgentCore サービス間で流れるリクエストの ID コンテキストを保持する署名付き不透明トークンです。一時ポリシーがアクティブな場合、WAT には以下が含まれます。
-
セッション ID — マルチホップリクエストのすべてのホップを同じ時間ポリシーセッションにリンクします。
-
発信者プリンシパル — ダウンストリームゲートウェイがセッションを正しくバインドできるように、元の発信者の ID を保持します。
-
ワークロードチェーン — リクエストが通過した AgentCore サービスの順序付けられたリスト (例:
[Gateway, Runtime, Gateway])。
WAT は、有効期間が短く (15 分の TTL)、AgentCore Identity サービスによって暗号的に署名され、すべての参加者に不透明です。発信者や仲介者による偽造、改ざん、デコードはできません。
WAT と直接やり取りすることはありません。これは内部X-Amz-Bedrock-AgentCore-Identity-WATヘッダーで実行され、プラットフォームによって完全に管理されます。この説明は、ホップ間のセッション継続性がどのように機能するかを理解するために提供されています。WAT に関するアクションを実行する必要はありません。
ワークロードアイデンティティとアクセストークンの詳細については、「ワークロードアクセストークンの取得」および「ワークロードアイデンティティについて」を参照してください。