[小ネタ] Amazon Bedrock AgentCore Memory がリソースベースポリシーに対応していたので試してみた

[小ネタ] Amazon Bedrock AgentCore Memory がリソースベースポリシーに対応していたので試してみた

2026.03.27

はじめに

こんにちは、スーパーマーケットが大好きなコンサルティング部の神野(じんの)です。

Amazon Bedrock AgentCore Memory のコンソールを眺めていたところ、リソースベースポリシーが追加されていることに気づきました。いつの間に。。。

CleanShot 2026-03-26 at 22.57.33@2x

以前は Agent Runtime と Gateway のみだったはずなのですが、いつの間にか Memory も対象になっていたようです。公式ドキュメントも更新されていました。

https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/resource-based-policies.html

  • Memory - Control access to memory operations

今回は、実際に Memory にリソースベースポリシーを設定して、Runtime のサービスロール以外からのアクセスが拒否されるか検証してみました!

前提

環境

  • Python 3.12
  • bedrock-agentcore 1.4.7
  • bedrock-agentcore-starter-toolkit 0.3.3
  • strands-agents 1.33.0
  • strands-agents-tools 0.2.23
  • リージョン: us-east-1

事前準備

Starter Toolkit と依存パッケージをインストールしておきます。

インストールコマンド
uv init
uv add bedrock-agentcore-starter-toolkit strands-agents strands-agents-tools bedrock-agentcore

やりたいこと

AgentCore Runtime 上で動くエージェントだけが Memory にアクセスでき、開発者が直接 API を叩いてもアクセスできない、という構成を作ります。

CleanShot 2026-03-26 at 23.50.08@2x

エージェントのデプロイ

今回は Strands Agents で AI エージェントを作成します。記憶機能を使えるシンプルな実装です。

Starter Toolkit を使って、Memory を有効化したエージェントを Runtime にデプロイします。簡単に AgentCore Memory が使える AgentCoreMemorySessionManager の詳細は下記記事で紹介しているので、ここではコードだけ載せます。

Starter Toolkit 経由で Memory を設定すると、環境変数 BEDROCK_AGENTCORE_MEMORY_ID に Memory ID が設定されるのでそれを使用します。

https://dev.classmethod.jp/articles/strands-agents-agentcore-memory-session-manager/

agent.py
import os
from bedrock_agentcore.runtime import BedrockAgentCoreApp
from bedrock_agentcore.memory.integrations.strands.config import AgentCoreMemoryConfig
from bedrock_agentcore.memory.integrations.strands.session_manager import AgentCoreMemorySessionManager
from strands import Agent
from strands.models.bedrock import BedrockModel

app = BedrockAgentCoreApp()

MEMORY_ID = os.environ.get("BEDROCK_AGENTCORE_MEMORY_ID")

@app.entrypoint
def invoke(payload, context):
    config = AgentCoreMemoryConfig(
        memory_id=MEMORY_ID,
        session_id=context.session_id or "default",
        actor_id=payload.get("actorId", "user"),
    )
    session_manager = AgentCoreMemorySessionManager(
        agentcore_memory_config=config, region_name="us-east-1"
    )
    agent = Agent(
        model=BedrockModel(model_id="us.anthropic.claude-sonnet-4-5-20250929-v1:0", region_name="us-east-1"),
        system_prompt="あなたは親切なアシスタントです。",
        session_manager=session_manager,
    )
    response = agent(payload.get("prompt", "こんにちは"))
    return {"response": str(response)}

if __name__ == "__main__":
    app.run()

agentcore configure はデフォルトの設定で Memory を有効化し、agentcore deploy でデプロイします。

デプロイ
uv run agentcore configure --entrypoint agent.py
# デフォルトの設定で進めていく
# Memory だけは有効化する
Memory Configuration
Tip: Use --disable-memory flag to skip memory entirely

Existing memory resources found:
  1. xxx
     ID: xxx

Options:
 Enter a number to use existing memory
 Press Enter to create new memory
 Type 's' to skip memory setup
Your choice:
 Short-term memory will be enabled (default)
 Stores conversations within sessions
 Provides immediate context recall

# 設定が完了したらデプロイ
uv run agentcore deploy

デプロイが完了したら、コンソール上からエージェントのサービスロールのARNを確認して控えておきます。
最新バージョンの詳細から確認可能です。

CleanShot 2026-03-27 at 00.37.31@2x

CleanShot 2026-03-27 at 00.38.00@2x

自動で作成されたロール名なので長いですね。

リソースベースポリシーの設定

Memory にリソースベースポリシーを設定していきます。以下のポリシーは、サービスロール以外からの一定の Memory 操作(記憶一覧を取得、書き込みするなど)を拒否します。

policy.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DenyNonAgentRuntimeAccess",
      "Effect": "Deny",
      "Principal": "*",
      "Action": [
        "bedrock-agentcore:CreateEvent",
        "bedrock-agentcore:GetEvent",
        "bedrock-agentcore:ListEvents",
        "bedrock-agentcore:DeleteEvent",
        "bedrock-agentcore:RetrieveMemoryRecords",
        "bedrock-agentcore:ListMemoryRecords",
        "bedrock-agentcore:GetMemoryRecord",
        "bedrock-agentcore:DeleteMemoryRecord"
      ],
      "Resource": "arn:aws:bedrock-agentcore:us-east-1:<アカウントID>:memory/<メモリID>",
      "Condition": {
        "StringNotEquals": {
          "aws:PrincipalArn": "arn:aws:iam::<アカウントID>:role/<サービスロール名>"
        }
      }
    }
  ]
}

Effect: DenyCondition: StringNotEquals の組み合わせで、指定したロール ARN 以外のプリンシパルからのアクセスを拒否とします。

このポリシーを Starter Toolkit で自動生成された Memory に反映します。コンソール上で対象の Memory の画面を開き、Resource-based policy の Add ボタンを押します。

CleanShot 2026-03-27 at 00.04.38@2x

先ほどのポリシーを記載して保存します。

CleanShot 2026-03-27 at 00.44.13@2x

下記のように追加されていればOKです!

CleanShot 2026-03-27 at 00.43.36@2x

動作確認

直接 API アクセス

まず、私の IAM 認証情報から Memory に直接アクセスしてみます。
Memory ID はコンソール上から取得した値に書き換えます。

test_access.py
import boto3

REGION = "us-east-1"
MEMORY_ID = "<メモリID>"

client = boto3.client("bedrock-agentcore", region_name=REGION)

try:
    response = client.list_events(
        memoryId=MEMORY_ID,
        actorId="test-actor",
        sessionId="test-session",
    )
    events = response.get("events", [])
    print(f"アクセス成功: {len(events)} 件のイベントを取得")
except client.exceptions.AccessDeniedException:
    print("アクセス拒否されました")
except Exception as e:
    print(f"エラー: {type(e).__name__}: {e}")

では実行してみます!
CleanShot 2026-03-27 at 00.13.41@2x

実行結果
uv run test_access.py
アクセス拒否されました

アクセスが意図通り拒否されました!リソースベースポリシーの Deny が効いていますね。現在の IAM ユーザーはサービスロールではないため、StringNotEquals 条件に一致して Deny が適用されています。

Runtime 経由のアクセス

次に、Starter Toolkit でデプロイしたエージェントを Runtime 経由で呼び出してみます。エージェントはデプロイ時に指定したサービスロールで動作するため、リソースベースポリシーの Deny 条件に該当しません。

エージェントの呼び出し
uv run agentcore invoke '{"prompt": "こんにちは、京都旅行について教えてください。"}' --session-id testsess-ion0-0000-0000-000000000006
実行結果
Response:
こんにちは!京都旅行についてお手伝いさせていただきます。

京都は日本を代表する観光地で、見どころがたくさんあります。
具体的にどのような情報をお探しですか?

主な観光スポット:
- 清水寺、金閣寺、銀閣寺などの歴史的寺社
- 伏見稲荷大社の千本鳥居
- 嵐山の竹林や渡月橋
- 祇園の古い街並み

季節のおすすめ:
- 春:桜の名所(哲学の道、円山公園など)
- 秋:紅葉(永観堂、東福寺など)
- 夏:祇園祭(7月)
- 冬:雪景色の金閣寺

その他:
- 京料理や抹茶スイーツ
- 着物レンタル体験
- 宿泊施設(旅館、ホテル)

いつ頃の旅行を予定されていますか?また、特に興味のあること
はありますか?より具体的なアドバイスをさせていただきます!

問題なく応答が返ってきましたね!!Runtime のサービスロール経由では Memory の読み書きが正常に動作しています。(権限がなければこの時点でエラーが発生するので)

続けて同じセッション ID でもう一度呼び出して、会話の継続も確認してみます。

セッション継続の確認
uv run agentcore invoke '{"prompt": "さっき何について話しましたっけ?"}' --session-id testsess-ion0-0000-0000-000000000006
実行結果
Response:
京都旅行についてお話ししました!

私が京都の主な観光スポット(清水寺、金閣寺、伏見稲荷大社、
嵐山など)、季節ごとのおすすめ、京料理や着物レンタル体験な
どについて情報を提供させていただきました。

そして、あなたの旅行の時期や特に興味のあることについて質問
させていただいたところです。

何か具体的に知りたいことはありますか?

開発者の直接 API アクセスは Deny で弾かれるのに、Runtime 経由ではエージェントが Memory を正常に使える状態になり、リソースベースポリシーが意図した通りに機能していることが確認できました!

おわりに

Memory もリソースベースポリシーに対応しましたね。エージェントが扱うユーザーの記憶には機微な情報が含まれることもあるので、こういったアクセス制御の仕組みは活用の余地がありそうですね。

本記事が少しでも参考になりましたら幸いです。最後までご覧いただきありがとうございましたー!

補足: 公式ドキュメントより

Memory で制限可能なアクション一覧

公式ドキュメントでは、Memory に対して 18 のアクションがリソースベースポリシーの対象として記載されています。今回の検証では全体の操作の一部のみを Deny 対象としましたが、実際にはもっと多くのアクションを制御できます。

https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/resource-based-policies.html#resource-based-policies-supported-actions

アクション 説明
GetMemory Memory リソースの取得
UpdateMemory Memory リソースの更新
DeleteMemory Memory リソースの削除
CreateEvent イベント作成(会話の書き込み)
GetEvent イベント取得
DeleteEvent イベント削除
ListEvents イベント一覧
ListActors アクター一覧
ListSessions セッション一覧
GetMemoryRecord メモリレコード取得(メモリレコード = 長期記憶)
ListMemoryRecords メモリレコード一覧
RetrieveMemoryRecords メモリレコード検索
DeleteMemoryRecord メモリレコード削除
BatchCreateMemoryRecords メモリレコード一括作成
BatchUpdateMemoryRecords メモリレコード一括更新
BatchDeleteMemoryRecords メモリレコード一括削除
StartMemoryExtractionJob 抽出ジョブ開始
ListMemoryExtractionJobs 抽出ジョブ一覧

この記事をシェアする

FacebookHatena blogX

関連記事