AgentCore Gateway to Agent
connection ジェネレーターは、エージェント(TypeScript または Python)を、protocol: http で生成された AgentCore Gateway の AgentCore Runtime ターゲットとして登録できます。
接続されると、Gateway は <gatewayUrl>/<targetName>/invocations の下でエージェントへのリクエストをプロキシし、IAM SigV4 でランタイムへのアウトバウンドトラフィックに署名します。これにより、エージェントに単一の管理されたエントリーポイントが提供されます。また、呼び出し元は Gateway にのみ到達すればよいため、エージェントランタイム自体は Gateway の背後の VPC 内にデプロイできます。
このジェネレーターを使用する前に、以下を確認してください:
protocol: httpで生成されたagentcore-gatewayプロジェクトinfra: agentcoreで作成されたエージェントコンポーネント(ts#agentまたはpy#agent)。auth: iam(Gateway が自身のロールで呼び出す)またはauth: cognito(Gateway が呼び出し元の JWT を転送する — 呼び出し元の ID をランタイムに転送するを参照)のいずれかが機能します。
ジェネレーターの実行
Section titled “ジェネレーターの実行”- インストール Nx Console VSCode Plugin まだインストールしていない場合
- VSCodeでNxコンソールを開く
- クリック
Generate (UI)"Common Nx Commands"セクションで - 検索
@aws/nx-plugin - connection - 必須パラメータを入力
- クリック
Generate
pnpm nx g @aws/nx-plugin:connectionyarn nx g @aws/nx-plugin:connectionnpx nx g @aws/nx-plugin:connectionbunx nx g @aws/nx-plugin:connectionGateway プロジェクトをソースとして、エージェントプロジェクトをターゲットとして選択します。エージェントプロジェクトに複数のコンポーネントが含まれている場合は、targetComponent を指定して明確にしてください。
| パラメータ | 型 | デフォルト | 説明 |
|---|---|---|---|
| sourceProject 必須 | string | - | ソース プロジェクト |
| targetProject 必須 | string | - | 接続先のターゲット プロジェクト |
| sourceComponent | string | - | 接続元のソース コンポーネント (コンポーネント名、ソース プロジェクト ルートからの相対パス、またはジェネレーター ID)。プロジェクトをソースとして明示的に選択するには '.' を使用します。 |
| targetComponent | string | - | 接続先のターゲット コンポーネント (コンポーネント名、ターゲット プロジェクト ルートからの相対パス、またはジェネレーター ID)。プロジェクトをターゲットとして明示的に選択するには '.' を使用します。 |
| preferInstallDependencies | boolean | true | ジェネレーター実行後に依存関係のインストールを優先するかどうか。複数のジェネレーターをバッチ処理する際にインストールを延期する場合はfalseに設定します(後続のジェネレーターがNxプロジェクトグラフを計算できるよう、必要に応じてインストールは実行されます)。最後に一度だけインストールします。 |
ジェネレーターの出力
Section titled “ジェネレーターの出力”ジェネレーターは、新しいソースファイルを生成するのではなく、既存のプロジェクトを接続します。以下のファイルが変更されます:
Directorypackages/<gateway>
- project.json Gateway の
devターゲットがエージェントの<agent>-devへの依存関係を獲得 - local-dev.ts
ATTACHED_AGENTSが更新され、ローカル gateway がエージェントにプロキシ
- project.json Gateway の
スタックへのエージェントターゲットの追加
Section titled “スタックへのエージェントターゲットの追加”ジェネレーターは、Gateway をインスタンス化するスタックやモジュールを知らないため、インフラストラクチャにエージェントターゲットを自動的に接続できません。gateway.addAgent(agent) の呼び出しを自分で追加してください。
Gateway をインスタンス化するスタックで、エージェントをターゲットとして登録します:
const myAgent = new MyAgent(this, 'MyAgent');const myGateway = new MyGateway(this, 'MyGateway');
// エージェントを Gateway のランタイムターゲットとして登録します。ターゲット名は// デフォルトでエージェントの `agentName`(クラス名をケバブケースにしたもの、// 例:`MyAgent` -> `my-agent`)になり、ターゲットの呼び出しパスを形成します:// <gatewayUrl>/my-agent/invocationsmyGateway.addAgent(myAgent);デフォルトのターゲット名を上書きするには、gatewayTargetName を渡します:
myGateway.addAgent(myAgent, { gatewayTargetName: 'my-target' });コンストラクトは、Gateway の実行ロールにエージェントランタイムへの呼び出しアクセスを付与し、GATEWAY_IAM_ROLE 認証情報プロバイダーでターゲットを構成するため、Gateway は自身のロールでアウトバウンド呼び出しに署名します。
Gateway をインスタンス化する Terraform ファイルで、エージェントターゲットを接続します:
module "my_agent" { source = "../../common/terraform/src/app/agents/my-agent" # ...}
module "my_gateway" { source = "../../common/terraform/src/app/gateways/my-gateway"
# Gateway は自身のロールでランタイムへのアウトバウンド呼び出しに署名し、 # ターゲット作成時にアクセスを検証するため、最初に呼び出しアクセスが必要です。 additional_iam_policy_statements = [ { Effect = "Allow" Action = [ "bedrock-agentcore:InvokeAgentRuntime", "bedrock-agentcore:InvokeAgentRuntimeWithWebSocketStream", # A2A ターゲットは追加で gateway 経由でエージェントカードを提供します "bedrock-agentcore:GetAgentCard", ] Resource = [ module.my_agent.agent_core_runtime_arn, "${module.my_agent.agent_core_runtime_arn}/*", ] } ]}
# エージェントを Gateway のランタイムターゲットとして登録します。ターゲット名は# 呼び出しパスを形成します:<gatewayUrl>/my-agent/invocationsresource "aws_bedrockagentcore_gateway_target" "my_agent" { gateway_identifier = module.my_gateway.gateway_id name = "my-agent" # AgentCore は設定されていない場合に説明を埋めますが、プロバイダーは # apply 後に一貫性のない結果として報告するため、常に設定してください。 description = "Agent runtime target my-agent"
target_configuration { http { agentcore_runtime { arn = module.my_agent.agent_core_runtime_arn } } }
credential_provider_configuration { gateway_iam_role {} }}Gateway を介したエージェントの呼び出し
Section titled “Gateway を介したエージェントの呼び出し”<gatewayUrl origin>/<targetName>/invocations へのリクエストは、プロトコル変換なしでエージェントランタイムに転送されるため、呼び出し元はランタイムに直接使用するのと同じリクエスト形式を使用します。SSE ストリーム(AG-UI)、JSON ストリーミング(Python HTTP)、A2A JSON-RPC はすべてプロキシを通過します。呼び出し元は、エージェントではなく Gateway で認証します(Gateway の auth に応じて IAM SigV4 または Cognito JWT)。
Web サイトを Gateway のエージェントに接続するには、connection ジェネレーターを使用してください。
呼び出し元の ID をランタイムに転送する
Section titled “呼び出し元の ID をランタイムに転送する”デフォルトでは、Gateway は自身の IAM ロール(GATEWAY_IAM_ROLE 認証情報プロバイダー)でアウトバウンド呼び出しに署名するため、ランタイムは呼び出し元の ID ではなく Gateway の ID を認識します。代わりにエージェントが呼び出し元に基づいて認可を行いたい場合(例えば、ユーザーの sub や scope クレームを読み取る場合)、Cognito エージェントの前段に Cognito Gateway を配置します。Gateway は呼び出し元の JWT を変更せずにランタイムに転送し(JWT_PASSTHROUGH 認証情報プロバイダー)、ランタイムはそれを再検証します。
両端を auth: cognito で生成し、上記のように接続します:
auth: cognitoで作成されたエージェント(ts#agentまたはpy#agent)、および- 同じ Cognito ユーザープールを前段に配置する
auth: cognitoで作成された Gateway。
それ以外はすべて自動です — gateway.addAgent(agent)(CDK)と生成された Terraform ランタイムモジュールが、エージェントの auth に基づいて配線を処理します:
- ターゲットは(
GATEWAY_IAM_ROLEではなく)JWT_PASSTHROUGH認証情報プロバイダーで作成され、 - ランタイムは
Authorizationヘッダーを許可リストに追加して、転送されたトークンがエージェントコードに到達するようにします。この許可リストがない場合、AgentCore はトークンを検証しますが、コンテナに到達する前にヘッダーを削除します。
呼び出し元は Authorization: Bearer <jwt>(SigV4 なし)で Gateway を呼び出し、エージェントは Authorization ヘッダーからクレームを読み取ります。ランタイムのインバウンドオーソライザーがすでにトークンを検証しているため、署名検証はスキップします:
import jwt # PyJWT
@app.post('/invocations')async def invoke(input: InvokeInput, request: Request): token = request.headers['authorization'].removeprefix('Bearer ') claims = jwt.decode(token, options={'verify_signature': False}) # authorize on claims['sub'], claims['scope'], ...ローカル開発
Section titled “ローカル開発”以下のコマンドで Gateway をローカルで実行します:
pnpm nx dev <gateway-name>yarn nx dev <gateway-name>npx nx dev <gateway-name>bunx nx dev <gateway-name>これにより、ローカル gateway と、割り当てられたローカルポート上のすべての接続されたエージェントが起動します。ローカル gateway は /<targetName>/... パスを各エージェントのローカルサーバーにプロキシし、デプロイされた Gateway のパスベースルーティングと一致します。