🎏

無料で使えるデータベースUpstashをご存知、ないのですか!?

2022/05/05に公開

Intro

最近とあるデータベースに関する記事を読んだのですが、Upstashについて誰も言及しておらずヤバいなと思ったので紹介することにしました。
ちなみに私も今日はじめてアカウント登録するのでご安心ください。
ゴールデンウィークは色々始めたくなるものです。

https://upstash.com/

Upstashはサーバーレスデータベースを提供するサービスです。
Redisを主に扱っていますが一応Kafkaも使うことができます。
詳しく調べた感じだともう一つぐらい使えるデータベースが増えそうな気がしたので様子見していたのですが、
3月中旬に約2.3億円の資金調達を行いしばらくは既存サービスの強化を行うようなのでとりあえず使ってみることにします。

Upstash

https://docs.upstash.com/redis/features/durability

様々な特徴がありますが特筆すべき点として、AOFモードで永続性が常に有効になっている点が挙げられます。
つまりRedisでありがちなキャッシュやエフェメラル用途で使えるだけでなく、SQLiteやMongoDBのようにデータを保存しておけるちゃんとしたデータベースとして使えるわけですね。

https://docs.upstash.com/redis/overall/pricing

至って普通の制限あり無料プランと従量課金制プランが用意されています。
トップページには無料(クレジットカード不要)と親切に書かれており、一日のコマンド制限は10000回。
この10000回というのはリージョンを固定した場合の制限であり、グローバルを選んだ場合は2000回になります。
東京リージョンがあるので国内で回すだけならシングルリージョンでいいのではないでしょうか。
その他にもマルチゾーンを選択できなかったりシングルリージョンデータベースの合計が256Mbまでといった制限もあります。

もう一つ特筆すべき特徴として、従量課金制プランでは一日のコマンド無制限と書いてありますが月額価格には制限があるため青天井にならないという点があります。
AWSで風物詩となりつつあるパスワードやアクセスキーが流出して無限にコマンドを叩かれ数百万円の請求が来たみたいなことがないため安心して使うことができますね。

前置きが長くなりましたが早速アカウント登録して使ってみましょう。

Start

upstash

「Start free in 30 seconds」ボタンを押します。
はーい、よーいスタート。

signup

Amazon, GitHub, GoogleアカウントでSSO可能なログインページ。
Sign Upタブを選択しサインアップしましょう。

console

突然紙吹雪が舞ってびっくりした後の画面です。
「Create database」ボタンを押します。

create

データベース名を入力して、RegionalのままRegionはAP-NORTH-EAST-1 (Japan)を選択。
TLS/SSLはあったほうが安心できるので有効にしておきます。
強一貫性モードは今回必要ないのでそのままで。
最後に「Create」ボタンを押し数秒待ちます。

redis

データベースができました。
少しガバが発生したので記録は35秒でした。

Redis

ありとあらゆる手段で接続できることをアピールしてくるので接続しましょう。
今回はNode.jsとnpmを起動するのがめんどいのでDenoを使います。

import { Redis } from "https://deno.land/x/upstash_redis/mod.ts";

const redis = new Redis({
  url: "", // UPSTASH_REDIS_REST_URL
  token: "", // UPSTASH_REDIS_REST_TOKEN
});

const data = await redis.incr("count");
console.log(data);

countがインクリメントするやつを書きました。

$ deno run --allow-net index.ts
...
1

$ deno run --allow-net index.ts
2

$ deno run --allow-net index.ts
3

増えていることが分かります。
簡単ですね。

実はUpstashではもっと簡単にRedisにアクセスすることができます。
それがこちら、REST APIです。

$ curl -H "Authorization: Bearer <UPSTASH_REDIS_REST_TOKEN>" <UPSTASH_REDIS_REST_URL>/incr/count

今回はcurlを使いますがwgetでもaxiosでもfetchでもなんでもいいです。

$ curl -H "Authorization: Bearer <UPSTASH_REDIS_REST_TOKEN>" <UPSTASH_REDIS_REST_URL>/incr/count
{"result":4}
$ curl -H "Authorization: Bearer <UPSTASH_REDIS_REST_TOKEN>" <UPSTASH_REDIS_REST_URL>/incr/count
{"result":5}
$ curl -H "Authorization: Bearer <UPSTASH_REDIS_REST_TOKEN>" <UPSTASH_REDIS_REST_URL>/incr/count
{"result":6}

増えていることが分かります。
もっと簡単ですね。

https://docs.upstash.com/redis/overall/rediscompatibility
https://docs.upstash.com/redis/features/restapi

その他にもredis-cliを使ったりredis-pyのようなRedisクライアントを使用してアクセスすることもできます。
ただサーバーレスで動いているRedisのため一部使用できないコマンドがあり、REST APIの場合更に一部使用できないコマンドがあります。
詳しくはドキュメントに書いてあります。

https://docs.upstash.com/redis/sdks/javascriptsdk/getstarted

また、TCP接続を許可しない環境ではRedisクライアントを使用しても接続できないケースもあります。
その場合はDenoでもインポートした公式SDKを使用する必要があります。

さて、このように一風変わったデータベースですが一体どのようなメリットがあるのでしょうか?
単に無料だから使うのでしょうか?

Edge

https://upstash.com/cloudflareworkers
https://docs.upstash.com/redis/howto/connectwithupstashredis

まず何といっても魅力的なのはREST APIで使えるところです。
公式でもCloudflare Workersで使えることをこれでもかというぐらい推していて、Edgeで使えるデータベースとして非常に強力な機能を持ちます。
Cloudflare Workersのほかに公式では以下のサービスで使えることを紹介しています。

  • Serverless functions (AWS Lambda ...)
  • Fastly Compute@Edge
  • Next.js, Jamstack ...
  • Client side web/mobile applications
  • WebAssembly
  • and other environments where HTTP is preferred over TCP.

ちなみに私はVercelで知りました。UpstashはVercelのCEOであるGuillermo Rauchが投資をしていて、VercelのIntegrationsからも使うことができます。
また今回紹介したように公式SDKはNode.jsだけでなく、Denoにも対応しているため、Deno DeployやNetlify Edge Functionsでも動きます。

でもよく考えてみたらそういったサービスで動くデータベースは他にもたくさんあるし、Upstashを優先的に使う必要ないのでは?
と一瞬思うかもしれませんが、その点についてもちゃんと公式で言及しているんですね。

https://docs.upstash.com/redis/overall/compare

UpstashはRedis Labsなどと比較するとサーバーレス価格、REST API、アクセス、耐久性に優れており、AWS DynamoDBなどと比較するとレイテンシー、複雑な価格設定、ポータビリティ、テスト容易性に優れているようです。
今まで紹介した内容を見ると確かに納得できます。

メリットの多くはRedisの長所をさらに伸ばし、短所を長所に変えることで実現しているんですね。
軽くて早いRedisはNoSQLのため独特のコマンドを覚える必要があり好んで使う人は少ないと思いますが、常時データベースが待機しているわけではなくコマンドを叩くたびに料金が発生する仕組みで非常に安価なサービスを提供でき、
コマンドをREST APIに変換することでどうやってもデータベースを組み込めないサービスにまでデータベースを組み込めることを可能にしています。

また、Redisのデータ永続化はUpstashに限った機能ではなく、RDBモードとAOFモードを使うことでSQLiteにおける.dbファイルや.sqlファイルのように
Redisから.rdbファイルや.aofファイルを出力し、バックアップすることができます。

Redisは様々なOSで簡単にビルドできたり公式でDockerイメージを提供していますし、Upstashに似たサービスのRedis Labsも公式で提供しているためポータビリティ性能が非常に優れています。

https://zenn.dev/tkithrta/articles/fb2b182dd88d91

以前私はオフラインのRaspberry Pi ZeroでRedisをビルドしたことがあります。

Outro

いかがでしたか?
他にも紹介したい内容は山ほどあるのですが、私自身使い始めたばかりですので、ぜひ一緒に使ってUpstashを使うメリット、Redisのデータ永続化に関するナレッジを共有しましょう。

Discussion