Supabaseのリクエストログを調査する
ブログで使っているSupabaseのリクエスト数が明らかにおかしい。原因を調査する。
調査方法
#ChatGPTより引用
- 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メソッド単位で、どのテーブルエンドポイントが呼ばれているかが分かる
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が起動しなおしているのが気になる...
/src/src/_fresh
が使われているのはChanging the source directoryを見てsrc
に変えているから。キモいけど関係ないっぽいのでそのままでいいや。
このアクセスは robots.txt
へのアクセスだった。
#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をさらに調査すると、次の問題が発覚した。
このリクエストは Supabase に対して直接送信されており、あなたの Deno Deploy アプリの middleware は一切関与していません。
使用されている service_role キーでのリクエストは、誰でも Supabase にアクセスできてしまう構成になっています(セキュリティリスク)。
