はじめに
Amazon Bedrock で RAG (検索拡張生成) を利用した生成 AI アプリを作成しようとする場合、VectorStore にはAWS サービスでフルマネージドで利用できる Amazon OpenSearch Serverless の利用が考えられます。
LangChain は、生成 AI の汎用的なフレームワークであり、Amazon Bedrock や OpenSearch に対するラップを提供しており、生成 AI 作成に注力できる強力なフレームワークです。
今回、公式の手順に従い LangChain VectorStore と、OpenSearch Serverless の連携を試したところ、接続に失敗しました。
検索して、英語情報も含めて原因を調査しましたが情報がなかったため、ここに記録を残します。
記載しないこと
以下の内容は、各論に入るためこの記事では触れません。
- 個々のサービス (LangChain、OpenSearch Serverless ) に対する詳細
- AWS IAM や OpenSearch AccessPolicy の詳細
事象の詳細
Vector Store OpenSearch を参考に以下のようなコードを生成しました。
import { Client } from '@opensearch-project/opensearch'; import { OpenSearchVectorStore } from "@langchain/community/vectorstores/opensearch"; // Create OpenSearch Client const client = new Client({ nodes: [process.env.OPEN_SEARCH_ENDPOINT], }); // Access for Document const embeddings = new BedrockEmbeddings({ model: "amazon.titan-embed-text-v1" }); await OpenSearchVectorStore.fromDocuments(docs, embeddings, { client, indexName: "documents", service: "aoss", });
このコードでアクセスする際、以下のようなエラーで検知されます。
ERROR Invoke Error {"errorType":"ResponseError","errorMessage":"Forbidden","name":"ResponseError","meta":{"body":{"status":403, "request-id":"9a372a0c-a67e-9b5c-a5c8-3cdbdcd3782a","error":{"reason":"403 Forbidden","type":"Forbidden"}},"statusCode":403,"headers" :{"x-request-id":"9a372a0c-a67e-9b5c-a5c8-3cdbdcd3782a","content-type":"application/json","x-aoss-response-hint":"X01:gw-helper-deny" ,"content-length":"121","date":"Mon, 12 May 2025 08:34:19 GMT","server":"aoss-amazon"},"meta":{"context":null,"request": {"params":"method":"GET","path":"/_cat/indices/documents","querystring":"","body":"","headers":{"user-agent":"opensearch-js/3.5.1 (linux 5.10.236-248.928.amzn2.x86_64-x64; Node.js v22.14.0)"},"timeout":30000},"options":{},"id":1},"name":"opensearch-js","connection": {"url":"https://xxxxxxxxxxxxx.ap-northeast-1.aoss.amazonaws.com/","id":"https://xxxxxxxxxxxxx.ap-northeast-1.aoss.amazonaws.com/", "headers":{},"deadCount":0,"resurrectTimeout":0,"_openRequests":0,"status":"alive","roles":{"data":true,"ingest":true}},"attempts":0, "aborted":false}},"stack":["ResponseError: Forbidden"," at onBody (/deps/795ab53c-e5b5-474c-932e-2ea23020e5c8/node_modules/ @opensearch-project/opensearch/lib/Transport.js:426:23)"," at err (/deps/795ab53c-e5b5-474c-932e-2ea23020e5c8/node_modules/ @opensearch-project/opensearch/lib/Transport.js:341:11)"," at IncomingMessage.emit (node:events:530:35)"," at endReadableNT (node:internal/streams/readable:1698:12)"," at process.processTicksAndRejections (node:internal/process/task_queues:90:21)"]}
OpenSearch Serverless に関する下記のような情報を参考にしましたが、解決には至りませんでした。
- Opensearch Serverless Resource throwing a 403 forbidden error
- Access denied in OpenSearch Serverless
解決方法
本質的な問題は、OpenSearch 用の Client
が AWS Signature v4 で署名されていないことによるものです。
そのため、認可情報 ( aoss:*
) や、LangChain の Issue を調査しても解決しません。
Authenticating with Amazon OpenSearch Service: AWS Signature Version 4 にある、OpenSearch Client の AWS Signature v4 署名が最も解決に近いです。
正常な動作のコードは以下のとおりです。
import { Client } from '@opensearch-project/opensearch'; import { AwsSigv4Signer } from '@opensearch-project/opensearch/aws'; import { defaultProvider } from "@aws-sdk/credential-provider-node"; // Create OpenSearch Client const client = new Client({ nodes: [process.env.OPEN_SEARCH_ENDPOINT], ...AwsSigv4Signer({ region: "ap-northeast-1", service: "aoss", getCredentials: defaultProvider(), }) }); // Access for Document const embeddings = new BedrockEmbeddings({ model: "amazon.titan-embed-text-v1" }); await OpenSearchVectorStore.fromDocuments(docs, embeddings, { client, indexName: "documents", service: "aoss", });
OpenSearch の Client を初期化する際に、AwsSigv4Signer
と service: "aoss"
を提供します。
aoss は、Amazon OpenSearch Serverless のことを示します。
これにより、通信を AWS Signature v4 で署名し、OpenSearch Serverless の VectorStore を利用することができるようになります。
おわりに
このエラーは、調査しましたが直接的な原因や、その解決方法について言及している記事がなく、解決に時間がかかりました。
この記事が、同様の構成において助けになれば幸いです。