🐁

Vercel Storage を Go で扱う

2024/07/21に公開

はじめに

Vercel に Go が無料でデプロイできることを下記の記事にて紹介しました。

https://zenn.dev/otakakot/articles/9e9269a87aafeb

Vercel には 2023.05 に発表され利用可能となったデータ保存に関するサービスがいくつかあります。

https://x.com/vercel/status/1653066949335695360

これらのサービスも制限はあるものの無料で利用することが可能です。
JavaScript (TypeScript) の場合は公式から各種 SDK が提供されているので簡単に扱うことが可能です。

https://vercel.com/docs/storage/vercel-kv/kv-reference
https://vercel.com/docs/storage/vercel-postgres/sdk
https://vercel.com/docs/storage/vercel-blob/using-blob-sdk
https://vercel.com/docs/storage/edge-config/edge-config-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 とは?

https://vercel.com/docs/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 でサポートされているコマンドは以下の公式サイトから確認できます。

https://vercel.com/docs/storage/vercel-kv/redis-compatibility

以下のような実装を用いて Go にて操作することが可能です。

.env
KV_URL=redis://${user}:${token}@${host}:${port}

※ URL を見て気づいたのですが Vercel KV の実態は Upstash というサービスみたいです。

redis/go-redis を利用する場合

https://github.com/otakakot/sample-go-vercel-storage/blob/main/cmd/kv/goredis/main.go

redis/rueidis を利用する場合

https://github.com/otakakot/sample-go-vercel-storage/blob/main/cmd/kv/ruedis/main.go

Vercel Postgres

Vercel Postgres はその名の通り PostgreSQL として扱うことができます。

以下のような実装を用いて Go にて操作することが可能です。

.env
POSTGRES_URL=postgres://${user}:${password}@${host}:${port}/${database}?sslmode=require

※ URL を見て気づいたのですが Vercel Postgres の実態は Neon というサービスみたいです。

lib/pq を利用する場合

https://github.com/otakakot/sample-go-vercel-storage/blob/main/cmd/postgres/pq/main.go

jackc/pgx を利用する場合

https://github.com/otakakot/sample-go-vercel-storage/blob/main/cmd/postgres/pgx/main.go

Vercel Blob

Vercel Blob についてはほか機能との互換性などが確認できませんでした。
公式サイトに REST API でアクセスするための情報も記載されていなかったので公式が配布している TypeScript 製の vercel/storage を参考にして Go から操作できるか試してみました。

以下のような実装を用いて Go にて操作することが可能です。
アップロード・メタデータの取得・ダウンロード・削除 機能を実装してみました。

.env
BLOB_READ_WRITE_TOKEN=xxxxxxxxxx

https://github.com/otakakot/sample-go-vercel-storage/blob/main/cmd/blob/main.go

Vercel Edge Config

Vercel Edge Config については公式サイトに REST API にてアクセスする方法が記載されていました。

https://vercel.com/docs/storage/edge-config/vercel-api

以下のような実装を用いて Go にて操作することが可能です。
取得・全件取得を実装してみました。

.env
EDGE_CONFIG_ID=xxxxxxxxxx
EDGE_CONFIG_TOKEN=xxxxxxxxxx

https://github.com/otakakot/sample-go-vercel-storage/blob/main/cmd/config/main.go

おわりに

KV と Postgres については既存のミドルウェアと互換性があるので Go からでも簡単に扱うことができます。
一方で Blob と Edge Config については REST API にアクセスすることで Go から扱うことができます。

今回試したコードは以下に置いておきます。

https://github.com/otakakot/sample-go-vercel-storage

Discussion