第2章で作ったツール Lambda 2つを、AI エージェントが呼び出せるよう AgentCore Gateway に登録します。ここが最もハマりポイントが多いセクションです。気を引き締めていきましょう!
※第2章へのリンク
https://qiita.com/toshi-arch/items/c390b0960d1b97055c61
AgentCore Gateway とは
ツール Lambda を MCP(Model Context Protocol) 形式でエージェントに公開するゲートウェイです。
エージェント → AgentCore Gateway(MCP エンドポイント) → ツール Lambda
重要: Gateway の作成・設定はマネジメントコンソールでは操作できません。Python SDK か AWS CLI で作業します。
Step 1. Lambda にリソースポリシーを先に追加する
Gateway が Lambda を呼び出せるよう、各 Lambda にリソースベースポリシーを追加します。コンソールの UI には bedrock-agentcore.amazonaws.com という選択肢がないため CLI で実行します:
aws lambda add-permission \
--function-name smart-shopper-tool-s3-search \
--statement-id AllowAgentCoreGateway \
--action lambda:InvokeFunction \
--principal bedrock-agentcore.amazonaws.com \
--region ap-northeast-1
aws lambda add-permission \
--function-name smart-shopper-tool-consumption-calc \
--statement-id AllowAgentCoreGateway \
--action lambda:InvokeFunction \
--principal bedrock-agentcore.amazonaws.com \
--region ap-northeast-1
⚠️ ハマりポイント①: 次の setup_gateway.py より前にこの手順を実行してください。 Gateway 作成後にポリシーを追加しようとすると、ターゲット登録時に権限エラーが出ます。
Step 2. ツールスキーマを定義する
エージェントへのツールの「説明書」を tool_schema.json として作成します。description の質がエージェントの判断精度に直結するので丁寧に書きます。
[
{
"name": "search_purchase_history",
"description": "指定した店舗の過去の購買履歴をS3から取得する。店舗名を入力すると、その店でこれまでに買ったものの一覧を返す。",
"inputSchema": {
"type": "object",
"properties": {
"store_name": {
"type": "string",
"description": "検索する店舗名(例: イオン、セブンイレブン)"
}
},
"required": ["store_name"]
}
},
{
"name": "calculate_consumption",
"description": "購買レコードを受け取り、商品ごとの消費サイクルから「今日買うべき商品」の提案リストを返す。",
"inputSchema": {
"type": "object",
"properties": {
"records": {
"type": "array",
"description": "search_purchase_history で取得した購買レコード"
},
"store_name": {
"type": "string",
"description": "対象の店舗名"
}
},
"required": ["records", "store_name"]
}
}
]
Step 3. Gateway 作成スクリプトを実行する
.env:
AWS_ACCOUNT_ID=123456789012
AWS_REGION=ap-northeast-1
setup_gateway.py:
import json, os, time, boto3
from dotenv import load_dotenv
load_dotenv()
ACCOUNT_ID = os.environ['AWS_ACCOUNT_ID']
REGION = os.environ.get('AWS_REGION', 'ap-northeast-1')
gateway_client = boto3.client('bedrock-agentcore-control', region_name=REGION)
with open('tool_schema.json') as f:
schema = json.load(f)
# 1. Gateway を作成
gw = gateway_client.create_gateway(
name='smart-shopper-gateway',
roleArn=f'arn:aws:iam::{ACCOUNT_ID}:role/SmartShopperAgentCoreRuntimeRole',
protocolType='MCP',
authorizerType='AWS_IAM', # ← 必須(省略可能だが省略すると後で認証エラー)
)
gateway_id = gw['gatewayId']
print(f'Gateway ID: {gateway_id}')
# READY になるまで待機
while True:
status = gateway_client.get_gateway(gatewayIdentifier=gateway_id)['status']
print(f'Status: {status}')
if status == 'READY': # ← ACTIVE ではなく READY
break
elif status == 'FAILED':
raise Exception('Gateway creation failed')
time.sleep(5)
CREDENTIAL_PROVIDER = [{'credentialProviderType': 'GATEWAY_IAM_ROLE'}]
# 2. S3 検索ツールを登録
gateway_client.create_gateway_target(
gatewayIdentifier=gateway_id,
name='smart-shopper-s3-search-target',
targetConfiguration={
'mcp': { # ← このネストが必要
'lambda': {
'lambdaArn': f'arn:aws:lambda:{REGION}:{ACCOUNT_ID}:function:smart-shopper-tool-s3-search',
'toolSchema': {'inlinePayload': [schema[0]]},
}
}
},
credentialProviderConfigurations=CREDENTIAL_PROVIDER,
)
# 3. 消費サイクル計算ツールを登録
gateway_client.create_gateway_target(
gatewayIdentifier=gateway_id,
name='smart-shopper-consumption-target',
targetConfiguration={
'mcp': {
'lambda': {
'lambdaArn': f'arn:aws:lambda:{REGION}:{ACCOUNT_ID}:function:smart-shopper-tool-consumption-calc',
'toolSchema': {'inlinePayload': [schema[1]]},
}
}
},
credentialProviderConfigurations=CREDENTIAL_PROVIDER,
)
print(f'\nGATEWAY_URL:')
print(f' https://{gateway_id}.gateway.bedrock-agentcore.{REGION}.amazonaws.com/mcp')
uv run python setup_gateway.py
表示された GATEWAY_URL を控えておいてください。第4章で使います。
ハマりポイントまとめ(第3章)
① Lambda リソースポリシーは Gateway より先
順番を守らないとターゲット登録で権限エラー。
② authorizerType='AWS_IAM' は必須
引数なしで create_gateway は成功してしまいますが、後から呼び出し時に認証エラーが出ます。
③ Gateway のステータスは READY(ACTIVE ではない)
# NG: 永久に待ち続ける
if status == 'ACTIVE':
break
# OK
if status == 'READY':
break
④ targetConfiguration のネストに注意
# NG: これでは動かない
targetConfiguration={'lambda': {'lambdaArn': '...', ...}}
# OK: mcp でラップする
targetConfiguration={'mcp': {'lambda': {'lambdaArn': '...', ...}}}
⑤ ツール名は ターゲット名___ツール名 で渡される
Gateway は Lambda を呼ぶ際にツール名を smart-shopper-s3-search-target___search_purchase_history のようにプレフィックス付きで渡します。第2章の _get_tool_name() でこのプレフィックスを除去しているのはこのためです。
次回予告
第4章では、Gateway に接続するエージェントコードを書き、AgentCore Runtime にデプロイし、iPhone のオートメーションで位置情報トリガーと繋げて、LINE プッシュ通知まで一気に完成させます。