生成AIエージェントに外部ツールを持たせる際、AWS Lambdaを利用するのは王道のパターンです。しかし、連携したい社内APIやツールが数十〜数百個レベルになってくると、AWSマネジメントコンソールから手作業で1つずつ登録するのは現実的でありません。
今回は、「Amazon Bedrock AgentCore Starter Toolkit」を活用し、100個のLambda関数を自動的にエージェントのツールとしてGatewayに登録し、一括デプロイする実践的な自動化アプローチをご紹介します。
アーキテクチャの概要
このアーキテクチャでは、Bedrock AgentCore Runtimeから直接個別のLambdaを叩くのではなく、中間にGateway(API Gateway + Cognito)を挟みます。これにより、大量のツールのエンドポイント管理、認証、ロギングを中央で一元化することが可能になります。
課題:大量のツール登録における「スキーマ定義」の壁
Bedrock AgentCore Runtime にツールを登録するためには、LLMがそのツールの用途と引数を理解するための**「ツールスキーマ(toolSchema)」**を定義したJSONペイロードが必要です。
数が少なければ手書きでも問題ありませんが、大量のツールを扱う場合は、Lambdaのデプロイとスキーマの生成をスクリプトで自動化するのが鉄則です。
ステップ1:大量のLambda関数を一括デプロイする
まずはモックとなるLambda関数を用意します。今回は「世界100都市の天気を取得するモックAPI」を想定し、Pythonの boto3 を使ってループ処理で一括デプロイします。
# lambda_function.py (各Lambdaのベースとなるコード)
import json
import random
def lambda_handler(event, context):
location = context.function_name
weather = random.choice(["Sunny", "Cloudy", "Rainy", "Snowy"])
return {
"statusCode": 200,
"body": json.dumps({"location": location, "weather": weather})
}
デプロイ用スクリプトを実行し、作成された100個のLambdaのARNを lambda_arns.json に保存しておきます。
ステップ2:Gateway登録用のTarget Payloadを自動生成
次に、保存したARNリストを読み込み、Gatewayへ登録するためのTarget Payloadを自動生成するスクリプトを作成します。
💡 Tips: ツール名の命名規則に注意
Bedrock Agentのツール名(name)にはアンダースコア(_)が使えないという罠があります。ハイフン(-)に変換するか、キャメルケースにするなどのエスケープ処理を忘れずに組み込みましょう。
# create_payload.py
import json
import re
with open("lambda_arns.json", "r") as f:
lambda_arns = json.load(f)
target_payloads = {}
for key, arn in lambda_arns.items():
# 例: "001_Tokyo_weather" から都市名を抽出
match = re.search(r'\d+_(.*)_weather', key)
city_name = match.group(1) if match else key
# ツール名にアンダースコアは使えないのでハイフン等に調整
tool_name = f"get-weather-in-{city_name.lower()}"
target_payloads[key] = {
"lambdaArn": arn,
"toolSchema": {
"inlinePayload": [{
"name": tool_name,
"description": f"Returns the current weather for {city_name}.",
"inputSchema": {"type": "object", "properties": {}}
}]
}
}
# 100個分のペイロードを出力
with open("target_payload.json", "w") as f:
json.dump(target_payloads, f, indent=2)
これを元に、Gateway構築スクリプトに流し込んでターゲットを一括登録します。
ステップ3:確実なCognito認証情報の取得
Gatewayと通信するための設定ファイル(gateway_config.json)を作成する際、マネジメントコンソールから手動で値(ClientIDやSecretなど)を拾うのはミスの元です。
AWS CLI/Boto3を使って、作成されたCognitoユーザープールから直接完璧な設定ファイルを生成するスクリプトを用意しておくと、トラブルシューティングの時間が激減します。
# recover_config.py (抜粋)
import boto3
import json
def generate_perfect_config():
# 構築時に出力された情報をセット
user_pool_id = "ap-northeast-1_XXXXXXXX"
gateway_url = "[https://xxxxxx.gateway](https://xxxxxx.gateway).../mcp"
cognito = boto3.client('cognito-idp', region_name="ap-northeast-1")
# ClientIDやSecretを動的に取得してJSON化する処理...
# (詳細なコードは割愛しますが、describe_user_pool_client等を使用します)
ステップ4:AgentCoreからのデプロイとテスト
準備が整ったら、agentcore CLIを使用してデプロイします。
# 必要なライブラリを書き出し
uv pip freeze > requirements.txt
# エージェントのデプロイ
uv run agentcore deploy
AWSマネジメントコンソールの **Amazon Bedrock AgentCore > エージェントランタイム のテストウィンドウで、「ヤンゴンとチューリッヒの天気を教えて」と入力してみましょう。エージェントが自律的に適切なLambdaツールを選択し、Gateway経由で回答を生成すれば成功です!
詳細なエラーログはCloudWatchの /aws/vendedlogs/bedrock-agentcore/gateway/APPLICATION_LOGS/... で確認できます。
まとめ
Bedrock AgentCore Toolkitと少しのPythonスクリプトを組み合わせることで、手作業では心が折れるような大量のツール統合も簡単かつ再現性のある形で実現できます。
複数の社内ツールをLLMに連携させたい場合は、ぜひこのGatewayアーキテクチャと自動化スクリプトの組み合わせを試してみてください。