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 の全文検索機能を活用

前提条件

開始する前に、以下を準備してください。

  1. Supabase プロジェクト(app.supabase.com)
  2. プロジェクトの API URLAPI キー(Settings → API にあります)
  3. API アクセス可能な Tajo アカウント

API キー

Supabase は 2 つのキーを提供します: anon(パブリック、RLS を遵守)と service_role(RLS をバイパス、管理者アクセス)。サーバーサイド統合には service_role を、クライアントサイドには anon を使用してください。

認証

Supabase は API キー認証を使用します。すべてのリクエストには apikey ヘッダーが必要で、ユーザースコープのアクセス用にオプションで Authorization ベアラートークンも必要です。

Terminal window
# 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_items

API エンドポイント

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}POSTPostgres 関数を呼び出し
/auth/v1/signupPOST新規ユーザーを作成
/auth/v1/token?grant_type=passwordPOSTパスワードでサインイン
/auth/v1/userGET現在のユーザーを取得
/auth/v1/admin/usersGETすべてのユーザーを一覧取得(service_role)
/storage/v1/object/{bucket}/{path}POSTファイルをアップロード
/storage/v1/object/list/{bucket}POSTバケット内のファイルを一覧取得
/functions/v1/{function_name}POSTEdge Function を呼び出し

フィルタリング演算子

演算子説明
eq等しい?status=eq.active
neq等しくない?status=neq.deleted
gtgteより大きい?amount=gt.100
ltlteより小さい?created_at=lt.2024-01-01
likeilikeパターンマッチ?name=ilike.%john%
in配列内?status=in.(active,trial)
isNull チェック?deleted_at=is.null

イベント

認証イベント

イベントトリガーユースケース
user.signed_up新規ユーザー登録ウェルカムシリーズ
user.signed_inユーザーログインアクティビティトラッキング
user.updatedプロファイル変更データ同期
user.deletedアカウント削除クリーンアップワークフロー

データベースイベント(Realtime)

イベントトリガーユースケース
INSERT新しい行が追加新規注文/顧客通知
UPDATE行が変更ステータス変更ワークフロー
DELETE行が削除チャーン検出

Webhook イベント

イベントトリガーユースケース
auth.user.createdWebhook 経由のユーザーサインアップオンボーディングをトリガー
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 接続
Free500 req/分同時 200
Pro1,000 req/秒同時 500
Team2,000 req/秒同時 1,000
Enterpriseカスタムカスタム

トラブルシューティング

一般的な問題

問題原因解決策
401 UnauthorizedAPI キーが無効または期限切れSupabase Dashboard → Settings → API で API キーを確認
403 ForbiddenRLS ポリシーがアクセスをブロック管理操作には service_role キーを使用するか、RLS ポリシーを確認
リアルタイムイベントなしテーブルに Realtime が有効化されていないDatabase → Replication → テーブルをパブリケーションに追加
クエリ結果が空RLS がすべての行をフィルタリング認証されたロールが読み取り可能か RLS ポリシーを確認
ストレージアップロード失敗バケットポリシーストレージバケットがパブリックか、正しい RLS ポリシーを持っているか確認

デバッグモード

connectors:
supabase:
debug: true
log_level: verbose
log_queries: true
log_realtime: true

接続テスト

Terminal window
tajo connectors test supabase
# ✓ API 接続成功
# ✓ Auth エンドポイントにアクセス可能
# ✓ テーブル読み取り可能(12 個のテーブルが見つかりました)
# ✓ ストレージにアクセス可能(3 個のバケット)
# ✓ Realtime 接続確立
# ✓ Edge Functions 利用可能(4 個の関数)

ベストプラクティス

  1. service_role キーはサーバーサイドのみで使用する, クライアントコードに公開しないでください
  2. すべてのテーブルで RLS を有効化する, service_role を使う場合でも、多層防御のため RLS を設計する
  3. イベント駆動の同期には Realtime を使用する, 変更のポーリングよりも効率的
  4. 操作をバッチ処理する, 大量の操作にはバルク挿入と in フィルタを使用
  5. ユーザーメタデータをマッピングする, サインアップ時にエンゲージメント関連フィールドを user_metadata に保存
  6. 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 許可リスト

関連リソース

Subscribe to updates

developer-docs

Drop your email or phone number — we'll send you what matters next.

auto-detect
AIアシスタント

こんにちは!ドキュメントについて何でもお聞きください。