[アップデート] Amazon Bedrock Knowledge bases のベクトルデータベースに新しく Amazon OpenSearch Managed Cluster がサポートされました

[アップデート] Amazon Bedrock Knowledge bases のベクトルデータベースに新しく Amazon OpenSearch Managed Cluster がサポートされました

Clock Icon2025.03.30

こんにちは!クラウド事業本部コンサルティング部のたかくに(@takakuni_)です。

Amazon Bedrock Knowledge bases のベクトルデータベースに新しく Amazon OpenSearch Managed Cluster がサポートされました。

https://aws.amazon.com/jp/about-aws/whats-new/2025/03/amazon-bedrock-knowledge-bases-opensearch-cluster-vector-storage/

Amazon OpenSearch Managed Cluster

まず、 Amazon OpenSearch は、検索および分析エンジン OSS である OpenSearch を利用できるフルマネージドサービスです。

Amazon OpenSearch Managed Cluster は Amazon OpenSearch のデプロイ方法の 1 つで、OpenSearch Serverless とは違い、クラスターのインスタンスタイプやノード数などのインフラストラクチャの設定・管理を自分で行います。

その他の違いついては、以下のドキュメントにまとまっていますのでご覧ください。

https://docs.aws.amazon.com/ja_jp/opensearch-service/latest/developerguide/serverless-comparison.html

コスト

Amazon OpenSearch Serverless は OCU の利用料に基づいて課金が行われます。使用状況に応じて最大/最小 OCU の中から自動的に垂直スケーリングされるのは非常にメリットであるものの、ミニマムでも月額 $174 が発生します。それに比べ、OpenSearch Managed Cluster の場合、ミニマムでは $41 になります。

すべてがすべて安ければ良い!と言ったわけではないですが、 Amazon OpenSearch Serverless に比べて、無視できないくらいの価格差があるため、たとえば開発環境は OpenSearch Managed Cluster で運用するなどのコストカットが見込めます。

https://aws.amazon.com/jp/opensearch-service/pricing/

プラグイン

Amazon OpenSearch には形態素解析などのプラグインが用意されています。

日本語に有効な形態素解析プラグインには kuromojiSudachi が用意されています。

https://docs.aws.amazon.com/opensearch-service/latest/developerguide/supported-plugins.html

Amazon OpenSearch Serverless では kuromoji が利用可能となっていますが、 Sudachi は利用できません。

https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-genref.html#serverless-plugins

このように、他のプラグインを利用してみたいなどのケースでは OpenSearch Managed Cluster が選択肢に入ってくる可能性があります。

やってみた

実際に Amazon OpenSearch Managed Cluster を利用して、ナレッジベースをホストしてみます。

OpenSearch Managed Cluster では、認証認可にいくつかの仕組みがあるのですが、今回は以下のパターンで作成します。

  • きめ細やかなアクセスコントロール:有効
  • アクセスポリシー:すべて許可(きめ細やかなアクセスコントロール側で制御)
  • インデックスの管理:マスターユーザーから GUI で管理
  • ナレッジベースからの接続:きめ細やかなアクセスコントロールでサービスロールからのアクセスを許可する

ドメインの作成

まずはドメインの作成です。

OpenSearch コンソールからドメインの作成をクリックします。いくつかカスタマイズしたい項目があるため、標準作成をクリックします。検証のため、開発/テストのテンプレートを利用します。

2025-03-30 at 16.21.40-Amazon OpenSearch Service  ap-northeast-1.png

続いて、デプロイオプションです。今回はミニマムにこだわりたいため、スタンバイは無効、AZ 数は 1 つのクラスターを作成します。エンジンバージョンは、最新のものを選びます。

もし、バイナリエンベディングを行うのであれば v2.16 以上、k-NN インデックスを利用するのであれば、v2.13 以上が必要になります。

For Version, if you're using binary vector embeddings, Amazon Bedrock Knowledge Bases requires an Engine version of 2.16 or later. In addition, a version of 2.13 or higher is required to create a k-nn index. For more information, see K-NN Search in the Amazon OpenSearch Service developer guide.

Prerequisites for using a vector store you created for a knowledge base - Amazon Bedrock

2025-03-30 at 16.22.30-Amazon OpenSearch Service  ap-northeast-1.png

続いてインスタンスタイプとノード数の設定です。ノードは 1、インスタンスタイプも最小の t3.small.search を利用します。

2025-03-30 at 16.22.49-Amazon OpenSearch Service  ap-northeast-1.png

ストレージも最小の 10 GB を選択しました。

ネットワークです。

Amazon Bedrock Knowledge bases の場合、パブリックアクセスが必要になります。VPC でホスティングしないよう注意してください。

For Network, you must choose Public access. OpenSearch domains that are behind a VPC are not supported for your Knowledge Base.

きめ細やかなアクセスコントロールを利用します。 GUI で操作したいため、マスターユーザーを ID/Password で作成します。

Prerequisites for using a vector store you created for a knowledge base - Amazon Bedrock

2025-03-30 at 16.23.51-Amazon OpenSearch Service  ap-northeast-1.png

最後にアクセスポリシーです。認可はきめ細やかなアクセスコントロール(Fine-grained access control)側で制御するため、こちらはすべて許可で作成します。

2025-03-30 at 16.24.12-Amazon OpenSearch Service  ap-northeast-1.png

インデックスの作成

ドメインの作成が完了したのちに、OpenSearch Dashboards の URL (デュアルスタック) から OpenSearch へアクセスします。

2025-03-30 at 16.45.32-Amazon OpenSearch Service  ap-northeast-1.png

作成したマスターユーザー名でログインします。

2025-03-30 at 16.45.52-OpenSearch Dashboards.png

インデックスの作成を行うために Dev Tools を開きます。

2025-03-30 at 16.46.22-Home - OpenSearch Dashboards.png

次のクエリを流します。dimension の部分は、エンベディングモデルの次元数に沿った値を設定します。(今回は Titan Text Embeddings V2 を利用します。)

インデックス名(blog-index)やフィールド名(blog-vector, AMAZON_BEDROCK_METADATA, AMAZON_BEDROCK_TEXT_CHUNK)は適宜好きな名前に修正しましょう。

PUT /blog-index
{
    "settings": {
        "index": {
            "knn": true
        }
    },
    "mappings": {
        "properties": {
            "blog-vector": {
                "type": "knn_vector",
                "dimension": 1024,
                "space_type": "l2",
                "method": {
                    "name": "hnsw",
                    "engine": "faiss",
                    "parameters": {
                        "ef_construction": 128,
                        "m": 24
                    }
                }
            },
            "AMAZON_BEDROCK_METADATA": {
                "type": "text",
                "index": "false"
            },
            "AMAZON_BEDROCK_TEXT_CHUNK": {
                "type": "text",
                "index": "true"            
            }
        }
    }
}

Prerequisites for using a vector store you created for a knowledge base - Amazon Bedrock

ステータスコードに 200 が返ってきていたら OK です。

2025-03-30 at 16.48.03-Dev Tools - OpenSearch Dashboards.png

試しに GET してみましたが、うまく作成できているようです。

GET /blog-index

2025-03-30 at 16.48.36-Dev Tools - OpenSearch Dashboards.png

S3 バケットの作成

画面を行き来しますが、RAG 用の元データを保管する用の S3 バケットを作成しましょう。

今回は桃太郎の内容を S3 バケットに保管しました。

https://github.com/takakuni-classmethod/genai-blog/tree/main/サンプルドキュメント/momotarou

2025-03-30 at 17.10.09-kb-opensearch-managed-cluster-622809842341 - S3 バケット  S3  ap-northeast-1.png

IAM

ナレッジベース用の IAM ロールを作成します。信頼ポリシーは以下を設定します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AmazonBedrockKnowledgeBaseTrustPolicy",
            "Effect": "Allow",
            "Principal": {
                "Service": "bedrock.amazonaws.com"
            },
            "Action": "sts:AssumeRole",
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "アカウントID"
                },
                "ArnLike": {
                    "aws:SourceArn": "arn:aws:bedrock:リージョン:アカウントID:knowledge-base/*"
                }
            }
        }
    ]
}

2025-03-30 at 16.49.39-ロールを作成  IAM  Global.png

IAM ポリシー

以下のポリシーを設定します。

AmazonBedrockFoundationModelPolicyForKnowledgeBase.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "BedrockInvokeModelStatement",
            "Effect": "Allow",
            "Action": [
                "bedrock:InvokeModel"
            ],
            "Resource": [
                "arn:aws:bedrock:ap-northeast-1::foundation-model/モデルID"
            ]
        }
    ]
}
AmazonBedrockManagedOSPolicyForKnowledgeBase.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "OpenSearchManagedClusterIndexAccess",
            "Effect": "Allow",
            "Action": [
                "es:ESHttpGet",
                "es:ESHttpPost",
                "es:ESHttpPut",
                "es:ESHttpDelete"
            ],
            "Resource": [
                "arn:aws:es:ap-northeast-1:アカウントID:domain/ドメイン名/インデックス名/*"
            ]
        },
        {
            "Sid": "OpenSearchManagedClusterGetIndexAccess",
            "Effect": "Allow",
            "Action": [
                "es:ESHttpGet",
                "es:ESHttpHead"
            ],
            "Resource": [
                "arn:aws:es:ap-northeast-1:アカウントID:domain/ドメイン名/インデックス名"
            ]
        },
        {
            "Sid": "OpenSearchManagedClusterDomainValidation",
            "Effect": "Allow",
            "Action": [
                "es:DescribeDomain"
            ],
            "Resource": [
                "arn:aws:es:ap-northeast-1:アカウントID:domain/ドメイン名"
            ]
        }
    ]
}
AmazonBedrockS3PolicyForKnowledgeBase.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "S3ListBucketStatement",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::バケット名"
            ],
            "Condition": {
                "StringEquals": {
                    "aws:ResourceAccount": [
                        "アカウントID"
                    ]
                }
            }
        },
        {
            "Sid": "S3GetObjectStatement",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::バケット名/*"
            ],
            "Condition": {
                "StringEquals": {
                    "aws:ResourceAccount": [
                        "アカウントID"
                    ]
                }
            }
        }
    ]
}

きめ細やかなアクセスコントロール

後半戦です。OpenSearch 側で先ほど作成した IAM ロールからのアクセスを許可します。

https://docs.aws.amazon.com/bedrock/latest/userguide/kb-osm-permissions-console-fgap.html

再度 OpenSearch ダッシュボードに戻り、 Security をクリックします。

2025-03-30 at 17.13.19-Home - OpenSearch Dashboards.png

ロールを作成します。

2025-03-30 at 17.14.45-OpenSearch Dashboards.png

ロール名には kb_opensearch_role と言った任意の名前を付与し、クラスターの権限には以下を追加します。

  • indices:data/read/msearch
  • indices:data/write/bulk*
  • indices:data/read/mget*

2025-03-30 at 17.16.32-OpenSearch Dashboards.png

続いてインデックスに対する権限を付与します。アクショングループを新規で作成し、ロール名に紐づけます。再度、Security から Permission へ移り、Create from blank をクリックします。

2025-03-30 at 17.18.11-OpenSearch Dashboards.png

アクショングループ名にも任意の名前(KnowledgeBasesActionGroup)を付与し、権限は以下を追加します

  • indices:admin/get
  • indices:data/read/msearch
  • indices:data/read/search
  • indices:data/write/index
  • indices:data/write/update
  • indices:data/write/delete
  • indices:data/write/delete/byquery
  • indices:data/write/bulk*
  • indices:admin/mapping/put
  • indices:data/read/mget*

2025-03-30 at 17.19.38-OpenSearch Dashboards.png

ロールとアクショングループを紐付けます。Security から Roles を開き、先ほど作成したロールを選択したのちに Edit をクリックします。

2025-03-30 at 17.20.18-OpenSearch Dashboards.png

インデックス名(blog-index)、アクショングループの組み合わせで、ロールへ権限を付与します。

2025-03-30 at 17.20.56-OpenSearch Dashboards.png

最後に OpenSearch で作成したロールと、IAM ロールを紐付けます。Mapped users からロールをマッピングします。

2025-03-30 at 17.21.54-OpenSearch Dashboards.png

Backend roles に IAM ロールの ARN を入力し、保存します。

2025-03-30 at 17.23.28-OpenSearch Dashboards.png

ナレッジベースの作成

最後のステップです。ナレッジベースの作成を行います。まずは先ほど作成した IAM ロールを利用するよう変更します。

2025-03-30 at 17.23.55-Amazon Bedrock  ap-northeast-1.png

S3 も先ほど作成したバケットを選びます。

2025-03-30 at 17.24.16-Amazon Bedrock  ap-northeast-1.png

エンベディングモデルとベクトルデータベースを選びます。OpenSearch Managed Cluster が出現していますね。

2025-03-30 at 17.24.32-Amazon Bedrock  ap-northeast-1.png

ドメイン ARN やエンドポイント、インデックス名、フィールド名と入力項目が多いですが、対応する値を入力して作成をクリックします。

2025-03-30 at 17.25.15-Amazon Bedrock  ap-northeast-1.png

2025-03-30 at 17.25.29-Amazon Bedrock  ap-northeast-1.png

作成できたらデータソースの同期を行いましょう。

2025-03-30 at 17.33.00-Knowledge Base  AmazonBedrock  ap-northeast-1.png

うまく同期できました。

2025-03-30 at 17.33.26-Knowledge Base  AmazonBedrock  ap-northeast-1.png

質問をするとうまく返ってきていますね。また、OpenSearch 特有のハイブリッド検索も問題なく利用できそうです。

2025-03-30 at 17.35.16-Amazon Bedrock  ap-northeast-1.png

まとめ

以上、「Amazon Bedrock Knowledge bases のベクトルデータベースに新しく Amazon OpenSearch Managed Cluster がサポートされました。」でした。

プラグインなどのカスタマイズ性に加え、コスト感もグッと抑えられる部分は非常に魅力的ですね。

このブログがどなたかの参考になれば幸いです。クラウド事業本部コンサルティング部のたかくに(@takakuni_)でした!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.