Episode 37 merancang GraphQL serverless-first: optimasi cold start dengan dependensi ringan dan warm-up, AWS Lambda dengan API Gateway dan VPC, edge computing dengan Cloudflare Workers dan Vercel Edge Functions, hingga manajemen koneksi database dengan RDS Proxy dan serverless database.

Serverless mengubah cara kita memikirkan deployment: tidak ada server yang diurus, skala otomatis, dan bayar sesuai pemakaian. Episode 37 merancang GraphQL serverless-first — dengan seluruh keuntungan dan tantangannya.
Kita akan membahas best practices serverless, menjalankan GraphQL di AWS Lambda, menjelajahi edge computing, dan mengelola koneksi database di lingkungan tanpa server.
Cold start terjadi ketika fungsi yang menganggur di-boot ulang — request pertama lebih lambat. Pengurangnya:
{
"dependencies": {
"@apollo/server": "^4",
"graphql": "^16"
}
}Setiap dependency menambah ukuran bundle dan waktu init. Audit package kalian: apakah butuh seluruh library itu, atau cukup bagian kecilnya? Selain itu, terapkan stateless design (episode 34): state bersama di Redis, jangan di memori instance.
GraphQL di Lambda memakai pola handler yang memetakan event HTTP ke GraphQL:
import { startServerAndCreateLambdaHandler } from "@as-integrations/aws-lambda";
import { ApolloServer } from "@apollo/server";
const server = new ApolloServer({ typeDefs, resolvers });
export const graphqlHandler = startServerAndCreateLambdaHandler(server);Handler ini di-expose lewat API Gateway (REST atau HTTP API) yang meneruskan request ke Lambda. Konfigurasi di serverless.yml:
service: graphql-api
provider:
name: aws
runtime: nodejs20.x
memorySize: 512
functions:
graphql:
handler: dist/index.graphqlHandler
events:
- httpApi:
path: /graphql
method: POSTJika Lambda harus mengakses database di VPC (misalnya RDS), konfigurasi VPC di serverless.yml, lalu deploy dengan serverless deploy. Karena instance Lambda ditutup-buka, connection pooling menjadi wajib. Lambda Layers bisa memisahkan dependency besar sehingga bundle handler tetap kecil.
Edge computing menjalankan kode di lokasi terdekat pengguna — latensi terkecil. GraphQL di edge:
export default {
async fetch(request, env) {
const { pathname } = new URL(request.url);
if (pathname === "/graphql") {
return handleGraphQL(request);
}
return new Response("Not found", { status: 404 });
},
};Perhatikan bahwa runtime edge memiliki keterbatasan: tidak semua library Node berjalan di sana (misalnya tanpa Node.js API tertentu). Untuk GraphQL di edge, pertimbangkan query sederhana, hasil yang di-cache CDN, dan panggilan ke origin untuk data mutasi.
Kombinasikan edge dengan regional routing: cache query publik di edge, lalu rute request tulis (mutation) ke region yang tepat. Ini membagi beban dan menjaga latensi rendah untuk pembacaan yang sering.
Masalah klasik serverless: setiap invocation Lambda bisa membuka koneksi, dan database cepat kehabisan koneksi. Solusi standar AWS adalah RDS Proxy — pooler yang memusatkan koneksi Lambda ke database:
import pg from "pg";
const pool = new pg.Pool({
host: process.env.RDS_PROXY_HOST,
database: "app",
user: "app",
password: process.env.DB_PASSWORD,
max: 20,
});RDS Proxy juga menjaga koneksi tetap hangat antar invocation, mengurangi cold start untuk akses database.
Database serverless menghilangkan kebutuhan mengelola instance:
Serverless database cocok dengan pola Lambda yang naik-turun. Ingat RPO dan RTO dari episode 35 tetap berlaku — pastikan backup dan PITR aktif.
Inti yang harus dibawa pulang:
startServerAndCreateLambdaHandler mengekspos GraphQL di AWS Lambda.Di episode 38 selanjutnya kalian akan mempelajari real-time collaboration features — live queries dengan @live, fitur presence dengan status online dan cursor positions, conflict resolution dengan OT dan CRDT, hingga contoh implementasi collaborative editing dan live dashboard. Aplikasi kolaboratif real-time kalian akan hidup!