Edge Functions
データベースのすぐそばで動く独自のサーバーコード。サーバーを運用せずに、Webhookの受信、決済、メール送信、他のAPIの呼び出しができます。
仕組み
- 関数はハンドラーをエクスポートするTypeScriptモジュールです。標準の
Requestを受け取り、Responseを返します。Deno上で動くため、fetch、Web Crypto、npm:パッケージが使えます。 - 各プロジェクトの関数は専用のサンドボックス(gVisor)で動きます。関数が使えるのはネットワークとそのプロジェクトのシークレットだけで、ファイル、他のプログラム、データベースのパスワードには触れられません。
- 関数は最初の呼び出しで起動し、呼び出しのない状態が10分続くとスリープします。デプロイのたびに新しいバージョンになります。
1. 書いてデプロイする
// functions/hello.ts
export default async (req: Request): Promise<Response> => {
const { name } = await req.json().catch(() => ({ name: "world" }));
console.log("greeting", name);
return Response.json({ message: `Hello ${name}!` });
};ダッシュボードで Edge Functions → 新しい関数 を開き、名前(URLの一部になります)を決めて デプロイ をクリックします。デプロイできるのは開発者、管理者、オーナーです。関数の削除には管理者またはオーナーが必要です。
2. 呼び出す
# with the project's publishable key
curl -X POST "$ESPOBASE_URL/functions/v1/hello" \
-H "apikey: $ESPOBASE_PUBLISHABLE_KEY" \
-H "content-type: application/json" \
-d '{"name":"Ada"}'
// from your app (@espobase/client): sends the signed-in user's token too
const { data, error } = await espobase.functions.invoke("hello", { body: { name: "Ada" } });関数はデフォルトで、REST APIと同じくプロジェクトのAPIキーが必要です。Webhook(Stripe、GitHubなど)には 呼び出せる人 を URLを知っている誰でも にし、関数の中で署名を検証してください。
3. 呼び出し元を知る
export default (req: Request) => {
if (req.headers.get("x-espobase-auth") !== "authenticated") {
return new Response("Sign in first", { status: 401 });
}
return Response.json({ hello: req.headers.get("x-espobase-user-email") });
};ログイン中のユーザーが呼び出すと(espobase.functions.invoke がトークンを送信します)、Espobaseがトークンを検証し、ユーザーを x-espobase-user-id、x-espobase-user-email、x-espobase-user-role で渡します。x-espobase-auth は authenticated、anonymous、service、public のいずれかです。クライアントがこれらのヘッダーを自分で設定することはできません。
4. シークレット
const stripeKey = Deno.env.get("STRIPE_SECRET_KEY");
const projectUrl = Deno.env.get("ESPOBASE_URL");STRIPE_SECRET_KEY などのキーは Edge Functions → シークレット で追加し、Deno.env.get("STRIPE_SECRET_KEY") で読み取ります。値は暗号化して保存され、後から表示することはできません。シークレットを変更すると、実行中の関数は再起動します。ESPOBASE_URL(プロジェクトのAPIのURL)は常に設定されています。
ログ
関数が console.log で出力した内容と投げたエラーは、ダッシュボードの関数の下に呼び出しごとに、ステータスと所要時間とともに表示されます。ログは、プランがリクエストログを保持する期間と同じだけ保存されます。
CLIからデプロイする
npx espobase login npx espobase link <project-ref> npx espobase functions deploy hello # functions/hello.ts npx espobase functions logs hello
deploy は最初のデプロイで関数を作成します(Webhook用には --public を付けます)。コードは functions/<name>.ts、functions/<name>/index.ts、または --file から読み込まれます。CIでは Edge Functionsのデプロイ 権限を持つパーソナルアクセストークンを使ってください。
セキュリティ
- 各プロジェクトの関数は、他のプロジェクトやEspobaseのデータベースから分離されたgVisorの中で、読み取り専用のファイルシステムと特別な権限なしで動きます。
- APIキー、Cookie、Espobaseの内部ヘッダーがあなたのコードに届くことはありません。レスポンスがAPIのアドレスにCookieを設定することもできません。
- 公開 関数ではキーを確認しません。Webhookの署名はコードの中で検証してください。
- 関数が投げたエラーは、呼び出し元には一般的なエラーとしてのみ返されます。詳細は関数のログに残ります。
制限
- Free: 月500K回の呼び出し。使い切ると、次の請求サイクルまで呼び出しは拒否されます。
- Pro: 月2M回の呼び出し。
- Group: 月10M回の呼び出し。
- 1回の呼び出し: 最大10秒、リクエストまたはレスポンスの本文は6 MBまで。1プロジェクトあたり関数は25個まで、コードはそれぞれ256 KBまで、シークレットは50個まで。