Supabase コネクタ
Supabase プロジェクトを接続して、データベースレコード、ユーザー認証データ、ファイルストレージイベント、リアルタイム変更を同期し、顧客エンゲージメント自動化を実現します。
概要
| プロパティ | 値 |
|---|---|
| プラットフォーム | Supabase |
| カテゴリ | データベースとバックエンド |
| セットアップの複雑さ | 簡単 |
| 公式統合 | はい |
| 同期データ | ユーザー、テーブル、ストレージ、イベント |
| 利用可能なスキル | 11 |
| API タイプ | REST(PostgREST)+ Realtime WebSocket |
| 公式ドキュメント | supabase.com/docs |
機能
- 自動生成 REST API, PostgREST 経由で任意の Postgres テーブルに対する CRUD 操作、コード不要
- 認証ユーザー同期, Supabase Auth ユーザー(メール、電話、ソーシャルログイン)をエンゲージメントプラットフォームに同期
- リアルタイムサブスクリプション, 任意のテーブルに対する INSERT、UPDATE、DELETE イベントをリアルタイムで受信
- Row Level Security, すべての API アクセスは Postgres RLS ポリシーを遵守し、安全なマルチテナントデータを実現
- ストレージ統合, ファイルアップロードをトラッキングし、ストレージバケット全体でアセットを管理
- Edge Functions, カスタムロジックと Webhook 用にサーバーレス Deno 関数を呼び出し
- 全文検索, API 経由で Postgres の全文検索機能を活用
前提条件
開始する前に、以下を準備してください。
- Supabase プロジェクト(app.supabase.com)
- プロジェクトの API URL と API キー(Settings → API にあります)
- API アクセス可能な Tajo アカウント
API キー
Supabase は 2 つのキーを提供します: anon(パブリック、RLS を遵守)と service_role(RLS をバイパス、管理者アクセス)。サーバーサイド統合には service_role を、クライアントサイドには anon を使用してください。
認証
Supabase は API キー認証を使用します。すべてのリクエストには apikey ヘッダーが必要で、ユーザースコープのアクセス用にオプションで Authorization ベアラートークンも必要です。
# anon キーを使用(RLS を遵守)curl 'https://<project_ref>.supabase.co/rest/v1/customers' \ -H "apikey: <SUPABASE_ANON_KEY>" \ -H "Authorization: Bearer <SUPABASE_ANON_KEY>"
# service_role キーを使用(RLS をバイパス)curl 'https://<project_ref>.supabase.co/rest/v1/customers' \ -H "apikey: <SUPABASE_SERVICE_ROLE_KEY>" \ -H "Authorization: Bearer <SUPABASE_SERVICE_ROLE_KEY>"設定
基本セットアップ
connectors: supabase: enabled: true project_url: "https://xyzcompany.supabase.co" api_key: "${SUPABASE_SERVICE_ROLE_KEY}"
# データ同期オプション sync: users: true tables: - customers - orders - products storage: true realtime: true
# Supabase Auth ユーザーを連絡先にマッピング user_mapping: email: email phone: SMS user_metadata.full_name: FIRSTNAME created_at: SIGNUP_DATEフィールドマッピング
Supabase テーブルの列をエンゲージメントプラットフォームの属性にマッピングします。
デフォルトユーザーマッピング
| Parameter | Type | Description |
|---|---|---|
email required | string | Supabase Auth からのユーザーメール(一意識別子) |
phone optional | string | SMS/WhatsApp エンゲージメント用の電話番号 |
user_metadata.full_name optional | string | Auth ユーザーメタデータからの表示名 |
user_metadata.avatar_url optional | string | プロフィール画像の URL |
created_at optional | timestamp | アカウント作成タイムスタンプ |
last_sign_in_at optional | timestamp | エンゲージメントスコアリング用の最新ログイン |
app_metadata.provider optional | string | 認証プロバイダー(email、google、github など) |
confirmed_at optional | timestamp | メール確認タイムスタンプ |
カスタムテーブルマッピング
table_mapping: customers: # 列 → 属性マッピング email: email full_name: FIRSTNAME company: COMPANY plan: SUBSCRIPTION_PLAN mrr: MONTHLY_REVENUE created_at: SIGNUP_DATE
orders: # イベントとしてトラッキング sync_as: events event_name: "order_placed" properties: total: amount status: order_status items: line_itemsAPI エンドポイント
Supabase REST API はデータベーススキーマから https://<ref>.supabase.co/rest/v1/ で自動生成されます。
| エンドポイント | メソッド | 説明 |
|---|---|---|
/rest/v1/{table} | GET | フィルタリング、並べ替え、ページネーション付きで行をクエリ |
/rest/v1/{table} | POST | 行を挿入(バルクとアップサートをサポート) |
/rest/v1/{table} | PATCH | フィルタに一致する行を更新 |
/rest/v1/{table} | DELETE | フィルタに一致する行を削除 |
/rest/v1/rpc/{function} | POST | Postgres 関数を呼び出し |
/auth/v1/signup | POST | 新規ユーザーを作成 |
/auth/v1/token?grant_type=password | POST | パスワードでサインイン |
/auth/v1/user | GET | 現在のユーザーを取得 |
/auth/v1/admin/users | GET | すべてのユーザーを一覧取得(service_role) |
/storage/v1/object/{bucket}/{path} | POST | ファイルをアップロード |
/storage/v1/object/list/{bucket} | POST | バケット内のファイルを一覧取得 |
/functions/v1/{function_name} | POST | Edge Function を呼び出し |
フィルタリング演算子
| 演算子 | 説明 | 例 |
|---|---|---|
eq | 等しい | ?status=eq.active |
neq | 等しくない | ?status=neq.deleted |
gt、gte | より大きい | ?amount=gt.100 |
lt、lte | より小さい | ?created_at=lt.2024-01-01 |
like、ilike | パターンマッチ | ?name=ilike.%john% |
in | 配列内 | ?status=in.(active,trial) |
is | Null チェック | ?deleted_at=is.null |
イベント
認証イベント
| イベント | トリガー | ユースケース |
|---|---|---|
user.signed_up | 新規ユーザー登録 | ウェルカムシリーズ |
user.signed_in | ユーザーログイン | アクティビティトラッキング |
user.updated | プロファイル変更 | データ同期 |
user.deleted | アカウント削除 | クリーンアップワークフロー |
データベースイベント(Realtime)
| イベント | トリガー | ユースケース |
|---|---|---|
INSERT | 新しい行が追加 | 新規注文/顧客通知 |
UPDATE | 行が変更 | ステータス変更ワークフロー |
DELETE | 行が削除 | チャーン検出 |
Webhook イベント
| イベント | トリガー | ユースケース |
|---|---|---|
auth.user.created | Webhook 経由のユーザーサインアップ | オンボーディングをトリガー |
storage.object.created | ファイルアップロード | アセット処理 |
コード例
コネクタの初期化
import { TajoClient } from '@tajo/sdk';import { createClient } from '@supabase/supabase-js';
const tajo = new TajoClient({ apiKey: process.env.TAJO_API_KEY,});
// Supabase プロジェクトを接続await tajo.connectors.connect('supabase', { projectUrl: process.env.SUPABASE_URL, serviceRoleKey: process.env.SUPABASE_SERVICE_ROLE_KEY,});ユーザーを連絡先に同期
// すべての Supabase Auth ユーザーを連絡先として同期await tajo.connectors.sync('supabase', { type: 'full', resources: ['users'],});
// 増分同期(新規/変更されたユーザーのみ)await tajo.connectors.sync('supabase', { type: 'incremental', resources: ['users'], since: '2024-01-01T00:00:00Z',});リアルタイム変更を受信
// エンゲージメントトリガー用に新規注文を購読const supabase = createClient( process.env.SUPABASE_URL, process.env.SUPABASE_SERVICE_ROLE_KEY);
supabase .channel('orders') .on('postgres_changes', { event: 'INSERT', schema: 'public', table: 'orders' }, async (payload) => { // Tajo にイベントとして転送 await tajo.events.track({ email: payload.new.customer_email, event: 'order_placed', properties: { order_id: payload.new.id, total: payload.new.total, items: payload.new.line_items, }, }); } ) .subscribe();クエリとセグメント
// ターゲットキャンペーン用にプランで顧客をクエリconst { data: proUsers } = await supabase .from('customers') .select('email, full_name, plan, mrr') .eq('plan', 'pro') .gt('mrr', 100) .order('mrr', { ascending: false });
// キャンペーンターゲティング用に Brevo リストに同期await tajo.lists.addContacts(PRO_LIST_ID, proUsers);レート制限
API レート制限
Supabase のレート制限はプランに依存します。無料ティア: 500 リクエスト/分。Pro: 1,000 リクエスト/秒。Enterprise 制限については Supabase にお問い合わせください。
| プラン | レート制限 | Realtime 接続 |
|---|---|---|
| Free | 500 req/分 | 同時 200 |
| Pro | 1,000 req/秒 | 同時 500 |
| Team | 2,000 req/秒 | 同時 1,000 |
| Enterprise | カスタム | カスタム |
トラブルシューティング
一般的な問題
| 問題 | 原因 | 解決策 |
|---|---|---|
| 401 Unauthorized | API キーが無効または期限切れ | Supabase Dashboard → Settings → API で API キーを確認 |
| 403 Forbidden | RLS ポリシーがアクセスをブロック | 管理操作には service_role キーを使用するか、RLS ポリシーを確認 |
| リアルタイムイベントなし | テーブルに Realtime が有効化されていない | Database → Replication → テーブルをパブリケーションに追加 |
| クエリ結果が空 | RLS がすべての行をフィルタリング | 認証されたロールが読み取り可能か RLS ポリシーを確認 |
| ストレージアップロード失敗 | バケットポリシー | ストレージバケットがパブリックか、正しい RLS ポリシーを持っているか確認 |
デバッグモード
connectors: supabase: debug: true log_level: verbose log_queries: true log_realtime: true接続テスト
tajo connectors test supabase# ✓ API 接続成功# ✓ Auth エンドポイントにアクセス可能# ✓ テーブル読み取り可能(12 個のテーブルが見つかりました)# ✓ ストレージにアクセス可能(3 個のバケット)# ✓ Realtime 接続確立# ✓ Edge Functions 利用可能(4 個の関数)ベストプラクティス
- service_role キーはサーバーサイドのみで使用する, クライアントコードに公開しないでください
- すべてのテーブルで RLS を有効化する, service_role を使う場合でも、多層防御のため RLS を設計する
- イベント駆動の同期には Realtime を使用する, 変更のポーリングよりも効率的
- 操作をバッチ処理する, 大量の操作にはバルク挿入と
inフィルタを使用 - ユーザーメタデータをマッピングする, サインアップ時にエンゲージメント関連フィールドを
user_metadataに保存 - Webhook には Edge Functions を使用する, 低レイテンシ処理のため Supabase Edge Functions で受信 Webhook を処理
セキュリティ
- API キー認証, すべてのリクエストに有効な API キーが必要
- Row Level Security (RLS), 行ごとの Postgres ネイティブアクセス制御
- JWT 検証, Auth トークンは署名付き JWT で、すべてのリクエストで検証
- SSL/TLS, すべての接続が転送中に暗号化
- SOC 2 Type II, Supabase は SOC 2 準拠
- ネットワーク制限, 有料プランでオプションの IP 許可リスト