crontap-supabase-edge-function-cron について
Supabase Edge FunctionをCrontapで定期実行するための開発者向け手順です。デプロイ順序、リクエスト保護、冪等性、実行確認を扱います。
主な機能
- 01Crontapのスケジュール作成
- 02デプロイ後のスケジュール設定
- 03専用シークレットによる関数保護
- 04ステータスコードと冪等性の確認
- 05履歴と関数ログの照合
活用シーン
- 01Supabase関数の定期実行
- 02Edge Functionを外部スケジューラーへ移行
- 03認証、重複処理、タイムアウトの調査
MCP 対応
Crontap MCPのcreate_scheduleツールでスケジュールを作成する手順を示します。Ultraアカウント向けのREST API利用方法も記載されています。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ crontap/ skills --skill crontap-supabase-edge-function-cronインストール後、Claude Code で/crontap-supabase-edge-function-cronを入力して読み込まれたか確認します。
詳細
Supabase Edge Function をスケジュールする
SQL のみでデータベースのメンテナンスを行う場合は、Supabase の pg_cron を使用してください。繰り返し実行する単位が HTTP Edge Function で、外部スケジューラーを利用したい場合は、このパターンを使用してください。
前提条件
必要なツールを使用する前に、利用可能かどうかを確認してください。不足しているものがある場合は、処理を中断し、ユーザーに次の 2 つの選択肢だけを提示してください。
- Crontap MCP を
https://mcp.crontap.com/mcpで接続します。MCP アクセスは Crontap のすべてのプランで利用できます。 - raw API を利用するために
$CRONTAP_CLIENT_IDと$CRONTAP_API_KEYを設定します。raw API へのアクセスには Ultra が必要です。
どちらかを選択するまで、黙って経路を選んだり、処理を続行したりしないでください。
- スケジュールを作成する前に、関数をデプロイしてください。
- 1 つの論理期間に対して関数が冪等になるようにしてください。
- 専用のサーバー側 cron シークレットで保護してください。
- Supabase の service-role キーを Crontap に送信しないでください。
関数のセキュリティパターン
専用のヘッダーまたは bearer 値を読み取り、処理を行う前にサーバー専用の環境変数と照合してください。関数の Supabase ゲートウェイ JWT 検証が無効になっている場合、このアプリケーション層でのチェックは必須です。
関数の応答サイズは抑えてください。処理に時間がかかる場合は、ジョブを永続的にキューに登録し、キューが受け付けた後にのみ成功を返してください。
ワークフロー
- Edge Function をデプロイし、cron シークレットを設定します。
- 管理された環境から、シークレットありとなしの両方で手動で呼び出します。
- 想定されるステータスコードと冪等性の動作を確認します。
- デプロイ済みの HTTPS URL を使用して Crontap スケジュールを作成します。
- 解決された実行間隔と、最初に保持される実行を確認します。
MCP の例
{
"tool": "create_schedule",
"arguments": {
"url": "https://project-ref.supabase.co/functions/v1/nightly-cleanup",
"text": "every day at 02:00",
"timezone": "UTC",
"method": "POST",
"headers": {
"Authorization": "Bearer <cron-secret-from-secure-store>",
"Content-Type": "application/json"
},
"body": {
"source": "crontap"
},
"label": "Supabase nightly cleanup"
}
}
Supabase プロジェクト URL に含まれる実際のプロジェクト参照を使用してください。関数の URL や JSON 本文にシークレットを含めないでください。
REST の代替手段
REST の利用には Ultra API アクセスが必要です。
curl --fail-with-body https://api.crontap.com/v1/schedule \
-X POST \
-H "ClientId: $CRONTAP_CLIENT_ID" \
-H "ApiKey: $CRONTAP_API_KEY" \
-H "Content-Type: application/json" \
--data '{
"url": "https://project-ref.supabase.co/functions/v1/nightly-cleanup",
"interval": "0 2 * * *",
"timezone": "UTC",
"verb": "POST",
"headers": {
"Authorization": "Bearer <cron-secret-from-secure-store>",
"Content-Type": "application/json"
},
"data": {"source": "crontap"},
"label": "Supabase nightly cleanup"
}'
利用可能な場合は MCP を優先してください。
検証
- cron シークレットなしのリクエストは、副作用が発生する前に 401 を返します。
- シークレットありのリクエストは、意図した成功ステータスを返します。
- 同じ論理期間に対する 2 件のリクエストで、永続的な副作用が 1 つだけ作成されます。
- Crontap の履歴の結果が、同時刻の Supabase 関数ログと一致します。
安全性とプランの制限
SUPABASE_SERVICE_ROLE_KEYをスケジューラーの認証情報として使用しないでください。- 関数の対象を、範囲の狭い定期処理に限定してください。
- Supabase プロジェクトが一時停止する可能性がある場合は、外部の時計で障害を検知できても、利用できないプロジェクトを実行させることはできない点に注意してください。
- Crontap が実行間隔または容量を拒否した場合は、返された 4 つの選択肢からなる段階的な候補と、実行可能な最小の選択肢を提示してください。
トラブルシューティング
- Supabase の 401 は、ゲートウェイまたは関数の認可によってリクエストが拒否されたことを意味します。
- Supabase の 404 は通常、プロジェクト参照、関数スラッグ、またはデプロイ環境に誤りがあることを意味します。
- 2xx でも処理が行われていない場合は、アプリケーションログと冪等性レコードを確認してください。
- タイムアウトには、過度な再試行よりも永続キューによる対処が適しています。