Arsitektur Container Serverless di Vercel

Dukungan Dockerfile di Vercel memungkinkan eksekusi runtime non-Node.js (seperti Python, Go, atau Rust) dalam model serverless. Container di-build menjadi OCI-compliant image dan dijalankan sesuai permintaan (on-demand). Pendekatan ini mempertahankan model penskalaan otomatis ke nol (scale-to-zero), tetapi menuntut penanganan performa startup dan port binding yang presisi.

Konfigurasi Dockerfile: Port Binding dan Entrypoint

Vercel meneruskan lalu lintas HTTP melalui environment variable PORT. Container wajib mendengarkan (listen) pada 0.0.0.0:$PORT, bukan 127.0.0.1 atau port statis, agar reverse proxy Vercel dapat melakukan health check dan merutekan traffic.

Gunakan format JSON exec pada CMD atau ENTRYPOINT untuk memastikan sinyal sistem seperti SIGTERM diteruskan langsung ke proses utama aplikasi tanpa di-block oleh subshell.

# Multi-stage build untuk Python/FastAPI minimal
FROM python:3.11-slim AS builder

WORKDIR /app
RUN apt-get update && apt-get install -y --no-install-recommends gcc && rm -rf /var/lib/apt/lists/*
COPY requirements.txt .
RUN pip install --no-cache-dir --user -r requirements.txt

FROM python:3.11-slim AS runner

WORKDIR /app
COPY --from=builder /root/.local /root/.local
COPY main.py .

ENV PATH=/root/.local/bin:$PATH
ENV PYTHONUNBUFFERED=1

# Hindari shell form. Gunakan exec form agar SIGTERM diteruskan ke uvicorn
CMD ["sh", "-c", "uvicorn main:app --host 0.0.0.0 --port ${PORT:-8080}"]

Catatan: Multi-stage build memangkas layer compiler (seperti gcc), menghasilkan base image yang ringan dan mempercepat deployment cache.

Mengelola Metrik Cold Start

Dalam platform serverless, cold start dipicu oleh dua fase: inisialisasi infrastruktur container dan bootstrap proses aplikasi. Beberapa optimasi wajib diterapkan:

  • Pangkas Ukuran Image: Gunakan base image minimal (seperti Alpine atau Distroless). Hindari instalasi dependensi build-time pada target image. Ukuran image kecil memangkas latensi pull container.
  • Lazy Loading Dependensi: Impor modul berat secara dinamis di dalam route handler spesifik jika modul tersebut tidak dibutuhkan saat server pertama kali booting.
  • Health Check Cepat: Pastikan HTTP server mengikat port sesegera mungkin. Hindari eksekusi tugas sinkronus intensif (misal: migrasi database atau pemrosesan batch) saat server boot.

Observabilitas Runtime dan Identifikasi Error

Log runtime dari standard output (stdout) dan standard error (stderr) ditangkap langsung oleh sistem logging Vercel. Error kritis biasanya disebabkan oleh dua kondisi utama:

  • Unhandled Exit Code: Proses keluar dengan kode status non-zero (misal: exit code 1 karena dependensi hilang atau unhandled promise/exception saat init).
  • Memory Limit Exceeded (OOM): Jika container melampaui alokasi RAM fungsi serverless, proses langsung dihentikan oleh runtime dengan indikasi log OutOfMemory atau termination signal SIGKILL.

Terapkan structured logging (format JSON) agar tracing stack trace dan monitoring kode status HTTP dapat diurai dengan akurat melalui dashboard Vercel atau runtime log integrations.

Strategi Instant Rollback

Deployment Vercel menghasilkan URL unik berbasis hash untuk setiap commit (immutable deployments). Strategi penanganan kegagalan runtime:

  1. Automated Rollback via CLI: Jika sistem observabilitas mendeteksi lonjakan status HTTP 5xx pasca deployment, kembalikan traffic secara instan ke deployment sebelumnya:
vercel rollback <deployment-id-atau-url>
  1. Promosi Manual via Dashboard: Akses menu Deployments pada proyek Vercel, pilih build stabil sebelumnya, dan klik Instant Rollback. Operasi ini mengubah routing alias domain utama secara instan tanpa melakukan re-build image.

Trade-offs: Dockerfile vs Runtime Standar

Penggunaan Dockerfile memberikan isolasi penuh dan fleksibilitas runtime, tetapi memiliki trade-off cold start yang umumnya lebih tinggi dibanding runtime native Vercel (seperti Node.js standar edge/serverless). Gunakan container kustom hanya jika aplikasi memerlukan binary sistem khusus, dependensi native C, atau bahasa pemrograman yang tidak didukung runtime default.