# 🚀 Deployment Checklist: Serverless & Edge Computing

> **Phiên bản:** 1.0 | **Cập nhật:** 2024 | **Áp dụng cho:** Vercel · Cloudflare Workers · AWS Lambda

---

## Mục lục

- [1. Pre-Deploy Checks](#1-pre-deploy-checks)
- [2. Security](#2-security)
- [3. Performance](#3-performance)
- [4. Monitoring Setup](#4-monitoring-setup)
- [5. Rollback Plan](#5-rollback-plan)

---

## 1. Pre-Deploy Checks

> Kiểm tra trước khi triển khai để tránh lỗi runtime và chi phí không mong muốn.

- [ ] **Bundle size audit** — Kiểm tra kích thước bundle không vượt giới hạn cho phép:
  - **Vercel Edge Functions:** ≤ 1 MB (compressed)
  - **Cloudflare Workers:** ≤ 1 MB (uncompressed) / ≤ 5 MB với Workers Paid
  - **AWS Lambda:** ≤ 50 MB (zip) / ≤ 250 MB (unzipped)
  - Dùng `@next/bundle-analyzer` (Vercel) hoặc `wrangler dev --inspect` (Cloudflare) để phân tích

- [ ] **Cold start test** — Đo thời gian cold start trong môi trường staging:
  - **AWS Lambda:** Mục tiêu < 500ms; bật Provisioned Concurrency nếu > 1s
  - **Vercel Functions:** Kiểm tra Runtime Log trong dashboard; mục tiêu < 300ms
  - **Cloudflare Workers:** Cold start thường < 5ms; kiểm tra bằng `wrangler tail`
  - Tránh import heavy dependencies ở top-level (lazy load khi cần thiết)

- [ ] **Environment variables validation** — Xác nhận tất cả biến môi trường đã được khai báo:
  - Chạy script kiểm tra: tất cả `process.env.REQUIRED_VAR` không trả về `undefined`
  - **Vercel:** Kiểm tra trong *Project Settings → Environment Variables* đúng scope (Production/Preview/Development)
  - **Cloudflare:** Xác nhận trong `wrangler.toml` section `[vars]` hoặc Secrets qua dashboard
  - **AWS Lambda:** Kiểm tra trong *Function Configuration → Environment Variables*

- [ ] **Dependency compatibility check** — Xác minh tất cả package tương thích với runtime:
  - Loại bỏ các package dùng Node.js built-in không được hỗ trợ bởi **Cloudflare Workers** (không có `fs`, `path`, `crypto` native)
  - Kiểm tra `package.json` không chứa devDependencies trong production build
  - Chạy `npm audit` / `yarn audit` — resolve tất cả **critical** và **high** vulnerabilities

- [ ] **Smoke test trên staging** — Thực thi test suite cơ bản trên môi trường staging:
  - Gọi tất cả API endpoints quan trọng và xác nhận response code 2xx
  - Kiểm tra database connection pooling hoạt động đúng (đặc biệt với **AWS Lambda** + RDS Proxy)
  - Verify static assets được serve đúng CDN URL, không bị 404

- [ ] **Region & edge location configuration** — Cấu hình vùng triển khai phù hợp:
  - **Vercel:** Chỉ định regions trong `vercel.json` → `"regions": ["sin1", "hnd1"]` cho châu Á
  - **Cloudflare Workers:** Mặc định global; dùng `cf.colo` header để debug routing
  - **AWS Lambda@Edge:** Phải deploy ở `us-east-1`, sau đó replicate qua CloudFront

---

## 2. Security

> Bảo vệ dữ liệu nhạy cảm và ngăn chặn các vector tấn công phổ biến.

- [ ] **Secrets management** — Không hardcode credentials trong source code:
  - **Vercel:** Dùng *Encrypted Environment Variables*; không commit `.env.local` lên git
  - **Cloudflare Workers:** Dùng `wrangler secret put SECRET_NAME` — secrets được encrypt at rest
  - **AWS Lambda:** Tích hợp **AWS Secrets Manager** hoặc **Parameter Store** (SecureString với KMS)
  - Rotate secrets định kỳ; thiết lập expiry date nếu provider hỗ trợ

- [ ] **CORS configuration** — Cấu hình CORS chính xác, không dùng wildcard `*` trong production:
  - Whitelist domain cụ thể: `Access-Control-Allow-Origin: https://yourdomain.com`
  - Chỉ cho phép HTTP methods cần thiết: `Access-Control-Allow-Methods: GET, POST`
  - Kiểm tra preflight OPTIONS request được xử lý đúng
  - **Vercel:** Cấu hình trong `vercel.json` → `"headers"` hoặc middleware

- [ ] **HTTPS enforcement** — Đảm bảo toàn bộ traffic được mã hóa:
  - **Vercel & Cloudflare:** HTTPS tự động; bật *"Always Use HTTPS"* trong Cloudflare SSL/TLS settings
  - **AWS Lambda:** Cấu hình HTTPS-only listener trên API Gateway; redirect HTTP → HTTPS
  - Kiểm tra HSTS header: `Strict-Transport-Security: max-age=31536000; includeSubDomains`

- [ ] **Security headers** — Thêm đầy đủ HTTP security headers:

  ```
  Content-Security-Policy: default-src 'self'
  X-Frame-Options: DENY
  X-Content-Type-Options: nosniff
  Referrer-Policy: strict-origin-when-cross-origin
  Permissions-Policy: camera=(), microphone=(), geolocation=()
  ```

  - **Vercel:** Thêm vào `vercel.json` → `"headers"` array
  - **Cloudflare Workers:** Inject headers trong `response` object trước khi return
  - Dùng [securityheaders.com](https://securityheaders.com) để audit sau deploy

- [ ] **Rate limiting & DDoS protection** — Giới hạn request để ngăn abuse:
  - **Cloudflare Workers:** Dùng **Rate Limiting Rules** trong dashboard (Firewall → Rate Limiting)
  - **AWS Lambda + API Gateway:** Bật *Usage Plans* và *API Keys*; thiết lập throttling limits
  - **Vercel:** Dùng middleware với IP-based rate limiting (ví dụ: `@upstash/ratelimit` + Redis)

- [ ] **Input validation & injection prevention** — Validate và sanitize tất cả input từ client:
  - Dùng schema validation library: `zod`, `joi`, hoặc `yup` ở mọi API handler
  - Parameterized queries cho database — không dùng string concatenation trong SQL
  - Kiểm tra file upload (nếu có): validate MIME type, giới hạn size, scan malware

---

## 3. Performance

> Tối ưu tốc độ response và giảm chi phí vận hành.

- [ ] **Timeout configuration** — Thiết lập timeout phù hợp cho từng function:
  - **AWS Lambda:** Default 3s, max 15 phút; recommend ≤ 30s cho API, ≤ 15 phút cho batch jobs
  - **Vercel Serverless Functions:** Max 10s (Hobby) / 60s (Pro) / 300s (Enterprise)
  - **Vercel Edge Functions:** Max **30s** wall clock time
  - **Cloudflare Workers:** Max **30s** CPU time (50ms CPU time cho free tier)
  - Set timeout = 80% giới hạn tối đa để có buffer cho retry logic

- [ ] **Response compression** — Bật Gzip/Brotli để giảm payload size:
  - **Cloudflare:** Brotli compression tự động bật — verify qua `Content-Encoding: br` header
  - **Vercel:** Tự động compress; đảm bảo không set `Content-Encoding` thủ công để tránh double-compress
  - **AWS Lambda + API Gateway:** Bật *"Enable payload compression"* trong API Gateway settings (min 1 byte)
  - Mục tiêu: JSON response > 1KB nên được compress; kiểm tra bằng `curl -H "Accept-Encoding: gzip"`

- [ ] **Caching headers** — Cấu hình cache strategy đúng cho từng loại content:

  ```
  # Static assets (immutable)
  Cache-Control: public, max-age=31536000, immutable

  # API responses (short cache)
  Cache-Control: public, s-maxage=60, stale-while-revalidate=300

  # Private/user-specific data
  Cache-Control: private, no-store
  ```

  - **Cloudflare:** Dùng *Cache Rules* để override cache behavior; bật **Tiered Cache**
  - **Vercel:** ISR (Incremental Static Regeneration) với `revalidate` option trong Next.js
  - **AWS:** Cấu hình CloudFront cache behaviors với TTL phù hợp theo path pattern

- [ ] **Edge caching & KV storage** — Sử dụng distributed storage cho dữ liệu thường xuyên đọc:
  - **Cloudflare KV:** Lưu session data, feature flags, config; phù hợp read-heavy workloads (eventual consistency)
  - **Cloudflare Durable Objects:** Dùng khi cần strong consistency (ví dụ: realtime counters)
  - **Vercel KV** (powered by Upstash Redis): Cache database query results, API responses
  - **AWS Lambda + ElastiCache:** Connection pooling qua **RDS Proxy** để tránh connection exhaustion

- [ ] **Concurrency & memory optimization** — Cấu hình tài nguyên phù hợp:
  - **AWS Lambda:** Test memory từ 128MB → 3008MB; dùng **AWS Lambda Power Tuning** tool để tìm optimal
  - Tăng memory thường giảm execution time (cost neutral hoặc thậm chí rẻ hơn)
  - **Vercel/Cloudflare:** Monitor memory usage qua logs; tránh in-memory caching lớn (stateless)
  - Implement connection pooling pattern: khởi tạo DB client ngoài handler function

- [ ] **Asset & image optimization** — Tối ưu delivery cho static content:
  - **Vercel:** Sử dụng `next/image` với automatic WebP conversion và lazy loading
  - **Cloudflare:** Bật **Polish** (image compression) và **Mirage** (lazy loading) trong Speed settings
  - Serve assets từ CDN URL, không từ function endpoint
  - Kiểm tra **Core Web Vitals**: LCP < 2.5s, FID < 100ms, CLS < 0.1

---

## 4. Monitoring Setup

> Thiết lập observability đầy đủ để phát hiện và xử lý sự cố nhanh chóng.

- [ ] **Structured logging** — Implement logging có cấu trúc, dễ query và phân tích:
  - Dùng JSON format cho tất cả log entries với fields chuẩn: `timestamp`, `level`, `requestId`, `userId`, `duration`
  - **AWS Lambda:** Log tự động vào **CloudWatch Logs**; dùng **Lambda Powertools** cho structured logging
  - **Vercel:** Xem *Function Logs* trong dashboard; tích hợp **Axiom** hoặc **Datadog** cho log aggregation
  - **Cloudflare Workers:** Dùng `wrangler tail` cho realtime logs; tích hợp **Logpush** để export sang SIEM
  - Không log sensitive data (passwords, tokens, PII) — implement log scrubbing

- [ ] **Error tracking** — Bắt và theo dõi exceptions với đầy đủ context:
  - Tích hợp **Sentry** hoặc **Bugsnag**: wrap handler với error boundary, capture unhandled rejections
  - **Vercel:** Sentry tích hợp native qua `@sentry/nextjs`; 1-click setup trong Vercel Integrations
  - **Cloudflare Workers:** Dùng `addEventListener('unhandledrejection', ...)` + Sentry SDK
  - **AWS Lambda:** Dùng **AWS X-Ray** cho distributed tracing + Sentry cho error details
  - Thiết lập **source maps** upload để xem stack trace gốc (trước khi minify)

- [ ] **Performance monitoring & APM** — Theo dõi latency và throughput liên tục:
  - **AWS:** Bật **CloudWatch Lambda Insights** (enhanced monitoring); theo dõi P50/P95/P99 duration
  - **Vercel:** Kiểm tra *Analytics* tab cho Web Vitals; **Speed Insights** cho real user monitoring
  - **Cloudflare:** Dùng **Workers Analytics Engine** để track custom metrics; xem *Analytics → Workers*
  - Thiết lập **synthetic monitoring**: Pingdom/UptimeRobot gọi health check endpoint mỗi 1-5 phút

- [ ] **Alerting & on-call setup** — Cấu hình cảnh báo tự động với ngưỡng rõ ràng:
  - **AWS CloudWatch Alarms:**
    - `Errors` metric > 1% của total invocations → SNS → PagerDuty/Slack
    - `Duration` P99 > 80% timeout limit → cảnh báo warning
    - `Throttles` > 0 liên tiếp 5 phút → cảnh báo critical
  - **Vercel:** Thiết lập webhook notifications cho deployment failures
  - **Cloudflare:** Dùng *Notifications* trong dashboard cho Worker errors và availability alerts
  - Đảm bảo có **escalation policy**: Level 1 (Slack) → 15 phút → Level 2 (SMS) → 30 phút → Level 3 (call)

- [ ] **Cost monitoring** — Theo dõi chi phí để tránh bill shock:
  - **AWS:** Thiết lập **AWS Budget** với alert khi forecast vượt 80% budget; xem **Cost Explorer** theo function
  - **Cloudflare:** Kiểm tra *Workers Usage* trong dashboard; set spending limits nếu có
  - **Vercel:** Monitor *Usage* tab; đặt spending alerts trong *Billing* settings
  - Định kỳ review invocation count, duration, và cold start frequency hàng tuần

---

## 5. Rollback Plan

> Chuẩn bị sẵn phương án khôi phục nhanh khi deployment có vấn đề.

- [ ] **Deployment versioning** — Đảm bảo có thể quay về version trước trong < 5 phút:
  - **Vercel:** Mỗi deployment có immutable URL; rollback 1-click trong *Deployments* tab → *Promote to Production*
  - **Cloudflare Workers:** Dùng `wrangler rollback` CLI command để revert ngay lập tức; hoặc qua dashboard *Deployments → Rollback*
  - **AWS Lambda:** Publish Lambda versions và dùng **Aliases** (`production` → `$LATEST`); rollback = update alias point đến version cũ
  - Lưu deployment history ít nhất **10 versions** gần nhất

- [ ] **Feature flags** — Tách deployment khỏi release để kiểm soát rollout:
  - Tích hợp **LaunchDarkly**, **Unleash**, hoặc **Cloudflare Workers KV** làm feature flag store
  - Wrap tính năng mới trong flag: `if (flags.isEnabled('new-checkout')) { ... }`
  - Cho phép disable tính năng lỗi mà không cần redeploy — disable flag = instant rollback
  - Implement **canary release**: rollout 5% → 20% → 50% → 100% với monitoring ở mỗi bước

- [ ] **Database migration safety** — Đảm bảo rollback không gây data corruption:
  - Áp dụng **expand-contract pattern**: không drop column cũ cho đến khi code mới ổn định
  - Backup database trước mỗi migration có breaking change
  - Test rollback migration script (`down` migration) trong staging trước khi apply production
  - **AWS RDS:** Tạo manual snapshot trước migration; point-in-time recovery sẵn sàng

- [ ] **Health check & automatic rollback trigger** — Tự động phát hiện deployment lỗi:
  - Implement `/health` endpoint trả về `200 OK` với dependency status (DB, cache, external APIs)
  - **Vercel:** Cấu hình *Health Check URL* trong project settings — tự động rollback nếu health check fail
  - **AWS:** Dùng **CodeDeploy** với `BeforeAllowTraffic` hook để chạy health check; tự động rollback nếu fail
  - **Cloudflare:** Dùng **Health Checks** kết hợp **Load Balancing** để failover tự động
  - Định nghĩa rõ **rollback criteria**: Error rate > 5%, P99 latency > 3x baseline, hoặc health check fail 3 lần liên tiếp

- [ ] **Communication & incident response** — Quy trình xử lý sự cố rõ ràng:
  - Chuẩn bị **incident runbook** với các bước cụ thể: Detect → Assess → Rollback → Communicate → Post-mortem
  - Có sẵn template thông báo cho người dùng (status page trên **Statuspage.io** hoặc **Cloudflare Status**)
  - Xác định rõ **DRI** (Directly Responsible Individual) cho mỗi service
  - Sau mỗi incident: viết **Post-mortem** trong vòng 48h — tập trung vào process improvement, không blame

- [ ] **Rollback drill** — Thực hành rollback định kỳ để đảm bảo quy trình hoạt động:
  - Lên lịch **chaos engineering session** hàng quý: giả lập deployment fail và đo thời gian recover
  - Đảm bảo mọi thành viên trong team đều biết cách thực hiện rollback độc lập
  - Kiểm tra rollback hoạt động đúng trong staging trước mỗi production release lớn
  - Document thời gian rollback thực tế; mục tiêu **RTO** (Recovery Time Objective) < 10 phút

---

## 📊 Quick Reference: Giới hạn Platform

| Tiêu chí | Vercel Edge | Cloudflare Workers | AWS Lambda |
|---|---|---|---|
| **Max bundle size** | 1 MB | 1 MB / 5 MB (Paid) | 50 MB (zip) |
| **Max timeout** | 30s | 30s CPU | 15 phút |
| **Cold start** | ~50ms | < 5ms | 100ms–1s+ |
| **Max memory** | 128 MB | 128 MB | 10 GB |
| **Free tier** | 500K req/tháng | 100K req/ngày | 1M req/tháng |
| **Rollback method** | 1-click Dashboard | `wrangler rollback` | Alias update |

---

## ✅ Sign-off Checklist

Trước khi deploy lên production, xác nhận:

```
[ ] Tech Lead đã review và approve checklist
[ ] Tất cả items trong 5 phần đã được kiểm tra
[ ] Staging deployment chạy ổn định ít nhất 30 phút
[ ] On-call engineer đã được thông báo về deployment window
[ ] Rollback procedure đã được test thành công trong staging
```

---

> 💡 **Tip:** Lưu checklist này dưới dạng **GitHub Issue Template** hoặc **Notion Template** để sử dụng lại tự động cho mỗi lần deploy.