Supabaseのリクエストログを調査する

作成日
更新日

ブログで使っているSupabaseのリクエスト数が明らかにおかしい。原因を調査する。

調査方法

#ChatGPTより引用

  1. Supabaseのログ機能で調査(Postgres Logs + API Logs)

Supabaseではログを確認することで、リクエストの詳細を追跡できます。

  • Postgres Logs(Databaseへのクエリログ)
    • Supabase Dashboard → [プロジェクト] → Logs → Postgres タブ
    • 特に query, error, info レベルのログに注目
    • どのテーブルに対してどんなクエリが実行されたか、頻度はどの程度か確認できます
  • API Logs(REST API経由のアクセス)
    • Supabase Dashboard → Logs → API タブ
    • method, endpoint, status_code などが表示される
    • GET, POST, PATCH などのRESTメソッド単位で、どのテーブルエンドポイントが呼ばれているかが分かる

Supabaseのリクエストログを調査する-1743970980217

1カウントについて

#ChatGPTより引用

Supabase における REST リクエスト数(Database REST Requests) の「1カウント」の基準について、以下のように整理できます。

1回の .from(...).select() や .insert(), .update(), .delete() などの呼び出しごとに 1リクエストとしてカウントされます。

  • 対象となるのは HTTP レベルのリクエストであり、1回のAPI呼び出しが 1カウント。
  • 取得するカラム数や返ってくる件数には関係ありません(課金には影響するが、リクエスト数には影響しない)
  • .rpc() を呼んだ場合も 1リクエスト扱いになります(内部でさらにDBアクセスがあればその分のDB処理時間には加算されますが、RESTリクエスト数は1)
const { data, error } = await supabase
  .from("articles")
  .select(
    "title, slug, created_at, updated_at, content, cover_image, category",
  )
  .eq("private", false)
  .eq("category", category.name)
  .order("created_at", { ascending: false });

これは1カウントに該当する。

Deno Deployの調査

なんか毎分ぐらいでFreshが起動しなおしているのが気になる...

Supabaseのリクエストログを調査する-1743971708942

/src/src/_freshが使われているのはChanging the source directoryを見てsrc に変えているから。キモいけど関係ないっぽいのでそのままでいいや。

このアクセスは robots.txtへのアクセスだった。

Supabaseのリクエストログを調査する-1743974980180

#ChatGPTより引用

✅ Deno Deploy上でリージョン(gcp-xxx)が頻繁に切り替わっており、毎回 🍋 Fresh ready が発生しているのは、次の仕組みによるものです: 🧠 現象の本質 ❗️ Deno Deployは、アクセス元の地域(クライアントIP)に応じて最寄りリージョンにアプリを起動(Cold Start)します。

つまり:

  • クライアントが **アジア(例: gcp-asia-southeast1)**からアクセスすれば、そのリージョンにインスタンスが立ち上がる
  • 別のクライアントが **アメリカ東部(gcp-us-east4)**からアクセスすれば、今度はそっちのリージョンに別のインスタンスが起動
  • それぞれに対して 🍋 Fresh ready + Using snapshot found at が発生

この仕様自体は理解した。

対策

  • robots.txt を配置
    • Freshにrobots.txtを配置する
  • _middleware.tsx でbotを弾く
    • Freshのミドルウェアでbot風のアクセスを弾く
  • island内での取得が発火しすぎていないか確認する
    • 大丈夫そう
  • Cloudflareをつかう
    • ためしていない

対策結果

robots.txt を配置と _middleware.tsx でbotを弾く処理の追加でかなりマシになった。

1分に1回アクセスされていたとしたら、毎日60x24で1440はわかる。調査した感じ、毎回x3ぐらい呼ばれているので1440x3で4320回。

実際には毎日6000回程度あることになっていたので、さらに呼ばれているのがわかる。 もう数日見てダメそうならCloudflareの導入を考える。

WordPressへの攻撃ってすごいんだな。

さらに調査

Supabaseをさらに調査すると、次の問題が発覚した。

サイトアイコン
公開日
更新日