1
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?

既存の S3 Vectors を Bedrock Knowledge Bases で利用する方法を紹介

1
Last updated at Posted at 2026-02-23

2026/03/07追記
本記事の内容について、AWSサポートに問い合わせを行いました。事象について、担当部署に共有するとのことでした。

はじめに

Amazon S3 Vectors は、Amazon S3 にネイティブなベクトル検索機能を提供するサービスです。1 秒未満のクエリレイテンシーをサポートする、ベクトルの保存・検索に特化した初のクラウドオブジェクトストアです。サブセカンドのクエリレイテンシーで、低頻度クエリ向けです。より高頻度のクエリでは 100 ミリ秒程度も可能です。

S3 Vectors は Amazon S3 上のベクトルバケットとベクトルインデックスを使います。S3 の耐久性・可用性・コスト効率を活かしつつ、ベクトル検索が可能です。サーバーレスかつフルマネージドなので、運用負担が少ない点も特徴です。また、Bedrock Knowledge Bases のベクトルストアとしても利用でき、OpenSearch Serverless や Aurora PostgreSQL と比べてコストを抑えやすい構成です。

本記事では、既存の S3 Vectors インデックスを Bedrock Knowledge Bases で利用する手順と注意点を紹介します。

参考情報

注意点

既存の S3 Vectors インデックスをナレッジベースで利用する場合、インデックスが以下の要件を満たす必要があります。要件を満たさないインデックスをベクトルストアにすると、埋め込み処理やデータ同期でエラーになります。全てがエラーになるわけではないようですが、S3バケットに格納した200個程度のMarkdownファイルを同期したところ、約90%がエラーとなる事象を確認しました。再度同期しても数個しか成功しなかったため、既存のS3 Vectorsをベクトルストアとして利用する場合は要件を満たすインデックスを作成することをおすすめします。

2026/02/27追記
non-filterable metadataを持たないインデックスを使用した場合に発生するエラーについて、S3 Vectors+Knowledge BaseでFilterable metadataのサイズについて怒られた【S3 Vectors】 で詳しく解説されています。ベクトルインデックスがnon-filterable metadataを持たない場合、AMAZON_BEDROCK_TEXT、AMAZON_BEDROCK_METADATAがfilterable metadataとして扱われるため、サイズ制限に引っかかる可能性があります。

ナレッジベース用の S3 Vectors インデックスの要件

  • non-filterable metadata(AMAZON_BEDROCK_TEXT、AMAZON_BEDROCK_METADATA)を設定している。
  • ナレッジベースで使用する埋め込みモデルに適した次元数を設定している。

埋め込みモデルに適した次元数

ナレッジベースで利用する埋め込みモデルと、その次元数は以下のとおりです。次元数はモデルによって異なります。

モデル 次元数
Titan G1 Embeddings - Text 1,536
Titan V2 Embeddings - Text 1,024, 512, 256
Cohere Embed English 1,024
Cohere Embed Multilingual 1,024

既存の S3 Vectors をナレッジベースのベクトルストアとして利用するユースケース

ナレッジベース以外の用途で作成したインデックスに、上記の non-filterable metadata を設けている例は少ないでしょう。そのため、既存の S3 Vectors をナレッジベースのベクトルストアとして利用するユースケースは、以下の場合が想定されます。

  • ベクトルバケット名やインデックス名を任意の名前で作成したい
  • ベクトルバケットの暗号化タイプやインデックスの距離メトリックを任意に設定したい
  • 過去に使用したインデックスを使いたい

既存の S3 Vectors を Bedrock Knowledge Bases で利用する

既存の S3 Vectors をナレッジベースで利用するには、以下のパターンがあります。

  • 作成済みのベクトルインデックスを新規ナレッジベースのベクトルストアとして紐付ける
  • 新規にベクトルインデックスを作成し、新規ナレッジベースのベクトルストアとして紐付ける

新規にナレッジベースを作成する際に、あわせてベクトルインデックスを作成することも可能です。その場合、ベクトルバケット名やインデックス名・設定はナレッジベースのデフォルトになります。

作成済みのナレッジベースのベクトルストアは、後から変更できません。

本記事では、「新規にベクトルインデックスを作成し、新規作成するナレッジベースのベクトルストアとして紐付ける」パターンを紹介します。

ベクトルバケットとベクトルインデックスを作成する (マネージメントコンソール)

ベクトルバケットの作成

AWS マネジメントコンソールの Amazon S3からベクトルバケットを作成します。Vector buckets を選択し、画面右上の Create vector bucket をクリックします。

ベクトルバケットの作成

ベクトルバケット名を入力します。

ベクトルバケット名は S3 バケット名と異なり、全世界で一意である必要はありません。自分の AWS アカウント内の各リージョンで一意であれば問題ありません。命名規則の詳細は Vector buckets naming requirements を参照してください。主な命名規則を以下に抜粋します。

  • ベクトルバケット名の長さは 3~63 文字
  • ベクトルバケット名には、英小文字 (a-z) 、数字 (0-9) 、ハイフン (-) のみ使用可能
  • ベクトルバケット名は、文字または数字ではじまり、文字または数字で終わる

今回は暗号化タイプをデフォルトのままにします。デフォルトでは Amazon S3 管理キー (SSE-S3) を使用してサーバー側の暗号化が行われます。ベクトルバケット作成後は暗号化タイプ(SSE-S3 / SSE-KMS)を変更できないため、運用方針に合わせて作成時に選択してください。Create vector bucket をクリックすると、ベクトルバケットが作成されます。

ベクトルバケットの作成完了

ベクトルインデックスの作成

続いて、ベクトルインデックスを作成します。作成したベクトルバケットをクリックし、ベクトルインデックス一覧画面を開きます。

ベクトルインデックス作成画面

ベクトルインデックス一覧画面に進んだ場合は、画面右上の Create vector index をクリックして、ベクトルインデックス作成画面を開きます。

ベクトルインデックス作成ボタン

ベクトルインデックス名を入力します。ベクトルインデックス名はベクトルバケット内で一意である必要があります。3〜63 文字で、英小文字・数字・ハイフン・ドット (.) が使え、先頭と末尾は英字または数字とする必要があります。その他の命名規則は Vector index naming requirements を参照してください。

Dimension(次元数)は、使用する埋め込みモデルの次元数を指定します。ここでは Amazon Titan Text Embeddings V2(表では Titan V2 Embeddings - Text)の次元数である 1024 を指定します。

Distance metric(距離メトリック)は、ベクトル検索時に使用する距離メトリックを指定します。ここでは Cosine を選択します。使用する埋め込みモデルの推奨距離メトリックに合わせて選択してください(Vector indexes - Amazon S3)。

ベクトルインデックス作成画面

Non-filterable metadataの設定(重要)

次に、Additional settings を開き、 (フィルタリングできないメタデータ)を設定します。前述のとおり、AMAZON_BEDROCK_TEXT と AMAZON_BEDROCK_METADATA を追加します。

ナレッジベースで埋め込みを作成すると、これらのメタデータにチャンク分割したテキストとメタデータが保存されます。設定が完了したら Create vector index をクリックします。

Non-filterable metadata の設定

ベクトルインデックスの作成が完了すると、ベクトルインデックス一覧画面に作成したインデックスが表示されます。

ベクトルインデックス一覧画面

ナレッジベースを作成する

AWS マネジメントコンソールの Amazon Bedrock Knowledge Basesからナレッジベースを作成します。画面右上の CreateKnowledge Base with vector store をクリックします。How it works の枠内にある Create からでも同様に作成できます。

ナレッジベース作成画面

Step 1: Provide Knowledge Base detailsとStep 2: Configure Data Sourceは特に注意する内容はありません。

Step 1: Provide Knowledge Base details
Step 1: Provide Knowledge Base details

Step 2: Configure Data Source
Step 2: Configure Data Source

Step3: Configure data storage and processingは、埋め込みモデルの選択を行います。S3 Vectorsのインデックス作成でAmazon Titan Text Embeddings V2を使う前提の次元数を設定したので、Amazon Titan Text Embeddings V2を選択します。

Select modelボタンをクリックして、Amazon Titan Text Embeddings V2を選択します。
Step3: Configure data storage and processing

Amazon Titan Text Embeddings V2

既存のS3 Vectorsをベクトルストアとして利用する

ここで、先ほど作成したベクトルバケットとベクトルインデックスを選択し、ナレッジベースのベクトルストアとして利用します。

Using existing vector store、Vector store type でS3 Vectorsを選択します。
Using existing vector store

S3 vector bucket ARNの欄でBrows S3をクリックして、作成したベクトルバケットを、S3 vector index ARNで作成したベクトルインデックスを選択します。
S3 vector bucket ARN

NextをクリックしてReview and createに進み、Create Knowledge Baseをクリックしてナレッジベースを作成します。

データソースの同期を実行

作成したナレッジベースからデータソースを選択し、同期を実行します。これで、今回の作業は完了です。

データソースの同期

ベクトルバケットとベクトルインデックスを作成する (AWS CLI)

AWS CLI を使用して、ベクトルバケットとベクトルインデックスを作成し、ナレッジベースのベクトルストアとして利用する手順を紹介します。

変数設定

AWSアカウントID、リージョン、プロファイル、ベクトルバケット名、ベクトルインデックス名を環境変数に設定します。例は以下のとおりです。

# 変数設定
ACCOUNT_ID="YOUR_ACCOUNT_ID"
REGION="YOUR_REGION"
PROFILE="YOUR_PROFILE"
VECTOR_BUCKET_NAME="YOUR_VECTOR_BUCKET_NAME"
INDEX_NAME="YOUR_INDEX_NAME"
S3_BUCKET_NAME="YOUR_S3_BUCKET_NAME"
DATE_SUFFIX=$(date +%Y%m%d)

1. ベクトルバケットの作成

ベクトルバケットを作成します。

aws s3vectors create-vector-bucket \
  --vector-bucket-name $VECTOR_BUCKET_NAME \
  --region $REGION \
  --profile $PROFILE

2. ベクトルインデックスの作成

ベクトルインデックスを作成します。--dimension には使用する埋め込みモデルの次元数を、--distance-metric には距離メトリックを指定します。--metadata-configurationAMAZON_BEDROCK_TEXTAMAZON_BEDROCK_METADATA を non-filterable metadata として設定します。

aws s3vectors create-index \
  --vector-bucket-name $VECTOR_BUCKET_NAME \
  --index-name $INDEX_NAME \
  --data-type float32 \
  --dimension 1024 \
  --distance-metric cosine \
  --metadata-configuration '{"nonFilterableMetadataKeys":["AMAZON_BEDROCK_TEXT","AMAZON_BEDROCK_METADATA"]}' \
  --region $REGION \
  --profile $PROFILE

3. 信頼ポリシー

信頼ポリシーを作成します。

cat > /tmp/trust-policy.json << EOF
{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Principal": {"Service": "bedrock.amazonaws.com"},
    "Action": "sts:AssumeRole",
    "Condition": {
      "StringEquals": {"aws:SourceAccount": "$ACCOUNT_ID"},
      "ArnLike": {"aws:SourceArn": "arn:aws:bedrock:$REGION:$ACCOUNT_ID:knowledge-base/*"}
    }
  }]
}
EOF

4. IAM ロールの作成

Bedrock ナレッジベースが使用する IAM ロールを作成します。手順 3 で作成した信頼ポリシーファイルを指定します。ここでは、BedrockKnowledgeBaseRole-$DATE_SUFFIX という名前のロールを作成します。

aws iam create-role \
  --role-name BedrockKnowledgeBaseRole-$DATE_SUFFIX \
  --assume-role-policy-document file:///tmp/trust-policy.json \
  --profile $PROFILE

5. S3 Vectors ポリシーの作成

S3 Vectors を操作するための IAM ポリシーを作成し、ロールにアタッチします。

ROLE_NAME="BedrockKnowledgeBaseRole-$DATE_SUFFIX"

ポリシーを定義します。

cat > /tmp/s3vectors-policy.json << EOF
{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Action": [
      "s3vectors:GetIndex",
      "s3vectors:QueryVectors",
      "s3vectors:PutVectors",
      "s3vectors:GetVectors",
      "s3vectors:DeleteVectors"
    ],
    "Resource": "arn:aws:s3vectors:$REGION:$ACCOUNT_ID:bucket/$VECTOR_BUCKET_NAME/index/$INDEX_NAME",
    "Condition": {"StringEquals": {"aws:ResourceAccount": "$ACCOUNT_ID"}}
  }]
}
EOF

定義したポリシーファイルを使って IAM ポリシーを作成します。

aws iam create-policy \
  --policy-name BedrockKBS3VectorsPolicy-$DATE_SUFFIX \
  --policy-document file:///tmp/s3vectors-policy.json \
  --profile $PROFILE

ロールにアタッチします。

aws iam attach-role-policy \
  --role-name $ROLE_NAME \
  --policy-arn "arn:aws:iam::$ACCOUNT_ID:policy/BedrockKBS3VectorsPolicy-$DATE_SUFFIX" \
  --profile $PROFILE

6. Bedrock モデルポリシーの作成

埋め込みモデルを呼び出すための IAM ポリシーを定義します。ここでは、BedrockKBModelPolicy-$DATE_SUFFIX という名前のポリシーを作成します。

cat > /tmp/model-policy.json << EOF
{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Action": ["bedrock:InvokeModel"],
    "Resource": "arn:aws:bedrock:$REGION::foundation-model/amazon.titan-embed-text-v2:0"
  }]
}
EOF

定義したポリシーファイルを使って IAM ポリシーを作成します。

aws iam create-policy \
  --policy-name BedrockKBModelPolicy-$DATE_SUFFIX \
  --policy-document file:///tmp/model-policy.json \
  --profile $PROFILE

ロールにアタッチします。

aws iam attach-role-policy \
  --role-name $ROLE_NAME \
  --policy-arn "arn:aws:iam::$ACCOUNT_ID:policy/BedrockKBModelPolicy-$DATE_SUFFIX" \
  --profile $PROFILE

7. S3 データソースポリシーの作成

データソースとなる S3 バケットへの読み取り権限を付与するポリシーを定義します。

cat > /tmp/s3-datasource-policy.json << EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:ListBucket"],
      "Resource": "arn:aws:s3:::$S3_BUCKET_NAME",
      "Condition": {"StringEquals": {"aws:ResourceAccount": "$ACCOUNT_ID"}}
    },
    {
      "Effect": "Allow",
      "Action": ["s3:GetObject"],
      "Resource": "arn:aws:s3:::$S3_BUCKET_NAME/*",
      "Condition": {"StringEquals": {"aws:ResourceAccount": "$ACCOUNT_ID"}}
    }
  ]
}
EOF

ポリシーを作成し、ロールにアタッチします。

aws iam create-policy \
  --policy-name BedrockKBS3DataSourcePolicy-$DATE_SUFFIX \
  --policy-document file:///tmp/s3-datasource-policy.json \
  --profile $PROFILE
aws iam attach-role-policy \
  --role-name $ROLE_NAME \
  --policy-arn "arn:aws:iam::$ACCOUNT_ID:policy/BedrockKBS3DataSourcePolicy-$DATE_SUFFIX" \
  --profile $PROFILE

8. ナレッジベースの作成

作成したロールを指定してナレッジベースを作成します。

ROLE_ARN=$(aws iam get-role --role-name $ROLE_NAME --query 'Role.Arn' --output text --profile $PROFILE)

aws bedrock-agent create-knowledge-base \
  --name "MyKnowledgeBase-$DATE_SUFFIX" \
  --role-arn "$ROLE_ARN" \
  --knowledge-base-configuration '{
    "type": "VECTOR",
    "vectorKnowledgeBaseConfiguration": {
      "embeddingModelArn": "arn:aws:bedrock:'$REGION'::foundation-model/amazon.titan-embed-text-v2:0"
    }
  }' \
  --storage-configuration '{
    "type": "S3_VECTORS",
    "s3VectorsConfiguration": {
      "vectorBucketArn": "arn:aws:s3vectors:'$REGION':'$ACCOUNT_ID':bucket/'$VECTOR_BUCKET_NAME'",
      "indexArn": "arn:aws:s3vectors:'$REGION':'$ACCOUNT_ID':bucket/'$VECTOR_BUCKET_NAME'/index/'$INDEX_NAME'"
    }
  }' \
  --region $REGION \
  --profile $PROFILE

作成されたナレッジベースの ID を取得します。

KNOWLEDGE_BASE_ID=$(aws bedrock-agent list-knowledge-bases \
  --query "knowledgeBaseSummaries[?name=='MyKnowledgeBase-$DATE_SUFFIX'].knowledgeBaseId" \
  --output text \
  --region $REGION \
  --profile $PROFILE)

9. データソースの作成

ナレッジベースにデータソースを作成します。データソースには、ドキュメントを格納した S3 バケットを指定します。

aws bedrock-agent create-data-source \
  --knowledge-base-id $KNOWLEDGE_BASE_ID \
  --name "MyDataSource-$DATE_SUFFIX" \
  --data-source-configuration '{
    "type": "S3",
    "s3Configuration": {
      "bucketArn": "arn:aws:s3:::'$S3_BUCKET_NAME'"
    }
  }' \
  --region $REGION \
  --profile $PROFILE

作成されたデータソースの ID を取得します。

DATA_SOURCE_ID=$(aws bedrock-agent list-data-sources \
  --knowledge-base-id $KNOWLEDGE_BASE_ID \
  --query "dataSourceSummaries[0].dataSourceId" \
  --output text \
  --region $REGION \
  --profile $PROFILE)

10. データソースの同期

作成したデータソースの同期(インジェスションジョブ)を実行します。

aws bedrock-agent start-ingestion-job \
  --knowledge-base-id $KNOWLEDGE_BASE_ID \
  --data-source-id $DATA_SOURCE_ID \
  --region $REGION \
  --profile $PROFILE

インジェスションジョブが開始されます。ジョブの完了は get-ingestion-job コマンドで確認できます。

まとめ

本記事では、既存の S3 Vectors インデックスを Bedrock Knowledge Bases のベクトルストアとして活用する手順と注意点を紹介しました。ベクトルインデックスには規定のnon-filterable metadataが必要であることに注意が必要です。

  • non-filterable metadata に AMAZON_BEDROCK_TEXTAMAZON_BEDROCK_METADATA を設定すること
  • non-filterable metadata がないインデックスを使用すると、データソース同期でエラーが発生する
  • 使用する埋め込みモデルに合った次元数(例:Titan V2 は 1,024 / 512 / 256)でインデックスを作成すること
1
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
1
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?