![[小ネタ] Amazon Bedrock AgentCore Memory がリソースベースポリシーに対応していたので試してみた](https://images.ctfassets.net/ct0aopd36mqt/7M0d5bjsd0K4Et30cVFvB6/5b2095750cc8bf73f04f63ed0d4b3546/AgentCore2.png?w=3840&fm=webp)
[小ネタ] Amazon Bedrock AgentCore Memory がリソースベースポリシーに対応していたので試してみた
はじめに
こんにちは、スーパーマーケットが大好きなコンサルティング部の神野(じんの)です。
Amazon Bedrock AgentCore Memory のコンソールを眺めていたところ、リソースベースポリシーが追加されていることに気づきました。いつの間に。。。

以前は Agent Runtime と Gateway のみだったはずなのですが、いつの間にか Memory も対象になっていたようです。公式ドキュメントも更新されていました。
- 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 を叩いてもアクセスできない、という構成を作ります。

エージェントのデプロイ
今回は Strands Agents で AI エージェントを作成します。記憶機能を使えるシンプルな実装です。
Starter Toolkit を使って、Memory を有効化したエージェントを Runtime にデプロイします。簡単に AgentCore Memory が使える AgentCoreMemorySessionManager の詳細は下記記事で紹介しているので、ここではコードだけ載せます。
Starter Toolkit 経由で Memory を設定すると、環境変数 BEDROCK_AGENTCORE_MEMORY_ID に Memory ID が設定されるのでそれを使用します。
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を確認して控えておきます。
最新バージョンの詳細から確認可能です。


自動で作成されたロール名なので長いですね。
リソースベースポリシーの設定
Memory にリソースベースポリシーを設定していきます。以下のポリシーは、サービスロール以外からの一定の Memory 操作(記憶一覧を取得、書き込みするなど)を拒否します。
{
"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: Deny と Condition: StringNotEquals の組み合わせで、指定したロール ARN 以外のプリンシパルからのアクセスを拒否とします。
このポリシーを Starter Toolkit で自動生成された Memory に反映します。コンソール上で対象の Memory の画面を開き、Resource-based policy の Add ボタンを押します。

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

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

動作確認
直接 API アクセス
まず、私の IAM 認証情報から Memory に直接アクセスしてみます。
Memory ID はコンソール上から取得した値に書き換えます。
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}")
では実行してみます!

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 対象としましたが、実際にはもっと多くのアクションを制御できます。
| アクション | 説明 |
|---|---|
| GetMemory | Memory リソースの取得 |
| UpdateMemory | Memory リソースの更新 |
| DeleteMemory | Memory リソースの削除 |
| CreateEvent | イベント作成(会話の書き込み) |
| GetEvent | イベント取得 |
| DeleteEvent | イベント削除 |
| ListEvents | イベント一覧 |
| ListActors | アクター一覧 |
| ListSessions | セッション一覧 |
| GetMemoryRecord | メモリレコード取得(メモリレコード = 長期記憶) |
| ListMemoryRecords | メモリレコード一覧 |
| RetrieveMemoryRecords | メモリレコード検索 |
| DeleteMemoryRecord | メモリレコード削除 |
| BatchCreateMemoryRecords | メモリレコード一括作成 |
| BatchUpdateMemoryRecords | メモリレコード一括更新 |
| BatchDeleteMemoryRecords | メモリレコード一括削除 |
| StartMemoryExtractionJob | 抽出ジョブ開始 |
| ListMemoryExtractionJobs | 抽出ジョブ一覧 |









