0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Bedrock KB + S3 Vectors を CDK でデプロイしたら supplemental storage の権限検証で延々失敗した話

0
Posted at

要約

CDK で Bedrock Knowledge Base を supplementalDataStorageConfiguration 付きでデプロイすると、IAM ロールの権限検証で失敗し続けることがある。原因は IAM eventual consistency ではなく、s3:GetBucketLocations3: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.

試したこと(全部ダメだった)

  1. IAM eventual consistency を疑った — Custom Resource Lambda で 15秒×12回リトライ → 3分待っても失敗
  2. Trust Policy の条件を緩和 — 条件なしにしても失敗
  3. バケットポリシーに明示的 Allow を追加 — Bedrock サービスプリンシパルを追加しても失敗
  4. enforceSSL を除去 — 変わらず失敗
  5. 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 サービスが当該バケットに対して PutObjectDeleteObject を呼び出しており、DeleteObjectAccessDenied で失敗していました。

正しい 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:DeleteObjects3:GetBucketLocation が必要であることはドキュメントから読み取れないため、同じ問題に遭遇した方の参考になれば幸いです。

日誌ベースのナレッジ管理に検索性を加える試みはまだ道半ばですが、少なくともインフラ層のデプロイは無事に通るようになりました。マルチモーダル検索の運用や精度評価については、別途記事にする予定です。

参考リンク

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?