Upstash(アップスタッシュ)は、Redis互換のデータベースをサーバーレスで提供するサービスです。コマンド数に応じた従量課金と固定月額のプランがあり、HTTP経由でも接続できます。そのため、TCP接続を張りっぱなしにしにくいCloudflare WorkersやVercelの関数から扱いやすいのが特徴です。
この記事では、2026年9月時点の料金と無料枠、固定プランに切り替える目安、東京リージョンの選び方、Cloudflare Workers・Vercelからの接続方法を、公式ドキュメントの記載と実行したコードで確認しながら解説します。コード例は@upstash/redis 1.39.0と@upstash/ratelimit 2.2.0を使っています。キャッシュとレート制限の例は実際のデータベースに対して実行し、Cloudflare Workersの例はTypeScriptの型検査で確認しました。
まとめ:Upstash Redisの料金と向いている用途
- 無料枠:データ256MB・月50万コマンド・月10GBの帯域まで無料。作れるデータベースは1つです。
- 従量課金:10万コマンドあたり0.20ドル。追加リージョンがなく、データ250MB・月間帯域50GB以内なら、月500万コマンド超で固定250MBプラン(月10ドル)が割安になります。
- 接続方法:REST APIとRedisプロトコル(TCP)の両方に対応。Cloudflare WorkersやVercelでは、HTTPで接続する@upstash/redisを使うのが基本です。
- 東京リージョン:AWSの東京(ap-northeast-1)とGoogle Cloudの東京(asia-northeast1)を選べます。書き込みが多い場所をプライマリにします。
- 向かない用途:強い整合性が必要な処理、秒間1万コマンドを超える常時高負荷、AWSのVPC内で完結する構成。この3つはElastiCacheなどを先に検討します。
Upstashの製品構成とRedis互換の範囲
Upstashは「サーバーレスデータプラットフォーム」を名乗っています。中心となるのはRedisですが、2026年9月時点では次の7製品を提供しています。課金単位は製品によって異なり、リクエスト数のほか、保存量やCPU稼働時間でも課金されます。固定プランや保存料金は、リクエストがない期間にも発生します。
| 製品 | 用途 | 従量課金の単価 |
|---|---|---|
| Redis | キャッシュ・セッション・レート制限 | 0.20ドル/10万コマンド |
| Vector | 埋め込みベクトルの類似検索(RAG) | 0.40ドル/10万リクエスト |
| Upstash Search | 全文検索・ハイブリッド検索(プレビュー) | 0.05ドル/1,000リクエスト |
| QStash | HTTPメッセージ配信・遅延実行・cron | 1ドル/10万メッセージ |
| Workflow | 複数ステップの処理をサーバーレスで実行 | 1ドル/10万ステップ |
| Box | AIエージェント向けの隔離サンドボックス | 0.10〜0.40ドル/CPU時間 |
| Blob | ファイル保存(S3互換API・CDN配信) | 公式の料金ページで確認 |
検索でUpstashにたどり着く人の多くが探しているのはRedisです。この記事でも、以降はUpstash Redisを中心に説明します。QStashの無料枠は1日1,000メッセージ、Vectorの無料枠はクエリと更新の合計が1日1万回、データ・メタデータが1GBまでです。ベクトル数×次元数には2億の上限もあります。
Redis 8.4互換とSEARCH・VECTORの独自コマンド
公式のRedis互換性ドキュメントでは、Redisクライアントプロトコルへの対応はバージョン8.4までとされています。実際に無料の一時データベースでINFO serverを実行すると、redis_version:8.4.0が返りました。SETやINCRのような通常のコマンドは、ioredisやredis-cliなど既存のクライアントからTCPでそのまま使えます。
独自のコマンドもあります。SEARCH.*(JSON・ハッシュの全文検索)とVECTOR.*(近傍検索)です。ただしSEARCH.*はRediSearchのFT.*コマンドとは互換性がありません。RediSearchを前提に書かれたコードは、そのままでは移せない点に注意してください。
Upstash Redisの料金と無料枠(2026年9月時点)
プランは「無料」「従量課金(Pay as You Go)」「固定(Fixed)」「Enterprise」の4種類です。本番環境向けの機能は、有料プランに付け足すアドオン「Prod Pack」にまとめられています。以下の数値は2026年9月26日時点のUpstash Redisの公式料金ページに基づきます。
無料枠の上限と有料プランへの切り替え
| 項目 | 無料 | 従量課金 |
|---|---|---|
| データサイズ上限 | 256MB | 100GB |
| コマンド数 | 月50万まで | 無制限(0.20ドル/10万) |
| 帯域 | 月10GB | 月200GBまで無料、超過分は0.03ドル/GB |
| 秒間コマンド数の上限 | 10,000 | 10,000 |
| リクエストの最大サイズ | 10MB | 10MB |
| データベース数 | 1 | 100(11個目から1個0.5ドル) |
| IP許可リスト・ACL | なし | あり |
クレジットカードを登録すると、データベースは従量課金プランに切り替わります。このとき注意したいのは、有料プランでは無料枠が差し引かれないことです。公式FAQでも、有料にした後は最初の256MBや50万コマンドも課金対象になると書かれています。
試作段階なら、サインアップ不要の一時データベースもあります。https://upstash.com/start-redisにPOSTするだけで、接続情報が発行されます。コンソールで引き取らなければ3日後に削除されるので、本番データは入れないでください。
従量課金の計算例と課金されないコマンド
従量課金は、コマンド料金に、全レプリカ・リージョンの合計保存量に対するストレージ料金、無料帯域超過分、追加DB・アドオン等の料金を合算します。1リクエストでGETとSETを1回ずつ実行するAPIを想定すると、コマンド料金は次のようになります(保存量1GB以内・帯域200GB以内で、追加料金が発生しない場合)。
| 月間リクエスト | コマンド数 | 従量課金の月額 | 固定250MB |
|---|---|---|---|
| 10万 | 20万 | 0.40ドル | 10ドル |
| 100万 | 200万 | 4ドル | 10ドル |
| 250万 | 500万 | 10ドル | 10ドル |
| 1,000万 | 2,000万 | 40ドル | 10ドル |
損益分岐はちょうど月500万コマンドです。ただし固定250MBプランは帯域が月50GBまでなので、平均10KBの値を読むAPIなら500万回で上限に達します。値の大きさも含めて試算してください。
AUTH・PING・INFO・SELECT・CONFIGなどの運用系コマンドは課金されません。一方、後述のGlobal Databaseでは、書き込みがリードリージョンへ複製された分もコマンドとして数えられます。予算の上限を設定しておけば、70%と90%に達した時点でメールが届き、上限を超えるとレート制限がかかって請求額が止まります。
固定プランとProd Packの選び分け
固定プランはコマンド数で課金されず、データ量・帯域・スループットの上限で料金が決まります。リードリージョンを1つ追加するごとに料金が加算されます。
| プラン | 月額 | リージョン追加 | 帯域 | 秒間コマンド |
|---|---|---|---|---|
| Fixed 250MB | 10ドル | +5ドル | 50GB | 10,000 |
| Fixed 1GB | 20ドル | +10ドル | 100GB | 10,000 |
| Fixed 5GB | 100ドル | +50ドル | 500GB | 10,000 |
| Fixed 10GB | 200ドル | +100ドル | 1TB | 10,000 |
| Fixed 50GB | 400ドル | +200ドル | 5TB | 10,000 |
| Fixed 100GB | 800ドル | +400ドル | 10TB | 16,000 |
| Fixed 500GB | 1,500ドル | +750ドル | 20TB | 16,000 |
固定プランで自動アップグレードを有効にしておくと、帯域上限や容量上限(Evictionが無効な場合)に達したときに上位プランへ移行します。無効なら、帯域超過では通信が制限され、容量超過では新規の書き込みが拒否されます。
Prod Packはデータベース1つあたり月200ドルのアドオンです。稼働率SLA、複数アベイラビリティゾーンでの冗長化、保存データの暗号化、SOC 2 Type 2レポート、Datadog・Prometheusなどとの監視連携がまとめて付きます。無料プランには付けられません。付けるかどうかは、これらの要件があるかで決めます。作り直せるキャッシュでも、機密情報を含む場合や停止を許容できない場合は付ける価値があります。
東京リージョンとGlobal Databaseの設計
Upstash Redisは、1つのプライマリリージョンと必要に応じたリードリージョンで構成します。無料プランのリードリージョンは最大1つです。書き込みはプライマリで処理されてからリードリージョンへ複製され、読み込みは最も近いリードリージョンで処理されます。選べるリージョンはAWSが14、Google Cloudが4です。東京はAWSのap-northeast-1とGoogle Cloudのasia-northeast1の両方にあります。
Global Databaseの公式ドキュメントに記載された社内測定値(99パーセンタイル)は、同一リージョン内の読み込みが1ms未満、書き込みが5ms未満、同じ大陸内の読み書きが50ms未満です。アプリの実行場所とリージョンの距離は遅延に影響します。ただし、この社内測定値は応答時間の保証ではなく、実際の遅延はコマンドや負荷、通信条件によって変わります。
- Vercel:関数の既定リージョンは米国東部のiad1(ワシントンD.C.)です。プライマリを東京にするなら、関数のリージョンも東京のhnd1に変更します。変えずにおくと、1コマンドごとに太平洋を往復することになります。
- Cloudflare Workers:利用者の近くで実行されるため、国内向けサービスならプライマリを東京にします。海外の利用者も多い場合は、リードリージョンを追加します。
- リードリージョンの料金:従量課金では、書き込みがリージョン数の分だけ課金されます(プライマリ+リード1つなら10万書き込みで0.40ドル)。読み込みが中心のデータに限って使います。
リージョンは稼働中のデータベースにも追加・削除できます。最初は東京1リージョンで始めて、海外からのアクセスが増えてからリードリージョンを足しても間に合います。
Upstash Redisの始め方:データベース作成から接続確認まで
- Upstash Consoleでアカウントを作成し、Redisタブの「+ Create Database」を押す。
- データベース名を入力し、プライマリリージョン(国内向けならTokyo)と、必要ならリードリージョンを選ぶ。
- プランを選ぶ。試すだけなら無料(Free)を選ぶ。
- Detailsタブで、RESTのエンドポイント(
UPSTASH_REDIS_REST_URL)とトークン(UPSTASH_REDIS_REST_TOKEN)を確認する。
接続情報を取得したら、まずcurlで疎通を確認します。コマンドはJSON配列で送ります。
curl "$UPSTASH_REDIS_REST_URL" \
-H "Authorization: Bearer $UPSTASH_REDIS_REST_TOKEN" \
-d '["SET","greeting","hello","EX","60"]'
# {"result":"OK"}
curl "$UPSTASH_REDIS_REST_URL/get/greeting" \
-H "Authorization: Bearer $UPSTASH_REDIS_REST_TOKEN"
# {"result":"hello"}
Node.jsから接続する場合は、npm install @upstash/redisでSDKを入れます。環境変数に上の2つを設定しておけば、Redis.fromEnv()が自動で読み込みます。redis-cliを使う場合は、Detailsタブに表示されるコマンドで接続できます。TLSが必須で、トークンがパスワードを兼ねています。
Cloudflare Workers・VercelからUpstash Redisに接続する方法
「Cloudflare Redis」で検索する人がUpstashにたどり着くのは、Cloudflareに純正のRedisが無いためです。Workersではconnect()でTCP接続も張れますが、実行単位ごとに接続を作り直すことになります。そのため、HTTPで1コマンドずつ送る@upstash/redisを使う方が手軽です。
Cloudflare Workers:@upstash/redis/cloudflareとシークレット設定
Workersでは@upstash/redis/cloudflareから読み込み、envをRedis.fromEnv()に渡します。次の例は、パスごとのアクセス数を数えるWorkerです。
import { Redis } from "@upstash/redis/cloudflare";
export interface Env {
UPSTASH_REDIS_REST_URL: string;
UPSTASH_REDIS_REST_TOKEN: string;
}
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const redis = Redis.fromEnv(env);
const path = new URL(request.url).pathname;
const views = await redis.incr(`views:${path}`);
return Response.json({ path, views });
},
};
接続情報はwrangler.tomlに書かず、シークレットとして登録します。Wrangler CLIで登録したシークレットは、デプロイし直しても残ります。
npx wrangler secret put UPSTASH_REDIS_REST_URL
npx wrangler secret put UPSTASH_REDIS_REST_TOKEN
Workers自体の無料枠や料金はCloudflare Workersとは?対応言語・無料枠・使い方・料金を最新版で総まとめで解説しています。
Vercel:MarketplaceからのUpstash連携とVercel KVの移行
Vercel KVはすでに提供を終了しています。既存のKVストアは2024年12月に自動でUpstash Redisへ移行されました。新規プロジェクトでRedisが必要な場合は、Vercel MarketplaceからUpstashを追加します。データベースが作成され、接続情報がプロジェクトの環境変数に自動で登録されます。
注意したいのは環境変数の名前です。登録された変数名がSDKの想定するUPSTASH_REDIS_REST_URL・UPSTASH_REDIS_REST_TOKENと違う場合、Redis.fromEnv()は接続情報を読み込めません。そのときはnew Redis({ url, token })で明示的に渡してください。前述のとおり関数の既定リージョンはiad1なので、東京のデータベースと組み合わせる場合はリージョン設定も合わせて変更します。
Vercel自体の料金体系はVercel(ヴァーセル)とは?サーバー不要の仕組み・料金・できることを解説、App Routerの基本はNext.jsとは?16系App Routerで最小アプリを動かす手順と採用判断を参照してください。
キャッシュとレートリミットの実装例
Upstash Redisの使い道として公式が最初に挙げているのは、キャッシュ、セッション、レート制限です。ここではキャッシュとレート制限を、実際に動かしたコードで紹介します。
TTL付きキャッシュ(cache-aside)
外部APIの結果を5分間キャッシュする例です。@upstash/redisは値を自動でJSONに変換して保存するため、オブジェクトをそのままsetでき、get<T>で取得値の型を指定できます。ただし、型引数は実行時のデータ検証を行いません。
import { Redis } from "@upstash/redis";
const redis = Redis.fromEnv();
type Weather = { city: string; tempC: number };
export async function getWeather(city: string): Promise<Weather> {
const key = `weather:${city}`;
const cached = await redis.get<Weather>(key);
if (cached) return cached;
const fresh: Weather = { city, tempC: 21.5 }; // 実際は外部APIの結果
await redis.set(key, fresh, { ex: 300 });
return fresh;
}
ex: 300を付け忘れると、キーが消えずにストレージ代が増えていきます。従量課金で1GBを超えた分は保存量に応じて課金されるため、キャッシュ用途では有効期限を必ず設定します。
もう1つ確認したいのがエビクション(上限到達時の自動削除)の設定です。既定では無効になっており、データサイズの上限に達すると書き込みが拒否されます。キャッシュとして使うデータベースでは、作成時にEvictionのチェックを入れておきます。
@upstash/ratelimitによるAPI呼び出し回数の制限
@upstash/ratelimit(2.2.0)は、固定ウィンドウ(fixedWindow)・スライディングウィンドウ(slidingWindow)・トークンバケット(tokenBucket)の3つのアルゴリズムに対応しています。次の例は、IPアドレスごとに10秒あたり10回を目安に制限する設定です。事前にnpm install @upstash/ratelimit @upstash/redisを実行します。スライディングウィンドウの判定は近似値です。また、Redisからの応答が既定の5秒以内に返らない場合、リクエストはそのまま許可されます。
import { Ratelimit } from "@upstash/ratelimit";
import { Redis } from "@upstash/redis";
const ratelimit = new Ratelimit({
redis: Redis.fromEnv(),
limiter: Ratelimit.slidingWindow(10, "10 s"),
prefix: "rl:api",
});
export async function handle(ip: string): Promise<Response> {
const { success, limit, remaining, reset } = await ratelimit.limit(ip);
if (!success) {
return new Response("Too Many Requests", {
status: 429,
headers: { "Retry-After": String(Math.ceil((reset - Date.now()) / 1000)) },
});
}
return new Response(`ok ${remaining}/${limit}`);
}
同じIPで12回続けて呼び出すと、10回目まではステータス200、11回目と12回目は429が返りました。
アルゴリズムは次の基準で選びます。
- 固定ウィンドウ:処理が最も軽い方式です。ただし、ウィンドウの境目では上限の2倍近いリクエストが通ることがあります。
- スライディングウィンドウ:境目の問題を解消できます。その代わり、使うデータ量と計算量が増えます。
- トークンバケット:短時間の集中アクセスを一定量まで許容したい場合に使います。
複数リージョン構成(MultiRegionRatelimit)とスライディングウィンドウを組み合わせると、コマンド数も処理時間も大きく増えます。公式ドキュメントでも、この構成では固定ウィンドウを使うよう勧めています。429を返すときのレスポンス設計については、レートリミットとは?アルゴリズム5方式と429設計・分散環境の実装を解説【2026年版】で詳しく解説しています。
ElastiCache・自前運用との比較とUpstashを選ばない条件
サーバーレスRedisの比較でよく名前が挙がるのはAmazon ElastiCacheです。両者の違いは性能よりも「どこから接続できるか」と「何に対して課金されるか」にあります。
| 比較軸 | Upstash Redis | ElastiCache Serverless | EC2等で自前運用 |
|---|---|---|---|
| 接続経路 | インターネット(REST・TCP) | VPCへの私設接続経由(TLS必須) | 自由に構成 |
| 課金単位 | コマンド数または固定月額 | 保存量(GB時間)とECPU | インスタンスの稼働時間 |
| エッジからの接続 | 可能 | 不可(公開エンドポイントなし) | 公開設定次第 |
| 運用作業 | 不要 | VPC・セキュリティグループ設計 | パッチ・冗長化も自分で行う |
ElastiCacheはプライベートIPで接続し、同じVPC内のほか、VPCピアリングやVPN・Direct Connect等で接続したネットワークからも利用できます。ただし公開インターネットからの入口は無いため、Cloudflare WorkersやVercelの関数から直接接続することはできません。逆に、アプリがすべてAWSのVPC内で動いているなら、インターネットを経由しないElastiCacheの方が素直な構成になります。ElastiCacheの詳しい料金はAmazon ElastiCacheとは?対応エンジン・Serverlessとノードベースの違いと料金・採用判断を実装者目線で解説、永続化を重視する場合の選択肢はAmazon MemoryDBとは?ElastiCacheとの違い・料金と2026年の選び方を実装者目線で解説で比べています。
Upstashを選ばない方がよい4つの条件
- 強い整合性が必要:公式の比較表では、Enterprise以外のプランの強整合性は「No」です。在庫の引き当てのように、読んだ直後の値が正確でないと困る処理の主記憶には向きません。
- 秒間1万コマンドを超える状態が常に続く:Fixed 50GBまでのプランは、秒間10,000コマンドが上限です。これを超えるのはFixed 100GB以上かEnterpriseだけです。
- アプリがAWSのVPC内で完結している:外部通信とHTTPの往復が増えるだけです。ElastiCacheか、Redis互換のValkeyを使う方が合っています。
- 1リクエストで大きな値を扱う:従量課金ではリクエストの最大サイズが10MBです。上限の引き上げは月80ドル(50MB)からの有料オプションになります。
Redisのライセンス変更をきっかけに生まれたValkeyとの違いは、Valkeyとは?Redisとの違い・導入方法・データ型を2026年最新版で解説で整理しています。
よくある質問
Upstashは無料で使えますか?
使えます。無料プランでは、データ256MB・月50万コマンド・月10GBの帯域までを無料で使えます。データベースは1つまでです。クレジットカードを登録すると従量課金に切り替わり、それ以降は無料枠分も課金対象になります。
Upstash Redisと普通のRedisは何が違いますか?
Redisのプロトコル(8.4まで)に対応したマネージドサービスです。通常のRedisとの主な違いは、HTTPのREST APIでも操作できることと、コマンド数で課金されることです。独自のSEARCH・VECTORコマンドはありますが、RediSearchのFT.*コマンドとは互換性がありません。
Cloudflare WorkersでRedisを使うにはどうすればよいですか?
Cloudflareには純正のRedisが無いため、Upstash Redisのような外部サービスにつなぐのが一般的です。@upstash/redis/cloudflareを使い、接続URLとトークンをwrangler secret putでシークレットとして登録します。
Vercel KVはどうなりましたか?
Vercel KVは提供を終了しています。既存のストアは2024年12月に自動でUpstash Redisへ移行されました。新規にRedisを使う場合は、Vercel MarketplaceからUpstashを追加します。
Upstashに東京リージョンはありますか?
あります。AWSのap-northeast-1とGoogle Cloudのasia-northeast1から選べます。書き込みが多い場所をプライマリリージョンにし、海外からの読み込みが多い場合はリードリージョンを追加します。