AgentCore Gateway から 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 “ジェネレーターの実行”pnpm nx g @aws/nx-plugin:connectionyarn nx g @aws/nx-plugin:connectionnpx nx g @aws/nx-plugin:connectionbunx nx g @aws/nx-plugin:connection- インストール Nx Console VSCode Plugin まだインストールしていない場合
- VSCodeでNxコンソールを開く
- クリック
Generate (UI)"Common Nx Commands"セクションで - 検索
@aws/nx-plugin - connection - 必須パラメータを入力
- クリック
Generate
ソースとして Gateway プロジェクトを、ターゲットとしてエージェントプロジェクトを選択します。エージェントプロジェクトに複数のコンポーネントが含まれている場合は、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');
// Register the agent as a runtime target of the Gateway. The target name// defaults to the agent's `agentName` (its class name in kebab-case,// e.g. `MyAgent` -> `my-agent`), and forms the target's invocation path:// <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"
# The Gateway signs outbound calls to the runtime with its own role and # validates access at target creation, so it needs invoke access first. additional_iam_policy_statements = [ { Effect = "Allow" Action = [ "bedrock-agentcore:InvokeAgentRuntime", "bedrock-agentcore:InvokeAgentRuntimeWithWebSocketStream", # A2A targets additionally serve their agent card via the gateway "bedrock-agentcore:GetAgentCard", ] Resource = [ module.my_agent.agent_core_runtime_arn, "${module.my_agent.agent_core_runtime_arn}/*", ] } ]}
# Register the agent as a runtime target of the Gateway. The target name# forms the invocation path: <gatewayUrl>/my-agent/invocationsresource "aws_bedrockagentcore_gateway_target" "my_agent" { gateway_identifier = module.my_gateway.gateway_id name = "my-agent" # AgentCore fills in a description when none is set, which the provider # reports as an inconsistent result after apply — so always set one. 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 認証情報プロバイダー)、ランタイムは呼び出し元ではなく 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 のパスベースルーティングと一致します。