
AgentCore Gateway × VPC Lambda でAI Starterのマルチエージェントを構築してみた
はじめに
AI Starterに「サブエージェント」を追加したい場面に遭遇しました。親エージェント(アシスタント)が自分で処理しきれないタスクを専門のサブエージェントに委譲し、その結果を取り込んで回答する——いわゆるマルチエージェント構成です。
AI Starterに MCP(Model Context Protocol)統合が実装されており、外部の MCP サーバーをツールとして呼び出す仕組みがあります。この既存の MCP 統合を活用して、サブエージェントを追加できないか? という疑問から調査を始めました。
AI Starterにサブエージェントを追加できるか?
MCP 統合の仕組み
調べてみると、AI Starterの MCP クライアントは Streamable HTTP Transport を使ってリモート MCP サーバーと通信しています。流れはシンプルです:
- MCP サーバーの URL を登録
- 起動時に
tools/listでツール一覧を取得 - LLM がツール呼び出しを決定 →
tools/callで実行 - 結果を LLM のコンテキストに返す
つまり、MCP サーバーとして振る舞うエンドポイントさえ用意すれば、アプリケーション側は「単なるツール」として扱います。サブエージェントの内部が LLM を呼び出していようが、単純なロジックだろうが、MCP のインターフェースさえ満たせば透過的に動きます。
AgentCore Gateway が MCP アグリゲーターになる
ここで Amazon Bedrock AgentCore Gateway の出番です。AgentCore Gateway には MCP ターゲット という機能があり、Lambda 関数を MCP ツールとしてラップしてくれます。
構成図:

Gateway が tools/list に応答し、Lambda ベースのサブエージェントをツールとして公開してくれるため、アプリケーション側のコード変更は不要です。
MCP ターゲット vs HTTP ターゲット
AgentCore Gateway には「MCP ターゲット」と「HTTP ターゲット」の2種類があります。ここで重要な発見がありました:
| MCP ターゲット | HTTP ターゲット | |
|---|---|---|
tools/list で発見可能 |
はい | いいえ |
| ツールスキーマ定義 | 必要(name, description, inputSchema) | 不要(パススルー) |
| 用途 | ツールとして呼び出し | API プロキシ |
HTTP ターゲットは tools/list に現れないため、MCP クライアントからは見えません。サブエージェントとして使うなら MCP ターゲット一択 です。
VPC Lambda でサブエージェントを構築する
セキュリティグループのインバウンドルールを追加
セキュリティグループのインバウンドルールに HTTPS (443) / ソース: 自身の SG を追加します。これにより、同じ SG 内の Lambda から VPC Endpoint へ HTTPS 通信が可能になります。
-
VPC コンソール → セキュリティグループ → インバウンドのルールを編集

-
ルールを追加を押す
-
タイプ: HTTPS
-
ソース: カスタム
-
対象: 自身のセキュリティグループID
-
ルールを保存を押す

VPC Endpoint の作成
VPC 内の Lambda から Bedrock を呼ぶには、VPC Endpoint が必要です(NAT Gateway は不要)。
-
VPC コンソール → エンドポイント → エンドポイントを作成
-
タイプ: AWSのサービス

-
サービス:
com.amazonaws.ap-northeast-1.bedrock-runtime

-
VPCを選択

-
サブネットを選択

-
セキュリティグループを選択

Lambda 関数の作成
VPC Lambda でサブエージェントを実装します。ここでは「要約エージェント」を例にします。
- ランタイム: Python 3.12
- VPC: VPC Endpoint と同じ VPC・サブネット・SG を指定
- タイムアウト: LLM 呼び出しがあるため 30 秒以上に設定
- IAM ロール:
bedrock:InvokeModel権限を付与
- Lambda コンソール → 関数 → 関数を作成

2. 一つから作成 を選択

-
安価のため、 ARM64アーキテクチャ を有効化
-
VPCを有効化
-
セキュリティグループを選択
-
保存ボタンを押す

-
関数を作成を押す

-
以下の内容でLambdaの関数を設定
import boto3
import json
bedrock = boto3.client("bedrock-runtime")
SYSTEM_PROMPT = "You are a summarizer. Summarize the given text concisely in bullet points."
def lambda_handler(event, context):
text = event.get("text", "")
response = bedrock.converse(
modelId="jp.anthropic.claude-haiku-4-5-20251001-v1:0",
system=[{"text": SYSTEM_PROMPT}],
messages=[{"role": "user", "content": [{"text": text}]}],
inferenceConfig={"maxTokens": 2048},
)
return {
"result": response["output"]["message"]["content"][0]["text"]
}

-
設定 → アクセス権限 → 編集

-
タイムアウト:1分
-
新しいロールの作成を選択

-
以下の内容でロールを作成
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "bedrock:InvokeModel",
"Resource": "*"
}
]
}

-
Test → Creat new test event

-
Invocation type: Syncronous
-
Events sharing settings: Private
-
JSON eventを以下の内容で設定
{
"text": "Amazon Bedrock is a fully managed service that makes foundation models from leading AI companies available through a single API. It offers a broad range of models to choose from, along with capabilities to build generative AI applications with security, privacy, and responsible AI."
}

テストが成功すれば大丈夫です。
AgentCore Gateway のセットアップ
-
Bedrock コンソール → AgentCore → ゲートウェイ → ゲートウェイを作成
-
IAMアクセス許可: デフォルトロールの作成
-
ターゲット: MCP target

-
ターゲットタイプ: Lambda ARN
-
Lambda ARN: 前作ったLambdaのARN

-
インラインスキーマ(JSON エディタに入力):
[
{
"name": "summarize_text",
"description": "Summarize given text into concise bullet points. Use when user asks to summarize long content.",
"inputSchema": {
"type": "object",
"properties": {
"text": {
"type": "string",
"description": "The text to summarize"
}
},
"required": ["text"]
}
}
]

スキーマは inputSchema 部分だけでなく、name と description を含む配列形式で記述する必要があります。inputSchema だけ貼ると以下のバリデーションエラーになります:
Value at 'targetConfiguration.mcp.lambda.toolSchema.inlinePayload.1.member.name'
failed to satisfy constraint: Member must not be null
JWT 認証を使う場合、Amazon Cognito User Pool の情報を設定します:
- Issuer:
https://cognito-idp.ap-northeast-1.amazonaws.com/<USER_POOL_ID> - Audience: Cognito App Client ID
MCP エンドポイントの動作確認
Gateway 作成後に発行される MCP エンドポイント URL で動作確認します。
# ツール一覧の取得
curl -X POST \
https://<GATEWAY_ID>.gateway.bedrock-agentcore.ap-northeast-1.amazonaws.com/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
レスポンスにツールが表示されれば成功です。ツール名は Gateway が自動的にターゲット名をプレフィックスとして付与します(例: target-xxx___summarize_text)。
# ツールの実行テスト
curl -X POST \
https://<GATEWAY_ID>.gateway.bedrock-agentcore.ap-northeast-1.amazonaws.com/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"<TARGET_PREFIX>___summarize_text","arguments":{"text":"テスト用のテキスト..."}}}'


AI Starter でサブエージェントを構築する
外部サービスを追加する
-
AI Starter 管理コンソール → 外部サービス

-
新規追加を選択

-
サービスURL: 前作ったAgentCore ゲートウェイのURL

新規アシスタント(ユースケース)を作成する
- AI Starter 管理コンソール → アシスタント
- MCPサーバーに先作った外部サービスを選択

AI Starter で動作を確認する
-
AI Starter → ユースケース
-
先作ったアシスタント(ユースケース)を選択

-
登録した要約機能をテストする


登録されたMCPツールが呼び出されます。

生成した内容が返却されます。
ハマりポイント集
構築中に遭遇した問題とその解決策をまとめます。
1. Cross-Region Inference Profile のルーティング
症状: jp.anthropic.claude-haiku-4-5-20251001-v1:0 を使うと、IAM ポリシーで ap-northeast-1 のリソースを許可しているのに AccessDeniedException が発生。
原因: jp. プレフィックスの推論プロファイルは、AWS が内部的に日本リージョン群(ap-northeast-1, ap-northeast-3 等)にルーティングします。ap-northeast-1 だけ許可していると、ap-northeast-3(大阪)にルーティングされた際にアクセス拒否されます。
解決策: ステージング環境では IAM ポリシーの Resource を "*" にする。本番環境では必要なリージョンすべてを明示的に許可するか、arn:aws:bedrock:*:<ACCOUNT_ID>:inference-profile/* のようにワイルドカードを使います。
2. 推論プロファイル ARN のフォーマット
症状: IAM ポリシーで arn:aws:bedrock:ap-northeast-1::foundation-model/* を指定すると AccessDeniedException。
原因: jp. プレフィックス付きモデルは 推論プロファイルであり、foundation-model ではなく inference-profile の ARN フォーマットを使います。また、ARN にはアカウント ID が必要です。
# NG
arn:aws:bedrock:ap-northeast-1::foundation-model/anthropic.claude-*
# OK
arn:aws:bedrock:*:<ACCOUNT_ID>:inference-profile/jp.anthropic.*
3. Marketplace 権限
症状: Lambda 単体テストでは成功するが、Gateway 経由だと AccessDeniedException(Marketplace actions 関連)。
原因: Anthropic モデルの初回呼び出し時に aws-marketplace:ViewSubscriptions と aws-marketplace:Subscribe 権限が必要になるケースがあります。2026年7月現在、Bedrock のモデルアクセスは自動有効化されましたが、Marketplace 連携の権限は別途必要です。
解決策: Lambda の IAM ロールに以下のポリシーを追加。
{
"Effect": "Allow",
"Action": [
"aws-marketplace:ViewSubscriptions",
"aws-marketplace:Subscribe"
],
"Resource": "*"
}
4. Gateway ターゲットのスキーマバリデーション
症状: ターゲット追加時に inlinePayload.1.member.name failed to satisfy constraint: Member must not be null。
原因: 2つのパターンがあります。
- インラインスキーマに
inputSchemaだけ貼ってname/descriptionを含めていない - コンソールのフォームに空のツール行が残っている(インデックス
1= 2行目が空)
解決策: [{name, description, inputSchema}] の配列形式で記述し、空行がないことを確認します。
5. Gateway IAM ロールの伝播遅延
症状: Gateway 作成直後にターゲットを追加すると Gateway service is not authorized to perform AssumeRole on Gateway role。
原因: IAM ロール作成直後は AWS 内部での伝播に数十秒かかることがあります。
解決策: 30 秒ほど待ってからリトライします。
まとめ
AgentCore Gateway の MCP ターゲットを活用することで、既存アプリケーションのコードを変更せずにマルチエージェント構成を実現できました。
構成のポイント:
- 既存の MCP 統合を活かし、Gateway を「MCP サーバー」として登録するだけ
- サブエージェントは VPC Lambda + Bedrock で実装(VPC Endpoint 経由、NAT 不要)
- Gateway が MCP プロトコルを仲介し、ツール発見(
tools/list)と実行(tools/call)を透過的に処理 - MCP ターゲットを増やせばサブエージェントをスケールアウトできる
実務での判断基準:
- サブエージェントごとに専用の Lambda を用意し、システムプロンプトで役割を特化させる
- Gateway 認証は MVP では None でも良いが、本番では JWT(Cognito)を推奨
- VPC Lambda を使う場合、VPC Endpoint のセキュリティグループ設定を忘れずに
- IAM ポリシーでは推論プロファイルの ARN フォーマットと cross-region ルーティングに注意








