Amazon Bedrock Managed Knowledge Base に対して IngestKnowledgeBaseDocuments API は使えるのか試してみた

Amazon Bedrock Managed Knowledge Base に対して IngestKnowledgeBaseDocuments API は使えるのか試してみた

2026.07.03

はじめに

クラスメソッドの内田です。

Amazon Bedrock Knowledge Base に新しく追加された Managed Knowledge Base(以下 Managed KB)に対して、ドキュメント単位で直接インジェストする API IngestKnowledgeBaseDocumentsが使えるのかを、実機で確認しました。

S3 にファイルを置いて Lambda から逐次取り込むようなリアルタイム反映構成を Managed KB で組みたい人にとっては、ここが動くかどうかで設計が大きく変わります。公式ドキュメントに明示された記述が見つからなかったので、今回試してみました。

結論

動きます。

Managed KB(type=MANAGED, embeddingModelType=MANAGED)に対して IngestKnowledgeBaseDocuments で S3 オブジェクトを直接インジェストし、数秒で INDEXED に到達、retrieve でも引ける ことを確認しました。

処理の流れはシンプル:

API 呼び出しの本体もこれだけです(KB / DS 側の設定は事前に済んでいる前提):

aws bedrock-agent ingest-knowledge-base-documents \
  --knowledge-base-id <KB_ID> \
  --data-source-id <DS_ID> \
  --documents file://ingest-documents.json \
  --region ap-northeast-1
ingest-documents.json
[
  {
    "content": {
      "dataSourceType": "S3",
      "s3": {
        "s3Location": {
          "uri": "s3://<your-bucket>/direct-ingest/direct.md"
        }
      }
    }
  }
]

背景: なぜこの検証が必要か

通常の Bedrock Knowledge Base の取り込みは、StartIngestionJobデータソース全体をスキャンして差分取り込みする 方式です。これだと「S3 にファイルを置いた瞬間に KB に反映したい」ユースケースに対して、以下の課題があります:

  • 手動で同期ボタンを押す運用は現実的でない
  • EventBridge + Lambda で自動化しても、データソース全体をスキャンする方式は重い(並列実行に上限、ジョブ単位課金、反映まで数分)

そこで使いたいのが IngestKnowledgeBaseDocuments API です。これはドキュメント単位で直接インジェストする API で、S3 アップロードをトリガに 1 ファイルだけを即時取り込みできます:

Self-managed KB での事例は 神野さんの記事 に詳しく紹介されています。

一方、新しく出た Managed KB でこの API が動くか公式ドキュメントに明記がなく石川さんの記事 でも記載が見当たりませんでした。Managed KB は登場したばかりで、従来 API との互換性は実機で確認するしかない状態だったので、今回検証しました。

検証環境

項目
検証日 2026-06-29 〜 2026-07-01
リージョン ap-northeast-1(東京)
AWS CLI 2.35.11(後述の通り 2.34+ 必須)
Knowledge Base Managed(type=MANAGED, embeddingModelType=MANAGED
Data source S3 connector(MANAGED_KNOWLEDGE_BASE_CONNECTOR)、inclusionPrefixes: ["baseline/"]

S3 バケットには 2 つのサンプルを配置しました:

s3://<bucket>/
├── baseline/
│   └── baseline.md          ← StartIngestionJob で取り込む(ベースライン)
└── direct-ingest/
    └── direct.md            ← IngestKnowledgeBaseDocuments で取り込む(本題)

DS の inclusionPrefixes"baseline/" に絞った のは意図的な設計です。これにより:

  • baseline/baseline.md は DS 範囲内 → StartIngestionJob(Sync)で取り込まれる
  • direct-ingest/direct.md は DS 範囲外 → IngestKnowledgeBaseDocuments(本題)でのみ取り込める

という 2 経路を 1 つの KB で比較できるようにしています。「Direct Ingestion が DS の prefix 制約を無視するか」も同時に確認できる仕掛けです。

Managed KB とデータソースを作る

Managed KB を作成する

aws bedrock-agent create-knowledge-base \
  --name s3kb-walkthrough-managed-20260630 \
  --role-arn arn:aws:iam::<account-id>:role/<kb-role> \
  --knowledge-base-configuration '{
    "type": "MANAGED",
    "managedKnowledgeBaseConfiguration": {
      "embeddingModelType": "MANAGED"
    }
  }' \
  --region ap-northeast-1

ポイント:

  • type: "MANAGED" が新タイプ(従来の VECTOR とは別物)
  • embeddingModelType: "MANAGED" で埋め込みモデルも AWS 側に任せる
  • storageConfiguration は指定不要(Managed KB は AWS 側でベクトルストアを自動用意)

主なレスポンス:

{
  "knowledgeBase": {
    "knowledgeBaseId": "6WNUV7VE7I",
    "status": "CREATING",
    "knowledgeBaseConfiguration": {
      "type": "MANAGED",
      "managedKnowledgeBaseConfiguration": {
        "embeddingModelType": "MANAGED"
      }
    },
    "createdAt": "2026-06-30T06:24:47Z"
  }
}

status: CREATING で返り、約 30〜80 秒で ACTIVE に遷移します。get-knowledge-base でポーリングして状態遷移を追えます。

参考までに、コンソールから同じものを作ると以下のような画面になります。CLI で明示指定していない項目(画像抽出 ON / Max file size 500 MB / データ削除ポリシー Delete 等)は、コンソール上でもデフォルト値として反映されています:

create-managed-kb-form-full

データソースを作成する(S3 コネクタ)

Managed KB 専用の MANAGED_KNOWLEDGE_BASE_CONNECTOR 構造で作成します。self-managed KB とは JSON 構造が違うので注意です。

aws bedrock-agent create-data-source \
  --knowledge-base-id <KB_ID> \
  --name s3kb-walkthrough-ds-20260630 \
  --data-source-configuration file://ds-managed-s3.json \
  --region ap-northeast-1
ds-managed-s3.json
{
  "type": "MANAGED_KNOWLEDGE_BASE_CONNECTOR",
  "managedKnowledgeBaseConnectorConfiguration": {
    "connectorParameters": {
      "type": "S3",
      "version": "1",
      "connectionConfiguration": {
        "bucketName": "<your-bucket>",
        "bucketOwnerAccountId": "<account-id>"
      },
      "filterConfiguration": {
        "inclusionPrefixes": ["baseline/"]
      }
    }
  }
}

ポイント(Managed KB 特有の構造):

  • 外側の typeMANAGED_KNOWLEDGE_BASE_CONNECTOR 固定
  • 内側の connectorParameters.typeS3 を指定
  • bucketName を渡す(self-managed の bucketArn ではなく、バケット名そのもの)
  • bucketOwnerAccountId は同一アカウントでも必須(後述の「実装ではまった点」参照)
  • filterConfiguration.inclusionPrefixes で取り込む S3 prefix を指定

主なレスポンスは以下のとおり:

{
  "dataSource": {
    "dataSourceId": "V6DJBLFLQ2",
    "knowledgeBaseId": "6WNUV7VE7I",
    "status": "CREATING",
    "dataSourceConfiguration": {
      "type": "MANAGED_KNOWLEDGE_BASE_CONNECTOR",
      "managedKnowledgeBaseConnectorConfiguration": {
        "connectorParameters": {
          "type": "S3",
          "connectionConfiguration": { "bucketName": "...", "bucketOwnerAccountId": "..." },
          "filterConfiguration": {
            "inclusionPrefixes": ["baseline/"],
            "maxFileSizeInMegaBytes": "500"
          },
          "aclEnabled": false
        },
        "mediaExtractionConfiguration": {
          "imageExtractionConfiguration": {
            "imageExtractionStatus": "ENABLED"
          }
        }
      }
    },
    "dataDeletionPolicy": "DELETE"
  }
}

CLI で明示指定していない値(maxFileSizeInMegaBytes=500aclEnabled=falseimageExtractionStatus=ENABLEDdataDeletionPolicy=DELETE)が自動補完されて返ってきます。**画像抽出はデフォルトで ON ** です。

本題: Direct Ingestion を叩く

いよいよ本題です。IngestKnowledgeBaseDocuments が Managed KB で動くか、そして DS の inclusionPrefixes 範囲外のファイルも取り込めるか を確認します。ターゲットは direct-ingest/direct.md(DS の ["baseline/"] の外)。

CLI コマンド:

aws bedrock-agent ingest-knowledge-base-documents \
  --knowledge-base-id <KB_ID> \
  --data-source-id <DS_ID> \
  --documents file://ingest-documents.json \
  --region ap-northeast-1
ingest-documents.json
[
  {
    "content": {
      "dataSourceType": "S3",
      "s3": {
        "s3Location": {
          "uri": "s3://<your-bucket>/direct-ingest/direct.md"
        }
      }
    }
  }
]

主なレスポンス:

{
  "documentDetails": [
    {
      "dataSourceId": "V6DJBLFLQ2",
      "knowledgeBaseId": "6WNUV7VE7I",
      "status": "STARTING",
      "identifier": {
        "dataSourceType": "S3",
        "s3": {
          "uri": "s3://<your-bucket>/direct-ingest/direct.md"
        }
      },
      "updatedAt": "2026-06-30T06:39:19Z"
    }
  ]
}

API が受理し、STARTING で応答が返ってきましたinclusionPrefixes: ["baseline/"] の範囲外なのに、エラーになりません。

ステータスをポーリングして INDEXED を確認

aws bedrock-agent get-knowledge-base-documents \
  --knowledge-base-id <KB_ID> \
  --data-source-id <DS_ID> \
  --document-identifiers '[{"dataSourceType":"S3","s3":{"uri":"s3://<your-bucket>/direct-ingest/direct.md"}}]' \
  --region ap-northeast-1

数秒後、ステータスが INDEXED に遷移すれば取り込み完了です。実測では 10 秒以内INDEXED に到達しました。

indexed-status

retrieve でヒットするかを確認

念のため retrieve API 側でも取り込み結果を確認します:

aws bedrock-agent-runtime retrieve \
  --knowledge-base-id <KB_ID> \
  --retrieval-query '{"text":"IngestKnowledgeBaseDocuments API と直接インジェストについて教えて"}' \
  --region ap-northeast-1

direct-ingest/direct.md の内容が retrieval 結果に含まれ、検索可能な状態になっていることを確認できました。

direct-retrieve-hit

  • Test KBs の「取得のみ: データソース」モードで direct.md がスコア 0.36 でヒットしました。右ペインのメタデータに direct-ingest/direct.md の S3 URI が表示されています。

Sync と Direct Ingestion のざっくり比較

同じ KB で StartIngestionJob も動かして、実装選定の判断材料として比較しました:

観点 Sync (StartIngestionJob) Direct Ingestion (IngestKnowledgeBaseDocuments)
呼び出し単位 DS 全体をスキャン ファイル単位で指定
リクエストに S3 URI を含むか 含まない(DS 設定に依存) 含む
DS の inclusionPrefixes 制約 有効 効かない(URI 指定が優先)
所要時間(1 ファイル) 初回 約 2 分 32 秒、増分同期 約 30 秒 10 秒以内
リアルタイム取り込み向き 重い 軽い

Sync 側の所要時間はコンソールの同期履歴でも確認できます:

sync-history

  • DS 詳細画面の同期履歴。上段が 2 回目同期(変化なし、全カラム 0)、下段が初回同期(追加 = 1)

リアルタイム取り込みが要件なら Direct Ingestion 一択 という結論になります。

検証でエラーが出た点

1. AWS CLI 2.34+ 必須

2.33 以前だと、managedKnowledgeBaseConfiguration がクライアント側 botocore モデルに未登録で、API に到達する前に client 側で弾かれます:

Parameter validation failed:
Unknown parameter in knowledgeBaseConfiguration: "managedKnowledgeBaseConfiguration",
must be one of: type, vectorKnowledgeBaseConfiguration, ...

対処: brew upgrade awscli などで 2.34 以降に更新します(検証時は 2.35.11 を使用)。

2. Managed KB は MANAGED_KNOWLEDGE_BASE_CONNECTOR 専用構造

self-managed KB でよく見る type: "S3" + s3Configuration の構造は Managed KB では通りません:

ValidationException: Unsupported data source type for MANAGED knowledge base type.

上記「データソースを作成する」節の JSON 構造で書き換える必要があります。

3. bucketOwnerAccountId は同一アカウントでも必須(公式ドキュメントとの乖離)

公式ドキュメント (kb-managed-ds-s3) には以下のように書かれています:

bucketOwnerAccountId — Conditional — The AWS account ID of the bucket owner. Required for cross-account access.

しかし実機では、同一アカウントでもこのフィールドを省略すると DS が即 FAILED になります:

failureReasons:
  Value at 'connectionConfiguration.bucketOwnerAccountId' failed to satisfy constraint:
  Member must not be null

Managed KB で S3 コネクタを組む場合は、同一アカウントでも bucketOwnerAccountId を常に明示指定するのが安全です。

4. 自動補完されるデフォルト値、特に画像抽出は ON

CLI で mediaExtractionConfiguration を明示指定しなくても、レスポンスでは imageExtractionStatus: "ENABLED" が返ります。画像抽出はデフォルト ON です。テキスト主体のドキュメントであれば実害はないですが、画像を大量に含む PDF などを取り込む前提なら、無効化するか、コスト面を考慮に入れておく必要がありそうです(本検証ではテキスト主体のドキュメントのみで、画像抽出時のコストは実測していません)。

その他、指定しなくても自動補完される値:

フィールド デフォルト値
maxFileSizeInMegaBytes 500
aclEnabled false
dataDeletionPolicy DELETE
imageExtractionStatus ENABLED

まとめ

Amazon Bedrock Managed KB に対して IngestKnowledgeBaseDocuments API が使えるかを実機で確認しました。動きます

  • Managed KB(type=MANAGED, embeddingModelType=MANAGED)で IngestKnowledgeBaseDocuments を叩き、S3 オブジェクトを直接インジェスト → 数秒で INDEXED に到達 → retrieve でテスト実行を確認しました
  • DS の inclusionPrefixes 範囲外のファイルも受理されました
  • Sync と比べて 1 ファイルあたりの取り込みが圧倒的に速く(10 秒以内 vs 2 分〜)、リアルタイム取り込みには Direct Ingestion 一択
  • 実装レベルで気をつけたい点は本検証のスコープ内では上記4点(AWS CLI 2.34+、専用 DS 構造、bucketOwnerAccountId の実必須化、デフォルト値の自動補完)

未検証事項

本検証範囲では以下は確認していません。今後余力があれば追試したい部分です:

  • 画像抽出 ON 状態での実際のコスト増加量
  • リージョン別の挙動差(本検証は ap-northeast-1 のみ)
  • 大規模ドキュメント(数百 MB 級)や PDF/画像入りドキュメントでの所要時間
  • IngestKnowledgeBaseDocuments の同時実行時のスループット上限
  • Managed KBの精度

Amazon Bedrock Managed Knowledge Base は登場したばかりで、UI やログ周りの仕様は今後も変わる可能性があります。本記事は 2026-06-29 〜 2026-07-01 時点の実機観察に基づきます。

なお、本検証を通じてCloudTrail / retrieve メタデータの経路差など、記事の主題から外れる観察もいくつか得られました。これらは別記事で改めて整理する予定です。

参考リンク

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事