はじめに

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 用の 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 を初期化する際に、AwsSigv4Signerservice: "aoss" を提供します。
aoss は、Amazon OpenSearch Serverless のことを示します。

これにより、通信を AWS Signature v4 で署名し、OpenSearch Serverless の VectorStore を利用することができるようになります。

おわりに

このエラーは、調査しましたが直接的な原因や、その解決方法について言及している記事がなく、解決に時間がかかりました。

この記事が、同様の構成において助けになれば幸いです。