Supabase: Edge Functions dan Production
Serverless functions, triggers, dan deployment best practices
Tujuan Pembelajaran
- Bisa membuat Edge Functions
- Mengerti database triggers
- Mengerti production deployment dan security
Analogi
Edge Functions:
├── Deno runtime
├── TypeScript native
├── Hono-compatible
└── Deploy globally
Triggers:
└── Database webhooks → Edge Function
Edge Functions memungkinkan logic serverless tanpa manage server
Penjelasan Konsep
Fitur terakhir Supabase yang akan kita pelajari adalah Edge Functions — serverless functions yang berjalan dekat dengan user (edge network). Ini memungkinkan logic backend tanpa manage server sendiri.
Supabase Edge Functions
Edge Functions menggunakan Deno runtime dan berjalan di edge network Supabase. Keunggulannya:
- Low latency: Berjalan di edge node terdekat dengan user
- TypeScript native: Deno support TypeScript out-of-the-box
- Hono compatible: Bisa pakai Hono untuk routing
- Database access: Akses Supabase database langsung
- Triggers: Dipanggil oleh database events
Membuat Edge Function
# Create function
supabase functions new hello
# Implement (functions/hello/index.ts)
import { serve } from 'https://deno.land/std@0.168.0/http/server.ts';
serve(async (req) => {
const { name } = await req.json();
return new Response(JSON.stringify({ message: `Hello ${name}!` }), {
headers: { 'Content-Type': 'application/json' },
});
});
# Deploy
supabase functions deploy hello
Edge Function dengan Hono
Karena Edge Functions menggunakan standard fetch API, kamu bisa pakai Hono:
import { Hono } from 'npm:hono';
const app = new Hono();
app.get('/hello',
(c) => c.json({ message: 'Hello from Edge!' }));
Deno.serve(app.fetch);
Database Triggers
Triggers memungkinkan kamu menjalankan code saat event database terjadi:
CREATE FUNCTION notify_new_todo() RETURNS TRIGGER AS $$
BEGIN
PERFORM net.http_post(
url := 'https://<project>.supabase.co/functions/v1/notify',
body := json_build_object('todo', row_to_json(NEW))
);
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER todo_created
AFTER INSERT ON todos FOR EACH ROW
EXECUTE FUNCTION notify_new_todo();
Production Checklist
- RLS policies: Pastikan semua tabel punya RLS
- API limits: Monitor usage dan rate limits
- Backups: Supabase auto-backup daily (paid tier)
- Migrations: Gunakan supabase db push untuk schema changes
- Environment: Gunakan branches untuk staging/production
- Monitoring: Dashboard analytics di Supabase console
Contoh Kode
// Edge Function dengan Hono dan Supabase
// functions/api/index.ts
import { createClient } from 'npm:@supabase/supabase-js@2';
import { Hono } from 'npm:hono';
import { cors } from 'npm:hono/cors';
const app = new Hono();
app.use('*', cors());
app.use('*', async (c, next) => {
const supabase = createClient(
Deno.env.get('SUPABASE_URL')!,
Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')!,
);
c.set('supabase', supabase);
await next();
});
app.get('/todos', async (c) => {
const supabase = c.get('supabase');
const { data, error } = await supabase.from('todos').select('*');
if (error) return c.json({ error: error.message }, 500);
return c.json(data);
});
app.post('/todos', async (c) => {
const supabase = c.get('supabase');
const body = await c.req.json();
const { data, error } = await supabase.from('todos').insert(body).select();
if (error) return c.json({ error: error.message }, 500);
return c.json(data, 201);
});
Deno.serve(app.fetch);Penjelasan Kode
Prompt AI
Buat Edge Function untuk webhook: terima event dari payment gateway, update database berdasarkan payment status.
Pertanyaan Reflektif
Edge Functions punya cold start. Untuk latency critical, pertimbangkan keep-warm strategies.