Skip to content

Supabase Edge Function 生成パターン

Claude CodeでSupabase Edge Functionを生成する際、Deno ランタイム環境デプロイ方法を明確に指定しないと、Node.jsスタイルで書いてしまいます。制約条件をプロンプトに明示することが重要です。


Edge Functionとは?

Supabase Edge FunctionはDeno ランタイム上で動作するサーバーレス関数です。Node.jsとは異なる点があります。

Node.jsSupabase Edge Function (Deno)
importの方式require() または ESMESMのみ使用 (import)
パッケージnpmURL import または npm: prefix
Supabaseクライアント@supabase/supabase-jsnpm:@supabase/supabase-js
環境変数process.envDeno.env.get()

📋 Prompt Template — 基本 Edge Function 生成

Supabase Edge Functionを書いてください。

[機能説明]
- [ここに機能の説明]

[技術スタックおよび制約条件]
- Deno ランタイム環境(Node.jsではない)
- importはESM方式のみ使用
- Supabaseクライアント: npm:@supabase/supabase-js
- 環境変数へのアクセス: Deno.env.get('変数名')
- ファイルの場所: supabase/functions/[関数名]/index.ts
- CORSヘッダーを含める(OPTIONSメソッドの処理)
- エラーレスポンスは常にJSON形式で返す

[返却形式]
- 成功: { data: ..., error: null }
- 失敗: { data: null, error: "エラーメッセージ" }

📋 Prompt Template — OpenAI連携 Edge Function

OpenAI APIを呼び出すSupabase Edge Functionを書いてください。

[機能説明]
- [ここに機能の説明]

[技術スタックおよび制約条件]
- Deno ランタイム、ESM import
- OpenAIクライアント: npm:openai
- OpenAI APIキー: Deno.env.get('OPENAI_API_KEY')
- Supabaseクライアント: npm:@supabase/supabase-js
- 認証: AuthorizationヘッダーのJWTをSupabaseで検証
- ファイルの場所: supabase/functions/[関数名]/index.ts
- ストリーミングレスポンスが必要な場合はReadableStreamを使用

✅ 良い例 vs ❌ 悪い例

❌ 悪い例 — Deno環境の指定なし

"ユーザーIDを受け取って文章を生成するEdge Functionを作って。"

→ Claudeが process.envrequire()、Node.jsスタイルで書いてしまい、デプロイ時にエラーが発生

✅ 良い例 — 環境を明示

"Deno ランタイムベースのSupabase Edge Functionを書いてください。
- リクエストbodyからuserIdを受け取り、usersテーブルから情報を取得
- Supabaseクライアント: npm:@supabase/supabase-js
- 環境変数: Deno.env.get('SUPABASE_URL'), Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')
- ファイルの場所: supabase/functions/get-user/index.ts"

CORS処理(必須ボイラープレート)

ClaudeにCORSを含めるよう指示すると、以下の構造で書いてくれます。プリフライトリクエスト(OPTIONS)を見落とすケースが多いため、必ず明示してください。

typescript
const corsHeaders = {
  'Access-Control-Allow-Origin': '*',
  'Access-Control-Allow-Headers': 'authorization, x-client-info, apikey, content-type',
}

Deno.serve(async (req) => {
  // OPTIONSリクエストの処理(CORS preflight)
  if (req.method === 'OPTIONS') {
    return new Response('ok', { headers: corsHeaders })
  }

  // 実際のロジック
  // ...
})

デプロイ & テスト

bash
# ローカルテスト
supabase functions serve [関数名] --env-file .env.local

# デプロイ
supabase functions deploy [関数名]

# ログ確認
supabase functions logs [関数名]

Claude Codeにテストまで任せるには:

"作成したEdge Functionをローカルでテストするcurlコマンドも一緒に書いてください。"

CLAUDE.mdに共通ルールを登録する

markdown
## Supabase Edge Function ルール
- ランタイム: Deno(Node.jsではない)
- import: ESM方式、npm: prefixを使用(例: npm:@supabase/supabase-js)
- 環境変数: Deno.env.get()を使用(process.env禁止)
- ファイルの場所: supabase/functions/[関数名]/index.ts
- すべての関数にCORS処理を含める(OPTIONSメソッド)
- レスポンス形式: { data: ..., error: ... }

→ フロントエンドフックパターンは frontend-hooks.md を参照

PRを歓迎します ✦