前提
この記事では以下を前提としています。
- Supabase アカウントを作成済みであること
- Supabase CLI をインストール済みであること
- この記事では Edge Function で Resend を使ったメール送信を例にしますが、ここだけ他の処理に置き換えも同様の手順で実行できます。
この記事のゴール
この記事では、Supabase 内のusers
テーブルに新しいレコードが追加された時に、その新しく追加されたレコードのemail
カラムの値を使ってメールを送信できるようにします。
自分のサービスに新しいユーザーが新規登録された時に、そのユーザーにメールを自動送信するイメージです。
そのために Supabase の Edge Function を Webhook を利用します。
なお、この記事では Resend を使ったメール送信処理を例にしていますが、Supabase Edge Function でできることは Resend を使ったメール送信処理に限らず、自由な処理を実行できます。
作業の流れ
- Supabase の
users
テーブルのレコードを受け取って、そのレコードのemail
カラムの値を使ってメールを送信するための Edge Function を作成する - Supabase Webhook で
users
テーブルに新しいレコードが追加された時に、作成した Supabase Edge Function を実行するように設定する。
Supabase Edge Function を作成する
Webhook で実行するための Supabase Edge Function を作成します。
ここでは、Resend というメール配信サービスを使ってメールを送信する Edge Function としてresend
という名前で作成します。
$ supabase functions new resend
Created new Function at supabase/functions/resend
users
テーブルからのレコードを受け取って、そのレコードに含まれるname
カラムとemail
カラムの値を使ってメールを送信する Edge Function を作成します。
内容を以下のようにします。
import { serve } from 'https://deno.land/[email protected]/http/server.ts';
// Supabaseにセットしたシークレットを使用する
// シークレットの設定方法は後述
const RESEND_API_KEY = Deno.env.get('RESEND_API_KEY');
const handler = async (_request: Request): Promise<Response> => {
// Supabase Edge Functionの呼び出し元から受け取る_requestをjsonに変換する
// ここでは、_requestには新しく追加されたusersテーブルのレコードが含まれている想定です。
const _requestBody = await _request.json();
// _requestから新しく追加されたusersテーブルのレコードを取得する
const { record } = _requestBody;
// レコードからnameカラムの値を取得する
const userName = record.name;
// レコードからemailカラムの値を取得する
const userEmail = record.email;
const res = await fetch('https://api.resend.com/emails', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${RESEND_API_KEY}`,
},
body: JSON.stringify({
from: 'resend edge function <[email protected]>',
to: [userEmail],
subject: '新規登録ありがとうございます。',
html: `<h3>${userName} 様</h3></br> この度は新規登録ありがとうございます。`,
}),
});
const data = await res.json();
return new Response(JSON.stringify(data), {
status: 200,
headers: {
'Content-Type': 'application/json',
},
});
};
serve(handler);
上記で重要なのは、後述する手順で Supabase の Webhook を設定してそこから上記の Supabase Edge Function を実行すると、上記の_request
には新しく追加されたusers
テーブルのレコードが含まれており、そのレコードの値を使用することができます。
そして新しく追加されたusers
テーブルのレコードは_request
のrecord
プロパティに含まれています。
よって上記のコードでは_requestBody
からrecord
プロパティを取得してrecord
のname
カラムの値をuserName
に、record
のemail
カラムの値をuserEmail
に代入しています。
あとは取得したuserName
とuserEmail
を使ってメールを送信するために、Resend の
API を使ってメールを送信しています。もちろんここは各自自由な処理を記述できます。
あとは忘れずに以下でデプロイしておきます。
$ supabase functions deploy resend
なお、上記の Edge Function の中で Resend の API キー(RESEND_API_KEY
)を使っていますが、これは Supabase のシークレットに設定済みである必要があります。
Supabase のシークレットについては以下の記事を参考にしてみてください。Resend を使ったメール送信処理についても以下の記事にて解説しています。
📭 ResendとSupaase Edge Function でメールを送信する
Supabase Edge Function で Resend を使ったメール送信処理を実装する手順を解説します。
ritaiz.com
Supabase の Webhook を作成する
Supabase の Webhook を Supabase の管理画面から作成します。
Supabase にログイン後、以下のようにサイドバーにあるDatabase
(データベースアイコンのメニュー)→Webhooks
をクリックすると、Webhook の一覧画面に遷移します。
上記の Webhook の一覧画面にあるCreate Webhook
ボタンをクリックすると、以下のように Webhook の作成画面が開きます。
もしCreate Webhook
ボタンではなくEnable Webhooks
ボタンが表示されている場合はそれをクリックして Webhook を先に有効化してください。有効化するとCreate Webhook
ボタンが表示されます。
またさらに下にスクロールしていくと以下の項目もあります。
記事公開時点では、Webhook の作成時の入力項目は以下のようになっています。
- name: Webhook の名前
- Condition to fire webhook:
- Table: Webhook の実行条件に使うテーブルを選択。ここでは
public.users
を選択します。(auth.users
ではありません。) - Events: Webhook を実行条件とするイベントを選択。ここでは
INSERT
を選択します。
- Table: Webhook の実行条件に使うテーブルを選択。ここでは
- Webhook configuration: Webhook の タイプを選択。ここでは
Supabase Edge Functions
を選択。HTTP Reuquest
を選択すれば好きな URL に HTTP リクエストを送信できます。 - Edge Function:
- Method: http リクエストのメソッドを選択。ここでは
POST
を選択します。 - Select which edge function to trigger: 条件を満たした時に実行したい Supabase Edge Function を選択。ここでは前節で作成した
resend
を選択します。 - Timeout: タイムアウト時間を設定。ここでは
3000
(3 秒)を設定します。
- Method: http リクエストのメソッドを選択。ここでは
- HTTP Headers: HTTP リクエストのヘッダーを設定。ここでは
Authorization
ヘッダーとその値Bearer eyJhwoe8034j....
を設定します。ここの値は Supabase のanon public
キーです。
最後にCreate webhook
ボタンをクリックすると、Webhook が作成され、以下のように一覧の中に表示されます。
Webhookで指定するテーブルについて
この記事では自分で作成したusers
テーブル(public
スキーマのusers
テーブル)に対して
Webhook を設定していますが、Supabase
ではauth
スキーマにusers
テーブル(auth.users
)がデフォルトで作成されています。
今回のようにusers
というテーブルだとすでにSuapbaseによって作成されているauth.users
と混同してしまう可能性があるので、上記のWebhook作成時の「Table」の選択では、スキーマが間違いないかも確認してください。
この記事の例だとpublic.users
とauth.users
を混同しやすいです。もしどうしてもWebhookが実行されない場合は、一度このテーブルの選択が間違っていないか確認してみてください。
動作確認する
あとは Supabase の管理画面からusers
テーブルに適当なレコードを新規作成したり、自身が作成しているアプリケーションからusers
テーブルに新規レコードを追加してみてください。
まとめ
この記事では、users
テーブルに新しいレコードが追加された時に実行する Webhok を作成しましたが、同じように違うテーブルのレコードが新規追加されたり、新規追加ではなく更新されたり削除されたりした時に実行する Webhook を作成することもできます。
Supabase Edge Function を組み合わせれば、テーブルのレコードの変更に応じて、自由な処理を実行できるようになります。
OneSignal や Firebase を使ってプッシュ通知を送信することもできますし、Slack に通知を送信することもできます。