ドキュメント

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個まで。