メインコンテンツへスキップ

AgentCore & メモリ技術 FAQ

AgentCore Runtime、Gateway、ライブ AWS 照会経路、Memory Store など、AI エンジンの内部動作に関する詳細な質問と回答です。

AgentCore がライブ AWS 照会の基本(primary)経路である理由は?

AWSops のライブ AWS データは AgentCore MCP Lambda ツールを通じて照会されます。かつてのレガシーアプリが組み込み Steampipe で直接クエリしていた方式を置き換えたものです。

主要ポイント

項目内容
ライブ照会AgentCore MCP Lambda ツール(約 160 個、読み取り専用)が boto3 で AWS API を直接呼び出し
Steampipe の役割ライブクエリエンジンではないsteampipe_enabled フラグでのみ有効化されるインベントリ sync(デフォルト OFF)に過ぎない — ローカル 9193 サービス/pg Pool なし
ゲートAgentCore 全体は agentcore_enabled Terraform フラグでゲート(デフォルト OFF → plan = No changes、$0)
読み取り専用すべてのツールは read-only(ADR-041 / 2026-06-11 の撤回:AWS リソースの変更+自律は恒久凍結)
Steampipe はもはやライブエンジンではありません

ライブ AWS の状態は常に AgentCore ツールが回答します。Steampipe は有効化された場合に Fargate でウォームアップされ、インベントリを Aurora へ sync する補助経路に過ぎず、デフォルトは無効です。

AgentCore Runtime とは何で、Strands Agent との関係は?

AgentCore Runtime と Strands Agent は異なるレイヤーで動作します。

AgentCore Runtime

  • AWS が管理するサーバーレスコンテナ実行環境
  • Docker イメージ(ECR)を指定すると自動的にコンテナを実行/スケーリング
  • Cold Start 管理、ネットワーク設定、IAM Role などを処理
  • InvokeAgentRuntime で呼び出し

Strands Agent Framework

  • Python ベースの AI エージェントフレームワークagent/agent.py
  • LLM(Bedrock)にツールを提供し、ツール呼び出しの結果を再び LLM に渡すループ
  • MCP プロトコルでゲートウェイに接続してツールを使用

関係の整理

項目AgentCore RuntimeStrands Agent
役割コンテナ実行環境AI エージェントロジック
レベルインフラアプリケーション
管理主体AWS開発者
コードの場所AWS サービスagent/agent.py
設定Terraform / 冪等 provisionerPython コード

Gateway と Lambda はどのような関係ですか?ゲートウェイはいくつありますか?

Gateway は MCP プロトコルルーターで、Lambda は実際に AWS API を実行する読み取り専用バックエンドです。

セクションゲートウェイは 9 個です(ADR-004 改訂)

network · container · data · security · cost · monitoring · iac · ops · external-obs — 合計 9 個です(9 プロビジョニング / 9 ルーティング、external-obs 昇格 2026-06-24)。

項目内容
ゲートウェイ数ADR-004 改訂(2026-06-24)に従い 9 個
ツール数160 個、すべて読み取り専用 — フリートが拡張されれば変動(固定値ではない)
外部オブザーバビリティPrometheus·ClickHouse コネクタは external-obs ゲートウェイ(9 番目)としてルーティング(ADR-004 改訂)— その他の外部連携は独立した Integrations 軸(ADR-007/017)
プロトコルMCP(Model Context Protocol)標準
  • Agent が list_tools で利用可能なツール一覧を照会
  • Agent がツールを選択すると Gateway が該当 Lambda を呼び出し
  • Gateway Target 作成時に mcp.lambda プロトコルと credentialProviderConfigurations を指定

なぜ Lambda を使用するのですか?

理由説明
分離各ツールが独立実行、1 つが失敗しても他のツールに影響なし
権限の分離Lambda ごとに最小権限の IAM Role を付与可能
スケーリング同時呼び出し時に自動スケーリング
コスト呼び出し時のみ課金、アイドルコストなし
Gateway Target 作成時の注意

CLI の --inline-payload オプションには JSON パースの問題があります。Python/boto3 で作成する必要があります。また、作成したばかりのゲートウェイが READY になる前だと、最初の Target 作成が ValidationException を投げることがありますが、provisioner は冪等なので再実行で解消されます。

単一アカウントなのに「cross-account 遮断」エラーが出る理由は?

AWSops のライブ環境は単一アカウント123456789012)です。ところが、チャットでホストアカウント自身を対象アカウントとして選ぶと、かつてのツールがホストに存在しないクロスアカウントロールを self-assume しようとして AccessDenied が発生し、エージェントがこれを「cross-account 遮断」と誤診していました。

何が問題だったか

  • agent.pytarget_account_id = <ホストアカウント> を強制
  • ツールが arn:...:role/AWSopsReadOnlyRole を self-assume しようと試行
  • このロールはオンボーディングされたターゲットアカウントにのみ存在し、ホストには存在しない → AccessDenied
  • エージェントが原因を誤解 → 「cross-account 遮断」メッセージ

修正(defense-in-depth)

場所動作
cross_account.get_role_arn()対象 == ホストなら None を返す → AssumeRole なしで Lambda 実行ロールを直接使用
agent.py effective_account_id()ホストアカウントを __all__ のように blank 扱い → 同一アカウントへのアクセスには prefix を付与しない
ホスト判定AWSOPS_HOST_ACCOUNT_ID env → なければ STS GetCallerIdentity フォールバック(ウォームコンテナでキャッシュ)

本当に別のアカウントを assume する正常経路はそのまま維持されます。

単一アカウントで「自分のアカウント」を選んだ場合

現在はホストアカウントの選択は self-assume なしで実行ロールを直接使うため、正常に動作します。別の(オンボーディングされた)アカウントを選択した場合のみ STS AssumeRole 経路を通ります。

AgentCore の設定値はどこに保存されますか?

SSM Parameter Store が source of truth です。冪等 provisioner(scripts/v2/agentcore/provision.py)が作成したリソース識別子を SSM に記録し、Web thin-BFF がランタイムに読み取ります。

SSM パス(/ops/awsops-v2/agentcore/...

パラメータ
/ops/awsops-v2/agentcore/runtime_arnAgentCore Runtime ARN
/ops/awsops-v2/agentcore/interpreter_idCode Interpreter ID
/ops/awsops-v2/agentcore/memory_idMemory Store ID

なぜ SSM なのか?(valueFrom レース回避)

  • provisioner が apply 後にリソースを作成 → 識別子を SSM に記録
  • Web BFF はランタイムに SSM から read(キャッシング)
  • ECS task def の secrets valueFrom を使わない → provision 時点と task 起動時点の間のレースコンディションを回避
SSM 予約 prefix に注意

aws... で始まる SSM パスは予約語として拒否されます。そのため /ops/${project}/... 形式を使用しています。

Docker arm64 ビルドが必須の理由は?(EC2 ビルドホストはありません)

AgentCore Runtime は AWS Graviton(ARM64) プロセッサ上で実行されます。

# 正しいビルドコマンド — buildx で arm64 クロスビルド
docker buildx build --platform linux/arm64 -t awsops-agent .

# ECR プッシュ
docker tag awsops-agent:latest $ECR_URI:latest
docker push $ECR_URI:latest

x86(amd64)でビルドすると?

コンテナが起動しないか、exec format error が発生します。Runtime の状態が FAILED に遷移します。

専用の EC2 ビルドインスタンスはありません

レガシーアプリとは異なり、AWSops には別途の t4g ビルドホストがありません。 web/agent/worker イメージはすべて docker buildx --platform linux/arm64 でビルドします。Apple Silicon(M1/M2/M3)はネイティブ ARM64 ですが、Intel Mac などの amd64 環境でも --platform linux/arm64 を明示するだけで同様に arm64 イメージを作成できます。

agent.py を修正したらどのように再デプロイしますか?

make agentcore が arm64 イメージをビルド/プッシュし、冪等 provisioner を実行します。

手順

make agentcore          # arm64 agent イメージのビルド/プッシュ + 冪等 provisioner
make agentcore --smoke # 追加で呼び出し検証

provisioner は冪等なので、安全に再実行できます(例:最初の Target 作成がゲートウェイ未準備で失敗した場合)。

ゲートウェイルーティングは環境変数で注入

agent.py はゲートウェイ URL をコードにハードコーディングせず、GATEWAYS_JSON 環境変数として注入を受けます。したがって、ゲートウェイルーティングの変更が直ちに Docker の再ビルドを要求するわけではありません。

MCP プロトコルとは?ツールディスカバリーはどのように動作しますか?

MCP(Model Context Protocol)

MCP は、AI エージェントが外部ツールを標準化された方式で呼び出すためのプロトコルです。AWSops では、Strands Agent が MCP を通じてゲートウェイの読み取り専用ツールにアクセスします。

SigV4 署名通信

Gateway への接続には AWS SigV4 署名が必要です(agent/streamable_http_sigv4.py)。エージェントの認証情報で署名した MCP StreamableHTTP トランスポートを使用します。

ツールディスカバリー(Tool Discovery)

Agent が Gateway に接続すると、ページネーションで全ツール一覧を照会し、それを LLM に提供します。LLM(Bedrock)がユーザーの質問を見てどのツールを呼び出すかを自ら決定するため、開発者がツール選択ロジックを書く必要はありません。

Gateway に新しいツール(Lambda)を追加するには?

全体の流れ

Step 1: Lambda 関数の作成

agent/lambda/ ディレクトリに、MCP ハンドラーパターンに従う Python ファイルを作成します:

# agent/lambda/my_new_mcp.py
import json
import boto3

def lambda_handler(event, context):
params = event if isinstance(event, dict) else json.loads(event)
t = params.get("tool_name", "")
args = params.get("arguments", params)

if t == "my_new_tool":
client = boto3.client('ec2')
result = client.describe_instances(**args) # 読み取り専用
return {"statusCode": 200, "body": json.dumps(result, default=str)}

return {"statusCode": 400, "body": "Unknown tool"}

Step 2: Gateway Target の作成

agent/lambda/create_targets.py にツールスキーマを追加し、boto3 で Target を作成します:

client.create_gateway_target(
gatewayIdentifier=gw_id,
targetConfiguration={
'mcp': {'lambda': {
'lambdaArn': arn,
'toolSchema': {'inlinePayload': tools} # {name, description, inputSchema}
}}
},
credentialProviderConfigurations=[
{'credentialProviderType': 'GATEWAY_IAM_ROLE'} # 必須
]
)

Step 3: 自動発見

新しいツールが追加されると、Agent が list_tools で自動的に発見します。Docker の再ビルドは agent.py 自体を修正した場合にのみ必要です。

クロスアカウント対応

create_targets.py がすべてのツールに target_account_id パラメータを注入します。Lambda で cross_account.pyget_client() を使用すると、STS AssumeRole で別のアカウントのリソースにアクセスできます(対象がホストであれば self-assume なしで実行ロールを直接使用)。

Lambda ツール関数はどのような構造ですか?

すべてのツール Lambda は同一の MCP ハンドラーパターンに従います:

# 共通パターン(例: agent/lambda/aws_cost_mcp.py)
def lambda_handler(event, context):
# 1. イベントのパース + ツールルーティング
params = event if isinstance(event, dict) else json.loads(event)
t = params.get("tool_name", "")
args = params.get("arguments", params)

# 2. クロスアカウント対応(対象==ホストなら role_arn=None)
target_account_id = args.pop('target_account_id', None)
role_arn = get_role_arn(target_account_id) if target_account_id else None

# 3. ツールごとの分岐
if t == "get_cost_and_usage":
ce = get_client('ce', 'us-east-1', role_arn)
resp = ce.get_cost_and_usage(...)
return ok(resp)
else:
return err("Unknown tool")

共有モジュール:cross_account.py

クロスアカウントアクセスのための STS AssumeRole ヘルパーです。認証情報を 50 分キャッシングして繰り返し呼び出しを最適化し、対象がホストアカウントと同じであれば None を返して self-assume を防止します。

ルール

  • すべての Lambda は読み取り専用(到達性経路の作成など一部例外あり)
  • VPC Lambda(Istio、Steampipe)は psycopg2 の代わりに pg8000 を使用
  • ツールスキーマ形式:{name, description, inputSchema: {type, properties, required}}

Code Interpreter や Memory の名前にハイフンを使ってはいけない理由は?

AgentCore API のネーミング規則の制約のためです — 名前にはアンダースコアのみが許可されます。

影響を受けるリソース

リソース誤った例正しい例
Code Interpreterawsops-code-interpreterawsops_code_interpreter
Memory Storeawsops-memoryawsops_memory

症状

ハイフンを含む名前で作成すると ValidationException が発生するか、作成はできても呼び出し時に失敗することがあり、エラーメッセージが不明瞭な場合があります。

Memory Store の追加制約

  • eventExpiryDuration:最大 365 日
  • 期限切れのイベントは自動削除

AWS が付与する -XXXXX suffix は自動生成部分であり、ネーミング制約はユーザーが指定する名前部分(awsops_code_interpreterawsops_memory)にのみ適用されます。

AI の会話履歴はどこに保存され、ユーザーごとにどのように分離されますか?

会話履歴は Aurora(PostgreSQL 17)に永続化されます。レガシーのローカル JSON ファイル方式ではありません。

動作

項目内容
ストレージAurora Serverless v2(PG 17)、node-pg プール(web/lib/db.ts
ユーザー識別Cognito JWT の sub
UIClaude アプリスタイルのサイドバー — /assistant フルページとリサイズ可能なドロワーが同一履歴を共有
レンダリングストリーミング + マークダウン

認証フロー

  1. Lambda@Edge が CloudFront で JWT を RS256 JWKS 署名検証
  2. 検証を通過したリクエストが ECS Fargate の Web に到達
  3. BFF が JWT payload の sub をユーザー識別子として使用
  4. 未認証リクエストは BFF が 401 で拒否します(fail-closed)— 識別子は常に検証済みの Cognito sub です

AgentCore Runtime の状態はどのようにモニタリングしますか?

Web BFF が Runtime / Gateway / Code Interpreter の状態を照会します。SSM から識別子を読み取った後、AgentCore API で状態を取得します。

Runtime の状態

状態意味対処
READY正常稼働-
CREATING初回作成中数分待機
UPDATING更新中(Docker イメージ変更など)数分待機
FAILEDエラー — コンテナ起動失敗Docker イメージ(arm64)/IAM Role/ネットワークを確認

アシスタントページ

AI アシスタントは /assistant(フルページ)と、どこからでも開けるリサイズ可能なドロワーで使用し、両者は同一の Aurora 会話履歴を共有します。

ルーティングはハイブリッド(ADR-038)

質問は正規表現 fast-path + Haiku 4.5 分類器 + プロンプトキャッシングで適切なセクションエージェントにルーティングされます(LIVE、キャッシュヒット ~59%)。レガシーの固定マルチルート Sonnet レジストリではありません。