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 1karena 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
OutOfMemoryatau termination signalSIGKILL.
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:
- 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>- 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.
Komentar
0 komentar
Masuk ke akun kamu untuk ikut berkomentar.
Belum ada komentar
Jadilah yang pertama ikut berdiskusi!