要約
CDK で Bedrock Knowledge Base を supplementalDataStorageConfiguration 付きでデプロイすると、IAM ロールの権限検証で失敗し続けることがある。原因は IAM eventual consistency ではなく、s3:GetBucketLocation と s3:DeleteObject の不足。公式ドキュメントには「standard S3 permissions」とだけ記載されており、具体的なアクション一覧が示されていない(2026年6月時点)。
はじめに
以前の記事「Kiro CLI で「日誌ひとつ」のタスク管理環境を構築した話」で、日誌ファイルを情報の入口にする運用を紹介しました。日々の作業ログ、技術資料、PDF ── すべてを 日誌/ に放り込み、夕方に AI が自動振り分けする仕組みです。
1ヶ月ほど運用して見えてきた課題が検索性の欠如でした。すべてを 日誌/ に放り込んで自動振り分けする方式は記録の手軽さと引き換えに、振り分け後の知見が分散して取り出しにくくなります。Markdown のフルテキスト検索はファイル数が増えるほど精度・速度の両面で限界が見え始めますし、そもそも IoT関連の業務で日常的に扱う回路図やデータシート、ホワイトボードの写真といった非テキストコンテンツには手が届きません。「あの回路図どこだっけ?」「先週のミーティングで撮った写真に書いてあったはず」── こうした検索ニーズに応えるには、テキストだけでなく画像・PDF も横断検索できる基盤が必要です。
そこで目をつけたのが Amazon Bedrock Knowledge Bases のマルチモーダル検索 です。テキスト・画像・音声・動画を単一のベクトル空間にエンコードし、クロスモーダルな類似検索を可能にする機能で、2025年11月に GA になりました。ベクトルストアには、2025年7月にプレビュー公開された Amazon S3 Vectors を選びました。S3 Vectors は S3 にネイティブなベクトルストレージで、専用のベクトル DB に比べてコストを最大90%削減できます。
Bedrock Knowledge Bases で利用可能な主要ベクトルストアのコスト特性を比較すると、S3 Vectors の位置づけが明確になります:
| ベクトルストア | コストモデル | 最小コスト目安 | 特徴 |
|---|---|---|---|
| OpenSearch Serverless | OCU(計算ユニット)課金 | 約 $350/月〜(2 OCU 最小) | 高スループット・低レイテンシ。常時稼働のため小規模でも固定費が高い |
| Aurora PostgreSQL (pgvector) | インスタンス時間 + ストレージ | 約 $50/月〜(Serverless v2 最小) | SQL との統合が容易。スケールダウン可能で小規模向き |
| S3 Vectors | ストレージ + リクエスト課金 | 数ドル/月〜(完全従量制) | 最大90%コスト削減。低頻度クエリ向き。インフラ管理不要 |
参考: Choosing an AWS vector database for RAG use cases — Cost comparisons
個人のナレッジ管理用途では、クエリ頻度は低い(1日数回〜数十回)一方でデータ量は増え続けるため、完全従量制の S3 Vectors が最もコスト効率に優れます。
早速この構成を CDK でデプロイしようとしたところ、supplemental storage(マルチモーダルコンテンツの保存先バケット)の権限検証で丸一日ハマりました。本記事ではその顛末と解決策を共有します。
構成の概要
今回デプロイしようとした構成は以下の通りです。
| コンポーネント | 選定 |
|---|---|
| ベクトルストア | Amazon S3 Vectors — S3 にネイティブなベクトルインデックス |
| Embedding モデル | Amazon Titan Text Embeddings V2(1024次元) |
| マルチモーダル格納先 | supplementalDataStorageConfiguration で別 S3 バケットを指定 |
| IaC | AWS CDK v2(TypeScript) |
supplementalDataStorageConfiguration とは、Knowledge Base がマルチモーダルコンテンツ(画像・音声・動画)を処理する際に、抽出したメディアファイルのコピーを保存するバケットを指定する設定です。検索時にオリジナルのメディアを返却するために必要で、Nova Multimodal Embeddings を使う場合は必須の設定になります。
何が起きたか
デプロイするたびに同じエラーで失敗しました:
An error occurred while validating write access to the provided supplemental
data storage bucket. Please ensure that the provided role has read and write
permissions on the bucket.
試したこと(全部ダメだった)
- IAM eventual consistency を疑った — Custom Resource Lambda で 15秒×12回リトライ → 3分待っても失敗
- Trust Policy の条件を緩和 — 条件なしにしても失敗
- バケットポリシーに明示的 Allow を追加 — Bedrock サービスプリンシパルを追加しても失敗
-
enforceSSLを除去 — 変わらず失敗 - 9時間放置して再試行 — まだ失敗。IAM eventual consistency ではないことが確定
ここで言う「IAM eventual consistency」とは、IAM ポリシーの変更が AWS 内部で完全に伝播するまでに数秒〜数十秒のタイムラグがある現象です。CDK デプロイではリソース作成直後に次のリソースが参照するため、ポリシーがまだ反映されていない状態で検証が走る可能性がありますが、9時間待っても解消しないのであれば原因は別にあります。
真の原因
KbRole(Knowledge Base が S3 にアクセスする際に使う IAM サービスロール)に以下の2つのアクションが不足していました:
s3:GetBucketLocation ← Bedrock がバケットのリージョンを確認する
s3:DeleteObject ← 検証用一時ファイルを削除する
Bedrock は KB 作成時に supplemental storage バケットに対して権限検証を行います。具体的には aws/bedrock/knowledge_bases/<KB_ID>/tmp-permission-check-file というオブジェクトを書き込み、検証後に削除します。この削除権限がないと、検証全体が「書き込みアクセスの検証に失敗」として報告されます。
この挙動は CloudTrail ログから確認しました。KB 作成リクエスト直後に、Bedrock サービスが当該バケットに対して PutObject → DeleteObject を呼び出しており、DeleteObject が AccessDenied で失敗していました。
正しい IAM ポリシー
supplemental storage バケットに対する KbRole の完全な権限です:
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject",
"s3:ListBucket",
"s3:GetBucketLocation",
"s3:AbortMultipartUpload"
],
"Resource": [
"arn:aws:s3:::my-supplemental-bucket",
"arn:aws:s3:::my-supplemental-bucket/*"
]
}
各アクションの役割:
| アクション | 用途 |
|---|---|
s3:GetObject |
検索時にメディアファイルを取得 |
s3:PutObject |
データ取り込み時に抽出メディアを保存 |
s3:DeleteObject |
権限検証時の一時ファイル削除 + データソース再同期時の古いファイル削除 |
s3:ListBucket |
バケット内のオブジェクト列挙 |
s3:GetBucketLocation |
バケットのリージョン確認(KB と同一リージョンであることの検証) |
s3:AbortMultipartUpload |
大きなメディアファイルのマルチパートアップロード中断時のクリーンアップ |
CDK での実装
addPropertyOverride は不要です。CDK v2.258+ では SupplementalDataStorageConfigurationProperty が L1 コンストラクト(CloudFormation リソースと1対1で対応する低レベルの型定義)としてサポートされています:
const kb = new bedrock.CfnKnowledgeBase(this, 'KnowledgeBase', {
knowledgeBaseConfiguration: {
type: 'VECTOR',
vectorKnowledgeBaseConfiguration: {
embeddingModelArn: '...',
embeddingModelConfiguration: { ... },
supplementalDataStorageConfiguration: {
supplementalDataStorageLocations: [{
supplementalDataStorageLocationType: 'S3',
s3Location: { uri: 's3://my-supplemental-bucket' },
}],
},
},
},
// ...
});
正しい権限を設定すれば、単一スタック・70秒でデプロイが完了します。Custom Resource もリトライも不要です。
補足: 他のハマりどころ
supplementalDataStorageConfiguration は作成時のみ設定可能
UpdateKnowledgeBase API で後から追加・変更しようとすると:
You cannot modify the supplemental data storage configuration once created.
最初から設定するか、KB を削除して再作成するしかありません。CloudFormation 上でも Update requires: Replacement(リソースの削除→再作成)として扱われます。
DataSource の parsingConfiguration も作成後変更不可
FM パーサー(Foundation Model を使ってドキュメントを解析する機能)の設定を変更したい場合は DataSource を削除して再作成する必要があります。
supplemental storage は別バケット推奨
公式ドキュメントに明記されています:
Use separate buckets (recommended): Configure different Amazon S3 buckets for your data source and multimodal storage destination.
データソースバケットと supplemental storage バケットを同一にすると、抽出されたメディアファイルが再度データソースとしてインジェストされるループが発生しうるためです。
S3 Vectors の IAM リソース ARN
S3 Vectors は通常の S3(arn:aws:s3:::bucket-name)とは異なる独自のサービス名前空間を持ちます:
arn:aws:s3vectors:{region}:{account}:bucket/{bucket-name}/index/{index-name}
bucket/* のようなワイルドカードではなく、bucket/{name}/index/{indexName} までフルパスで指定します。
まとめ
| 症状 | 誤診 | 真の原因 |
|---|---|---|
| supplemental storage の書き込み検証失敗 | IAM eventual consistency |
s3:GetBucketLocation + s3:DeleteObject 不足 |
公式ドキュメントの KB IAM ロール要件 では、multimodal storage に必要な S3 権限について「standard S3 permissions」と記載されているのみで、具体的なアクション一覧が示されていない(2026年6月時点)。特に s3:DeleteObject と s3:GetBucketLocation が必要であることはドキュメントから読み取れないため、同じ問題に遭遇した方の参考になれば幸いです。
日誌ベースのナレッジ管理に検索性を加える試みはまだ道半ばですが、少なくともインフラ層のデプロイは無事に通るようになりました。マルチモーダル検索の運用や精度評価については、別途記事にする予定です。
参考リンク
- Create a service role for Amazon Bedrock Knowledge Bases — KB ロールに必要な権限の公式リファレンス
- Prerequisites for multimodal knowledge bases — multimodal storage の前提条件と推奨構成
- AWS::Bedrock::KnowledgeBase SupplementalDataStorageConfiguration — CloudFormation テンプレートリファレンス(Update requires: Replacement)
- Introducing multimodal retrieval for Amazon Bedrock Knowledge Bases — multimodal retrieval の公式ブログ
- Building cost-effective RAG applications with Amazon Bedrock Knowledge Bases and Amazon S3 Vectors — KB + S3 Vectors の構成ガイド
- Bedrock Knowledge Base with S3 Vectors: Troubleshooting IAM Permission Issues — re:Post での S3 Vectors 権限トラブルシューティング