Vercel Storage を Go で扱う
はじめに
Vercel に Go が無料でデプロイできることを下記の記事にて紹介しました。
Vercel には 2023.05 に発表され利用可能となったデータ保存に関するサービスがいくつかあります。
これらのサービスも制限はあるものの無料で利用することが可能です。
JavaScript (TypeScript) の場合は公式から各種 SDK が提供されているので簡単に扱うことが可能です。
しかし、Go には SDK の提供がありません。
今回はそんな Vercel × Go における開発で Vercel Storage を扱う方法についてご紹介します。
※ Vercel Functions じゃなくてもそれぞれの Storage は触れるので今回はローカルマシンから各リソースへとアクセスしています。
※ 各種環境変数に設定している値は Vercel ダッシュボードにて Storage を作成したときに設定されているものです。
version
go version
go version go1.22.5 darwin/arm64
vercel --version
Vercel CLI 34.3.1
34.3.1
Vercel Storage とは?
Store key-value data, transactional data, large files, and more with Vercel's suite of storage products.
Vercel KV, Vercel Postgres, Vercel Blob, Vercel Edge Config からなる Vercel でデータ永続化を行うことができるサービス群です。
Vercel KV は Key/Value と JSON データを扱えます。
Vercel Postgres は構造化されたリレーショナル・データ (SQL) を扱えます。
Vercel Blob は大容量ファイル (blobs) を扱えます。
Vercel Edge Config はリードオンリーなデータストアでランタイム用の設定 (feature flags) などを扱えます。
Vercel KV
Vercel KV は Redis の互換性があります。
Vercel KV でサポートされているコマンドは以下の公式サイトから確認できます。
以下のような実装を用いて Go にて操作することが可能です。
.env
KV_URL=redis://${user}:${token}@${host}:${port}
※ URL を見て気づいたのですが Vercel KV の実態は Upstash というサービスみたいです。
redis/go-redis を利用する場合
redis/rueidis を利用する場合
Vercel Postgres
Vercel Postgres はその名の通り PostgreSQL として扱うことができます。
以下のような実装を用いて Go にて操作することが可能です。
.env
POSTGRES_URL=postgres://${user}:${password}@${host}:${port}/${database}?sslmode=require
※ URL を見て気づいたのですが Vercel Postgres の実態は Neon というサービスみたいです。
lib/pq を利用する場合
jackc/pgx を利用する場合
Vercel Blob
Vercel Blob についてはほか機能との互換性などが確認できませんでした。
公式サイトに REST API でアクセスするための情報も記載されていなかったので公式が配布している TypeScript 製の vercel/storage を参考にして Go から操作できるか試してみました。
以下のような実装を用いて Go にて操作することが可能です。
アップロード・メタデータの取得・ダウンロード・削除 機能を実装してみました。
.env
BLOB_READ_WRITE_TOKEN=xxxxxxxxxx
Vercel Edge Config
Vercel Edge Config については公式サイトに REST API にてアクセスする方法が記載されていました。
以下のような実装を用いて Go にて操作することが可能です。
取得・全件取得を実装してみました。
.env
EDGE_CONFIG_ID=xxxxxxxxxx
EDGE_CONFIG_TOKEN=xxxxxxxxxx
おわりに
KV と Postgres については既存のミドルウェアと互換性があるので Go からでも簡単に扱うことができます。
一方で Blob と Edge Config については REST API にアクセスすることで Go から扱うことができます。
今回試したコードは以下に置いておきます。
Discussion