Cloudflare R2をHonoから利用する方法
CloudflareのオブジェクトストレージサービスR2を使用してVectorデータのストア先を試した結果、ストレージの作り方に手間取ったが、手順をまとめる。R2バケットはWraglerから作成可能。ローカル開発環境では2つのバケットが必要。プレビュー用のR2バケットを作成し、WranglerでアプリのBindingsに追加する。HonoからR2バケットを呼び出す方法についても解説。ただし、R2にJSONデータを配置する方法は効率的ではなく、Cloudflare Vectorizeなど他のベクターストアを使用することが推奨される。しかし、R2バケットの扱い方は覚えたので結果は良い。
目次
Cloudflareのオブジェクトストレージサービス R2 を、RAGなどに使うVectorデータのストア先に試していました。その際、ストレージの作り方などを思い出すのに手間取ったので、覚書として手順を簡単にまとめます。
R2バケットはWraglerから作成できる
ドキュメントに案内がないことがあるので、プレビュー・・・なのかもしれませんが、作成するコマンドは2023/10時点で存在します。
% wrangler r2 bucket create <BUCKET_NAME>
Creating bucket <BUCKET_NAME>.
Created bucket <BUCKET_NAME>.
wrangler dev
などでローカル・開発環境からR2を使うには、2つバケットが必要な様子です。
✘ [ERROR] In development, you should use a separate r2 bucket than the one you'd use in production.
プレビュー用のR2バケットを作ります。作成自体の設定は同じで良い様子でしたので、preview
とかdev
とかのプレフィックス・サフィックスをつけると良いかと思います。
% wrangler r2 bucket create <YOUR_PREVIEW_BUCEKT_NAME>
Creating bucket <YOUR_PREVIEW_BUCEKT_NAME>.
Created bucket <YOUR_PREVIEW_BUCEKT_NAME>.
WranglerでアプリのBindingsに追加します。
wrangler.toml
[[r2_buckets]]
binding = 'BINDING_NAME'
bucket_name = '<YOUR_BUCKET_NAME>'
preview_bucket_name = '<YOUR_PREVIEW_BUCEKT_NAME>'
HonoからR2バケットを呼び出す方法
Honoでは、c.env[R2バケットのBinding名]
からAPIを呼び出せます。ただしTypeScriptの場合は、次のように型定義を追加してやる必要があります。 npx create-hono
を実行している場合は、R2Bucket
の型情報をimport
する必要はありません。
const app = new Hono<{
Bindings: {
<YOUR_BUCKET_NAME>: R2Bucket
}
}>()
あとはget
で取得し、put
で更新するだけです。
app.get('/', async (c) => {
const jsonData = await c.env.LANGCHAIN_VC_STORE.get('demo.json')
const parsedItems = jsonData ? await jsonData?.json() : []
await c.env.LANGCHAIN_VC_STORE.put('demo.json', JSON.stringify(parsedItems))
return c.status(201)
})
おわりに
詳細は別ブログにするつもりですが、Vector StoreとしてR2にJSONデータを配置する方法はお勧めできない結果でした。JSONを読み込んで、LangChainのMemoryVectorStore
に入れてをリクエストの度にやるのはかなり非効率で、キャッシュするとかの方法を試すよりは、おとなしくCloudflare Vectorizeなどのベクターストアを使うほうが良さそうです。
とはいえ、R2バケットの扱い方を覚えることはできたので、結果オーライではあります。