

# クロスアカウントメモリアクセス
<a name="memory-cross-account-access"></a>

Amazon Bedrock AgentCore Memory はクロスアカウントアクセスをサポートしているため、メモリリソースと消費エージェントが複数のアカウントにまたがるマルチ AWS アカウントアーキテクチャを構築できます。クロスアカウントアクセスには、次の 2 つのシナリオがあります。
+  **別のアカウントからのデータプレーンオペレーション** — アカウント B の プリンシパルは、アカウント A のメモリリソースに対してメモリデータプレーン APIs を呼び出す (イベントの作成、レコードの書き込み、レコードの取得) ことができます。これは、リソースベースのポリシーをメモリリソースにアタッチすることによって設定されます。

  大まかなステップ:

  1. リソースベースのポリシーをアタッチして、クロスアカウントアクセスを許可するようにメモリリソースを設定します。

  1. アカウント B からのデータプレーン API コールのメモリ ARN を参照します。
+  **別のアカウントの配信先** — アカウント A のメモリリソースは、アカウント B に存在する Amazon S3 バケット、Amazon SNS トピック、および Amazon Kinesis Data Streams にペイロードとストリームイベントを配信できます。これは、ターゲットリソースのメモリ実行ロールとリソースポリシーを通じてメモリ作成時に設定されます。

  大まかなステップ:

  1. ターゲットリソースにアクセスするためのアクセス許可を持つメモリ実行ロールをアカウント A に作成します。

  1. リソースベースのポリシーをアカウント B の送信先リソースに追加して、実行ロールを許可します。

  1. 実行ロールとクロスアカウントリソース ARNsにメモリを作成します。

**Topics**
+ [前提条件](#memory-cross-account-access-prerequisites)
+ [クロスアカウントデータプレーンアクセス](#memory-cross-account-access-data-plane)
+ [クロスアカウント配信先](#memory-cross-account-access-delivery-destinations)
+ [ベストプラクティス](#memory-cross-account-access-best-practices)

## 前提条件
<a name="memory-cross-account-access-prerequisites"></a>

クロスアカウントメモリアクセスを設定する前に、以下があることを確認します。
+ リソース所有者アカウント (アカウント A) で作成されたメモリリソース
+ メモリリソースの完全な ARN (例: `arn:aws:bedrock-agentcore:us-east-1:<account-id>:memory/<memory-id>`)
+ データプレーンアクセスの場合: 必要な`bedrock-agentcore`アクションを許可するアイデンティティベースのアクセス許可を持つアカウント B の IAM ロールまたはユーザー
+ 配信先の場合: アカウント B で作成されたターゲット S3 バケット、SNS トピック、または Kinesis Data Stream

## クロスアカウントデータプレーンアクセス
<a name="memory-cross-account-access-data-plane"></a>

別のアカウントのプリンシパルに、メモリリソースに対してメモリデータプレーン APIsを直接呼び出すことを許可できます。これは、 `PutResourcePolicy` API を使用してリソースベースのポリシーをメモリにアタッチすることによって設定されます。リソースベースのポリシーの詳細については、[「Amazon Bedrock AgentCore のリソースベースのポリシー](resource-based-policies.md)」を参照してください。

### 仕組み
<a name="memory-cross-account-access-data-plane-how-it-works"></a>

1. アカウント A はメモリリソースを作成します。

1. アカウント A は API を使用してリソースベースのポリシーをメモリリソースにアタッチし`PutResourcePolicy`、アカウント B のプリンシパルに特定のアクションを付与します。

1. アカウント B のプリンシパルはメモリデータプレーン APIs呼び出し、アカウント A のメモリリソースの完全な ARN を として指定します`memory-id`。

1.  AWS は、メモリ上のリソースベースのポリシーと、アカウント B プリンシパルにアタッチされたアイデンティティベースのポリシーの両方を評価します。両方が アクションを許可する場合 (ポリシーが明示的に拒否しない場合）、リクエストは成功します。

### サポートされているアクション
<a name="memory-cross-account-access-supported-actions"></a>

任意のメモリデータプレーンアクションにクロスアカウントアクセスを付与できます。次の表に、使用可能なアクションを示します。


| [アクション] | 説明 | 
| --- | --- | 
|  `bedrock-agentcore:CreateEvent`  | 短期メモリイベントを作成する | 
|  `bedrock-agentcore:GetEvent`  | 特定のイベントを取得する | 
|  `bedrock-agentcore:DeleteEvent`  | 特定のイベントを削除する | 
|  `bedrock-agentcore:ListEvents`  | セッション内のイベントを一覧表示する | 
|  `bedrock-agentcore:ListActors`  | メモリ内のアクターを一覧表示する | 
|  `bedrock-agentcore:ListSessions`  | アクターのセッションを一覧表示する | 
|  `bedrock-agentcore:GetMemoryRecord`  | 特定のメモリレコードを取得する | 
|  `bedrock-agentcore:ListMemoryRecords`  | 名前空間のメモリレコードを一覧表示する | 
|  `bedrock-agentcore:RetrieveMemoryRecords`  | メモリレコードを意味的に検索する | 
|  `bedrock-agentcore:DeleteMemoryRecord`  | 特定のメモリレコードを削除する | 
|  `bedrock-agentcore:BatchCreateMemoryRecords`  | 複数のメモリレコードを作成する | 
|  `bedrock-agentcore:BatchUpdateMemoryRecords`  | 複数のメモリレコードを更新する | 
|  `bedrock-agentcore:BatchDeleteMemoryRecords`  | 複数のメモリレコードを削除する | 
|  `bedrock-agentcore:ListMemoryExtractionJobs`  | メモリの抽出ジョブを一覧表示する | 
|  `bedrock-agentcore:StartMemoryExtractionJobs`  | 失敗した抽出ジョブを再起動する | 

### リソースベースのポリシーをメモリにアタッチする
<a name="memory-cross-account-access-attach-policy"></a>

#### 別のアカウントに 1 つのアクションを付与する
<a name="memory-cross-account-access-grant-single-action"></a>

次の例では、アカウント A (`<account-B-id>`) のメモリリソース`BatchCreateMemoryRecords`で を呼び出すアクセス許可をアカウント B () に付与します`<account-A-id>`。

```
aws bedrock-agentcore-control put-resource-policy \
    --region us-east-1 \
    --resource-arn "arn:aws:bedrock-agentcore:us-east-1:<account-A-id>:memory/<memory-id>" \
    --policy '{
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "AllowCrossAccountBatchCreate",
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::<account-B-id>:root"
                },
                "Action": "bedrock-agentcore:BatchCreateMemoryRecords",
                "Resource": "arn:aws:bedrock-agentcore:us-east-1:<account-A-id>:memory/<memory-id>"
            }
        ]
    }'
```

#### 別のアカウントに複数のアクションを付与する
<a name="memory-cross-account-access-grant-multiple-actions"></a>

次の例では、メモリレコードとイベントへの完全な読み取りおよび書き込みアクセスをアカウント B に付与します。

```
aws bedrock-agentcore-control put-resource-policy \
    --region us-east-1 \
    --resource-arn "arn:aws:bedrock-agentcore:us-east-1:<account-A-id>:memory/<memory-id>" \
    --policy '{
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "AllowCrossAccountMemoryReadWrite",
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::<account-B-id>:root"
                },
                "Action": [
                    "bedrock-agentcore:CreateEvent",
                    "bedrock-agentcore:GetEvent",
                    "bedrock-agentcore:ListEvents",
                    "bedrock-agentcore:ListActors",
                    "bedrock-agentcore:ListSessions",
                    "bedrock-agentcore:BatchCreateMemoryRecords",
                    "bedrock-agentcore:BatchUpdateMemoryRecords",
                    "bedrock-agentcore:BatchDeleteMemoryRecords",
                    "bedrock-agentcore:ListMemoryRecords",
                    "bedrock-agentcore:RetrieveMemoryRecords",
                    "bedrock-agentcore:GetMemoryRecord",
                    "bedrock-agentcore:DeleteMemoryRecord"
                ],
                "Resource": "arn:aws:bedrock-agentcore:us-east-1:<account-A-id>:memory/<memory-id>"
            }
        ]
    }'
```

#### 特定の IAM ロールへのアクセスを許可する
<a name="memory-cross-account-access-grant-specific-role"></a>

最小特権の原則に従うには、アカウント全体ではなく、特定のロールへのアクセス権を付与します。

```
aws bedrock-agentcore-control put-resource-policy \
    --region us-east-1 \
    --resource-arn "arn:aws:bedrock-agentcore:us-east-1:<account-A-id>:memory/<memory-id>" \
    --policy '{
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "AllowSpecificRoleReadAccess",
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::<account-B-id>:role/AgentMemoryReaderRole"
                },
                "Action": [
                    "bedrock-agentcore:RetrieveMemoryRecords",
                    "bedrock-agentcore:ListMemoryRecords",
                    "bedrock-agentcore:GetMemoryRecord"
                ],
                "Resource": "arn:aws:bedrock-agentcore:us-east-1:<account-A-id>:memory/<memory-id>"
            }
        ]
    }'
```

### リソースベースのポリシーを削除する
<a name="memory-cross-account-access-remove-policy"></a>

クロスアカウントデータプレーンアクセスを取り消すには、リソースベースのポリシーを削除します。

```
aws bedrock-agentcore-control delete-resource-policy \
    --region us-east-1 \
    --resource-arn "arn:aws:bedrock-agentcore:us-east-1:<account-A-id>:memory/<memory-id>"
```

ポリシーを削除すると、それ以降のクロスアカウントリクエストは を返します`AccessDeniedException`。

### アカウント B からデータプレーン APIs呼び出す
<a name="memory-cross-account-access-calling-from-account-b"></a>

リソースベースのポリシーがアタッチされると、アカウント B のプリンシパルは、フルメモリ ARN を として指定することで、データプレーン APIs を呼び出すことができます`memory-id`。

アカウント B からメモリレコードを作成します。

```
aws bedrock-agentcore batch-create-memory-records \
    --region us-east-1 \
    --memory-id "arn:aws:bedrock-agentcore:us-east-1:<account-A-id>:memory/<memory-id>" \
    --records '[
      {
        "requestIdentifier": "rec-001",
        "content": {"text": "User prefers morning meeting times before 10 AM"},
        "namespaces": ["preferences/user-123"],
        "timestamp": "1729525989"
      }
    ]'
```

アカウント B からメモリレコードを取得します。

```
aws bedrock-agentcore retrieve-memory-records \
    --region us-east-1 \
    --memory-id "arn:aws:bedrock-agentcore:us-east-1:<account-A-id>:memory/<memory-id>" \
    --namespace "preferences/user-123" \
    --search-criteria '{"searchQuery": "meeting preferences"}' \
    --max-results 10
```

アカウント B からイベントを作成します。

```
aws bedrock-agentcore create-event \
    --region us-east-1 \
    --memory-id "arn:aws:bedrock-agentcore:us-east-1:<account-A-id>:memory/<memory-id>" \
    --actor-id "agent-in-account-b" \
    --session-id "cross-account-session-1" \
    --event-timestamp "$(date -u +"%Y-%m-%dT%H:%M:%S.%3NZ")" \
    --payload '[
      {
        "conversational": {
          "content": {"text": "Schedule my standup for 9 AM tomorrow"},
          "role": "USER"
        }
      }
    ]'
```

## クロスアカウント配信先
<a name="memory-cross-account-access-delivery-destinations"></a>

カスタム (セルフマネージド) 戦略またはストリーム配信設定でメモリを作成すると、Amazon Bedrock AgentCore はメモリ実行ロールを使用してペイロードを送信先リソースに配信します。これらのリソースが別のアカウントに存在する場合は、両側を設定する必要があります。アカウント A の実行ロールにはリソースにアクセスするためのアクセス許可が必要であり、アカウント B のリソースにはアカウント A からのアクセスを許可するポリシーが必要です。

### 仕組み
<a name="memory-cross-account-access-delivery-how-it-works"></a>

1. アカウント A のメモリ実行ロールを許可するリソースベースのポリシーを使用して、アカウント B に宛先リソース (S3 バケット、SNS トピック、または Kinesis Data Stream) を作成します。

1. Amazon Bedrock AgentCore の信頼ポリシーと、アカウント B のクロスアカウントリソースへのアクセスを許可するアクセス許可ポリシーを使用して、アカウント A にメモリ実行ロールを作成します。

1. アカウント A でメモリを作成し、実行ロールとクロスアカウントリソース ARNs。

1. Amazon Bedrock AgentCore は実行ロールを引き受け、それを使用してペイロードを配信するか、アカウント B のリソースにイベントをストリーミングします。

### メモリ実行ロールを設定する
<a name="memory-cross-account-access-execution-role"></a>

アカウント A にメモリ実行ロールを作成します。このロールには、Amazon Bedrock AgentCore が引き受けることを許可する信頼ポリシーと、アカウント B のターゲットリソースへのアクセスを許可するアクセス許可ポリシーが必要です。

信頼ポリシー:

```
{
"Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "bedrock-agentcore.amazonaws.com"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "ArnLike": {
          "aws:SourceArn": "arn:aws:bedrock-agentcore:<region>:<account-A-id>:memory/*"
        }
      }
    }
  ]
}
```

アクセス許可ポリシー (使用しているリソースに関連するステートメントのみを含む):

```
{
"Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowS3Access",
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject"
      ],
      "Resource": "arn:aws:s3:::<bucket-name-in-account-B>/*"
    },
    {
      "Sid": "AllowSNSPublish",
      "Effect": "Allow",
      "Action": "sns:Publish",
      "Resource": "arn:aws:sns:<region>:<account-B-id>:<topic-name>"
    },
    {
      "Sid": "AllowKinesisAccess",
      "Effect": "Allow",
      "Action": [
        "kinesis:PutRecords",
        "kinesis:DescribeStream"
      ],
      "Resource": "arn:aws:kinesis:<region>:<account-B-id>:stream/<stream-name>"
    }
  ]
}
```

### アカウント B で S3 バケットポリシーを設定する
<a name="memory-cross-account-access-s3-policy"></a>

アカウント B の S3 バケットに次のリソースベースのポリシーを追加して、アカウント A のメモリ実行ロールがペイロードを配信できるようにします。

```
{
"Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowMemoryExecutionRoleAccess",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<account-A-id>:role/<memory-execution-role-name>"
      },
      "Action": [
        "s3:PutObject",
        "s3:GetObject"
      ],
      "Resource": "arn:aws:s3:::<bucket-name>/*"
    }
  ]
}
```

### アカウント B で SNS トピックポリシーを設定する
<a name="memory-cross-account-access-sns-policy"></a>

アカウント B の SNS トピックに次のリソースベースのポリシーを追加して、アカウント A のメモリ実行ロールが通知を発行できるようにします。

```
{
"Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowMemoryExecutionRolePublish",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<account-A-id>:role/<memory-execution-role-name>"
      },
      "Action": "sns:Publish",
      "Resource": "arn:aws:sns:<region>:<account-B-id>:<topic-name>"
    }
  ]
}
```

### アカウント B で Kinesis Data Stream ポリシーを設定する
<a name="memory-cross-account-access-kinesis-policy"></a>

次のリソースベースのポリシーをアカウント B の Kinesis Data Stream に追加して、アカウント A のメモリ実行ロールがイベントをストリーミングできるようにします。

```
{
"Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowMemoryExecutionRolePutRecords",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<account-A-id>:role/<memory-execution-role-name>"
      },
      "Action": [
        "kinesis:PutRecords",
        "kinesis:DescribeStream"
      ],
      "Resource": "arn:aws:kinesis:<region>:<account-B-id>:stream/<stream-name>"
    }
  ]
}
```

### クロスアカウント S3 および SNS でメモリを作成する
<a name="memory-cross-account-access-create-memory-s3-sns"></a>

実行ロールとリソースポリシーを設定したら、アカウント B のクロスアカウントリソースを参照するメモリをアカウント A に作成します。

```
aws bedrock-agentcore-control create-memory \
    --region us-east-1 \
    --name "cross-account-memory" \
    --description "Memory with cross-account S3 and SNS delivery" \
    --event-expiry-duration 30 \
    --memory-execution-role-arn "arn:aws:iam::<account-A-id>:role/MemoryCrossAccountRole" \
    --memory-strategies '[
      {
        "customMemoryStrategy": {
          "name": "cross_account_strategy",
          "configuration": {
            "selfManagedConfiguration": {
              "triggerConditions": [
                {"messageBasedTrigger": {"messageCount": 5}}
              ],
              "invocationConfiguration": {
                "topicArn": "arn:aws:sns:us-east-1:<account-B-id>:memory-notifications",
                "payloadDeliveryBucketName": "<bucket-name>"
              },
              "historicalContextWindowSize": 10
            }
          }
        }
      }
    ]'
```

### クロスアカウント Kinesis ストリーミングでメモリを作成する
<a name="memory-cross-account-access-create-memory-kinesis"></a>

```
aws bedrock-agentcore-control create-memory \
    --region us-east-1 \
    --name "cross-account-streaming-memory" \
    --description "Memory with cross-account Kinesis streaming" \
    --event-expiry-duration 30 \
    --memory-execution-role-arn "arn:aws:iam::<account-A-id>:role/MemoryCrossAccountRole" \
    --stream-delivery-resources '{
      "resources": [
        {
          "kinesis": {
            "dataStreamArn": "arn:aws:kinesis:us-east-1:<account-B-id>:stream/memory-record-stream",
            "contentConfigurations": [
              {
                "type": "MEMORY_RECORDS",
                "level": "FULL_CONTENT"
              }
            ]
          }
        }
      ]
    }'
```

## ベストプラクティス
<a name="memory-cross-account-access-best-practices"></a>
+  **最小権限の付与** — クロスアカウントプリンシパルに必要な特定のアクション のみを付与します。
+  **特定のプリンシパルを使用する —** ブラスト半径を制限するために、アカウントルート全体ではなく、特定の IAM ロールへのアクセス を許可します。
+  **クロスアカウントアクセスの監査** — AWS CloudTrail  を使用して、メモリリソースへのクロスアカウント API コールをモニタリングします。
+  **読み取りおよび書き込みアクセスの分離** — 読み取り専用コンシューマーと読み取り/書き込みプロデューサー用に個別のポリシーステートメントを作成します。
+  **ポリシーを削除する前に検証** する — リソースベースのポリシーを削除する 前に、他のアカウントのアクティブなワークロードがアクセスに依存していないことを確認します。