Skip to content

Redis Cloud と接続する

Redis Cloud は Redis 公式のクラウドサービス。クラウド上で Redis を使える(無料プランなら 30MB の RAM ストレージ)。
FastAPI Cloud のアプリからも使える。

FastAPI Cloud のダッシュボードには Neonと接続する と同じ統合機能も用意されてるけど、2026年7月時点ではエラーで接続できなかったので、このページでは接続情報を環境変数で渡す方法で。


Redis Cloud で無料データベースを作る

アカウントは https://cloud.redis.io/ から作る。メールアドレス+パスワードか、Google / GitHub のソーシャルログインが選べる。

GitHub ログインには公開メールが必要

Redis Cloud の GitHub ログインは、GitHub プロフィールの公開メールアドレスを読みに行く。メールを非公開(Keep my email addresses private)にしてると access_denied で失敗するので、非公開のままにしたいならメール登録か Google ログインを使う。

ログインするとプラン選択の画面になる。Essentials と Pro が大きく並んでるけど、その下の Not ready? Try 30 MB for free から無料プランを選ぶ。

Redis Cloud の Choose your plan 画面。Try 30 MB for free の無料プランを選び、Name・Cloud vendor・Region を設定する

設定するのは実質3か所。

  • Name … データベース名。ここでは fastapicloud-cache にした。
  • Cloud vendorAmazon Web ServicesGoogle CloudMicrosoft Azure の中から選ぶ。
  • RegionUS East (N. Virginia) us-east-1 を選ぶのがいいと思う。FastAPI Cloud は現時点だと選択肢はなくて、us-east-1 で動いてるので。レイテンシはアプリとの距離で決まるので、ここを合わせておくのがいいはず。

無料プランの内訳は 1 database30MB RAM30 connections100 ops/sec。学習用途なら十分。Price $0/month になってるのを確認して Create database を押す。

作成できた。

作成直後のサブスクリプション画面。Free プランの fastapicloud-cache データベースが active になっている


接続情報を環境変数で渡す

データベース一覧の Connect ボタンで接続 URL を確認できる。

redis://default:password-for-redis-connection@riddle-cause-friction-00000.db.redis.io:12345

FastAPI Cloud のアプリから使う前に疎通確認しておくと安心。uv run --with redis なら、プロジェクトに依存を追加せずローカル環境で試せる。

export REDIS_URL='redis://default:<パスワード>@<ホスト>:<ポート>'

uv run --with redis python -c "
import os, redis
print(redis.from_url(os.environ['REDIS_URL']).ping())
"

True が返ってくれば Redis Cloud 側は OK。あとはこの URL を、FastAPI Cloud のアプリの Environment VariablesREDIS_URL として登録する。パスワードを含むので Secret をオンにする。

FastAPI Cloud の Environment Variables 画面。REDIS_URL が Secret として登録され、値が伏字になっている


コードから使う

redis-py の asyncio クライアントで、環境変数 REDIS_URL から接続する。

uv add redis

動作確認とレイテンシ測定を兼ねて、まずは PING の往復時間を返すエンドポイントを作ってみる。

main.py
import os
import time

import redis.asyncio as redis
from fastapi import FastAPI

redis_client = redis.from_url(os.environ["REDIS_URL"], decode_responses=True)

app = FastAPI()


@app.get("/redis-ping")
async def redis_ping():
    ok = await redis_client.ping()
    t = time.perf_counter()
    for _ in range(10):
        await redis_client.ping()
    avg_ms = (time.perf_counter() - t) / 10 * 1000
    return {"ping": ok, "avg_rtt_ms": round(avg_ms, 2)}

計測ループの前に 1回 ping() してる(ok = await redis_client.ping())のは、TCP 接続の確立と認証をここで済ませておくため。redis-py のコネクションプールは最初のコマンドを打った瞬間に初めて接続を張るので、1発目はその分だけ値がぶれる。先に接続しておけば、後続の 10回は確立済みの接続を使い回した素の往復時間だけを測れる。

fastapi deploy でデプロイして、公開 URL の /redis-ping を開くと結果が JSON で返ってくる。

{"ping": true, "avg_rtt_ms": 1.65}

レイテンシを実測する

同じアプリをローカル環境と FastAPI Cloud の両方で動かして、/redis-pingavg_rtt_msPING 10回の平均)を数回ずつ比べてみた。

実行場所 avg RTT
ローカル環境 → Redis Cloud(us-east-1) 182〜189 ms
FastAPI Cloud(us-east-1) → Redis Cloud(us-east-1) 1.3〜1.7 ms
  • FastAPI Cloud からは 2 ms を切る。us-east-1 の Redis Cloud と同一リージョン相当の近さで、DB クエリより1桁速いので、キャッシュとして十分実用的なはず。
  • 手元から直結すると約100倍遅い。Redis は 1回のリクエスト処理で小さいコマンドを何度も発行しがちなので、この差はそのまま体感速度に響く。
  • なので開発中はローカルに立てた Redis を使って、本番だけ REDIS_URL を Redis Cloud に向けるのが定石。環境変数で切り替える作りにしておけば、コードは共通のまま。

ダッシュボードからの統合(2026年7月時点はエラー)

本来は Neonと接続する と同じように、ダッシュボードから OAuth でつないで REDIS_URL を自動で注入してもらえるはず。
cf. Redis Cloud Integration - FastAPI Cloud

アプリ詳細の Integrations タブを開いて、Connect Integration を押す。

FastAPI Cloud のアプリ詳細の Integrations タブ。まだ連携がなく Connect Integration ボタンがある

Add Integration のダイアログで Redis Cloud を選ぶ。

Add Integration ダイアログ。Logfire・Neon・Redis Cloud・Supabase から Redis Cloud を選ぶ

認証方法は Google か GitHub のソーシャルログインだけ。メール+パスワードで作った Redis Cloud アカウントのままでは、このフローには乗れない。

Connect Redis Cloud ダイアログ。Continue with Google と Continue with GitHub だけが並ぶ

けれど、Google でログインしても Unable to load subscriptions from Redis Cloud. Please try again. になって、そこから先に進めなかった。

Connect to Redis Cloud ダイアログ。Unable to load subscriptions from Redis Cloud エラーが表示されている

試したこと(いずれも効果なし):

  • 連携の切断と再接続
  • シークレットウィンドウでのやり直し
  • Redis Cloud 側で REST API の有効化。Team & APIAPI Keys タブに Enable API ボタンがある(有効化は無料)。サブスクリプション一覧の取得は REST API 経由のはずなので試したけど、変わらず。

Redis Cloud の Access Management の API Keys タブ。Enable API ボタンで REST API を有効化できる

ブラウザの開発者ツールで見ると、api.fastapicloud.com のサブスクリプション取得エンドポイントが HTTP 500 を返してた。URL に入ってる ID は統合ごとに発行されるもので、接続をやり直すたびに変わる。

失敗するリクエスト
GET https://api.fastapicloud.com/api/v1/integrations/redis/12345678-abcd-abcd-abcd-123456789abc/subscriptions
レスポンスヘッダー
HTTP/2 500
date: Tue, 14 Jul 2026 02:09:34 GMT
content-type: application/json
content-length: 77
access-control-allow-credentials: true
access-control-allow-origin: https://dashboard.fastapicloud.com
server: cloudflare
vary: Origin
x-envoy-upstream-service-time: 5102
cf-cache-status: DYNAMIC
cf-ray: a1acfc4a7ea2d3fa-KIX
X-Firefox-Spdy: h2

x-envoy-upstream-service-time: 5102、つまりバックエンドが 5 秒かかった末の失敗なので、FastAPI Cloud から Redis Cloud への呼び出しがタイムアウトかエラーになってそう。

一方、データベース自体はどこからでも正常につながるし、Redis Cloud の REST API を自分の API キー(Team & APIAPI Keys で発行するアカウントキーとユーザーキー)で直接叩いても、サブスクリプションは正常に返ってくる。

curl -s -H "x-api-key: <アカウントキー>" -H "x-api-secret-key: <ユーザーキー>" \
  https://api.redislabs.com/v1/fixed/subscriptions
GET /v1/fixed/subscriptions のレスポンス(抜粋)
{
  "accountId" : 1234567,
  "subscriptions" : [ {
    "id" : 7654321,
    "name" : "fastapicloud-cache",
    "status" : "active",
    "planName" : "30MB",
    "provider" : "AWS",
    "region" : "us-east-1",
    "price" : 0,
    "maximumDatabases" : 1,
    "databaseStatus" : "active"
  } ]
}

Pro 用の GET /v1/subscriptions のほうは空リストが返る(エラーにはならない)。

GET /v1/subscriptions のレスポンス(抜粋)
{
  "accountId" : 1234567,
  "subscriptions" : [ ]
}

つまり Redis Cloud の API はこのアカウントに対して完全に正常で、失敗してるのはベータ版の FastAPI Cloud 側っぽい。Pro と Essentials で一覧のエンドポイントが分かれてるから、統合が Pro 側しか見てない可能性もありそう。統合が直れば、環境変数の手動登録は統合の自動注入に置き換えられるはず。