TerraformでAmazon Bedrock KnowledgeBaseとAmazon S3 Vectorsを使用したRAGを構築してみた

TerraformでAmazon Bedrock KnowledgeBaseとAmazon S3 Vectorsを使用したRAGを構築してみた

2025.12.18

はじめに

先日のre:InventでS3 VectorsがGAされたことにより、専用のデータベースを必要としない低コストなRAGシステムの構築が可能になりました。

https://dev.classmethod.jp/articles/s3-vector-ga-tokyo-region-available-aws-reinvent/

嬉しいことにTerraformのProvider(terraform-provider-aws)でもv6.27.0のリリースでBedrock KnowledgeBaseとS3 Vectorsの統合ができるようになっています。

https://github.com/hashicorp/terraform-provider-aws/releases/tag/v6.27.0

今回はTerraformを使用して低コストなRAGの構築をしてみたいと思います。

やってみた

今回使用するコードは以下のリポジトリに格納してますので、適宜詳細をご確認ください。

https://github.com/sakai-classmethod/knowledge-base-with-s3-vectors-tf

リソース

ここからは主要リソースを一部抜粋しながら解説します。

Provider

Providerのバージョンは今回リリースされたv6.27.0を使用します。

terraform {
  required_version = ">= 1.0"

  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "= 6.27.0"
    }
  }
}

Amazon S3 Vectors

ベクトルバケットとインデックスの作成を行います。
距離メトリックにはコサインユークリッドが選択可能です。
今回は方向と大きさの両方を使用して、2 つのベクトル間の直線距離を測定するユークリッドを使用します。

resource "aws_s3vectors_vector_bucket" "main" {
  vector_bucket_name = "${local.name_prefix}-vectors"
  force_destroy      = true
}

resource "aws_s3vectors_index" "main" {
  index_name         = "${local.name_prefix}-index"
  vector_bucket_name = aws_s3vectors_vector_bucket.main.vector_bucket_name

  data_type       = local.data_type         # float32
  dimension       = local.embedding_dim     # 1024
  distance_metric = local.distance_metric   # euclidean
}

Amazon Bedrock KnowledgeBase

Amazon Bedrock KnowledgeBaseを作成し、ベクトルストアの設定はtypeをS3_VECTORSとし、作成したS3 VectorsのIndexARNを紐付けます。

resource "aws_bedrockagent_knowledge_base" "main" {
  name     = "${local.name_prefix}-kb"
  role_arn = aws_iam_role.kb.arn

  knowledge_base_configuration {
    type = "VECTOR"
    vector_knowledge_base_configuration {
      embedding_model_arn = "arn:${data.aws_partition.current.partition}:bedrock:${data.aws_region.current.id}::foundation-model/${local.embedding_model}"
      embedding_model_configuration {
        bedrock_embedding_model_configuration {
          dimensions          = local.embedding_dim     # 1024
          embedding_data_type = "FLOAT32"
        }
      }
    }
  }

  storage_configuration {
    type = "S3_VECTORS"
    s3_vectors_configuration {
      index_arn = aws_s3vectors_index.main.index_arn
    }
  }

  depends_on = [
    aws_iam_role_policy.kb
  ]
}

そのほかの構成は今までのKnowledgeBaseを同様の設定をします。
詳細は割愛しますので、詳しくはGitHubリポジトリをご確認ください。

デプロイ

以下のコマンドを実行してデプロイします。

cd terraform
terraform init 
terraform plan
terraform apply -auto-approve

しばらく待つと10個のリソースが追加されました。

aws_iam_role.kb: Creating...
aws_s3_bucket.data_source: Creating...
aws_s3vectors_vector_bucket.main: Creating...
aws_s3vectors_vector_bucket.main: Creation complete after 1s
aws_s3vectors_index.main: Creating...
aws_s3vectors_index.main: Creation complete after 1s
aws_iam_role.kb: Creation complete after 2s [id=example-kb-role]
aws_s3_bucket.data_source: Creation complete after 5s [id=example-data-source-123456789012]
data.aws_iam_policy_document.kb_policy: Reading...
aws_s3_bucket_public_access_block.data_source: Creating...
aws_s3_bucket_versioning.data_source: Creating...
aws_s3_bucket_server_side_encryption_configuration.data_source: Creating...
data.aws_iam_policy_document.kb_policy: Read complete after 0s [id=XXXXXXXXXX]
aws_iam_role_policy.kb: Creating...
aws_iam_role_policy.kb: Creation complete after 1s [id=example-kb-role:example-kb-policy]
aws_bedrockagent_knowledge_base.main: Creating...
aws_s3_bucket_public_access_block.data_source: Creation complete after 1s [id=example-data-source-123456789012]
aws_s3_bucket_server_side_encryption_configuration.data_source: Creation complete after 1s [id=example-data-source-123456789012]
aws_s3_bucket_versioning.data_source: Creation complete after 3s [id=example-data-source-123456789012]
aws_bedrockagent_knowledge_base.main: Still creating... [00m10s elapsed]
aws_bedrockagent_knowledge_base.main: Creation complete after 12s [id=KBXXXXXXXX]
aws_bedrockagent_data_source.main: Creating...
aws_bedrockagent_data_source.main: Creation complete after 0s [id=DSXXXXXXXX,KBXXXXXXXX]

Apply complete! Resources: 10 added, 0 changed, 0 destroyed.

マネジメントコンソールからもリソースを確認してみます。
Bedrockのサービス画面を開くとナレッジベースに今回作成したリソースが追加されています。

2025-12-18-283.png

詳細を確認してみましたがS3 Vectorsが使われていそうですね。

2025-12-18-282.png

動作確認

せっかくなのでドキュメントを同期して問い合わせを行なってみます。
データソースとして設定されているS3バケットにPDFをアップロードします。

2025-12-18-281.png

ドキュメントのアップロードが完了したらKnowledgeBaseの画面からデータソースを選択して同期を実行します。

2025-12-18-284.png

テスト画面から実際に問い合わせをしてみましょう。

2025-12-18-285.png

2025-12-18-280.png

問題なくドキュメントに基づいた回答が生成されました。

まとめ

今回はTerraformでS3 Vectorsを使用したRAGを構築してみました。
これまでは安価なRAGとしてPineconeを使用したKnowledgeBaseを構築していましたが、これを機にS3 Vectorsに完全移行したいと思います。
どなたかの参考になれば幸いです。

この記事をシェアする

FacebookHatena blogX

関連記事