TerraformでAmazon Bedrock KnowledgeBaseとAmazon S3 Vectorsを使用したRAGを構築してみた
はじめに
先日のre:InventでS3 VectorsがGAされたことにより、専用のデータベースを必要としない低コストなRAGシステムの構築が可能になりました。
嬉しいことにTerraformのProvider(terraform-provider-aws)でもv6.27.0のリリースでBedrock KnowledgeBaseとS3 Vectorsの統合ができるようになっています。
今回はTerraformを使用して低コストなRAGの構築をしてみたいと思います。
やってみた
今回使用するコードは以下のリポジトリに格納してますので、適宜詳細をご確認ください。
リソース
ここからは主要リソースを一部抜粋しながら解説します。
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のサービス画面を開くとナレッジベースに今回作成したリソースが追加されています。

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

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

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

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


問題なくドキュメントに基づいた回答が生成されました。
まとめ
今回はTerraformでS3 Vectorsを使用したRAGを構築してみました。
これまでは安価なRAGとしてPineconeを使用したKnowledgeBaseを構築していましたが、これを機にS3 Vectorsに完全移行したいと思います。
どなたかの参考になれば幸いです。








