Terraform
← Tổng quan series

A/B testing deployment với CloudFront

Định tuyến một phần người dùng sang phiên bản B bằng CloudFront và edge function, đồng thời hiểu các giới hạn vận hành.

Instructor walkthrough

Bài giảng: hiểu luồng trước khi chạy lệnh

Bài toán: Định tuyến một phần người dùng sang phiên bản B bằng CloudFront và edge function, đồng thời hiểu các giới hạn vận hành.

01Chuẩn bịkiểm tra account, region, provider và chi phí
02Đọc planđối chiếu resource address, diff và dependency
03Thực hànhapply mutation nhỏ trong sandbox, lưu evidence
04Khôi phụcre-run, failure drill, destroy hoặc rollback
Command reference · baseline
terraform fmt
terraform init
terraform validate
terraform plan
terraform apply
terraform plan -destroy
terraform destroy

A/B khác blue/green ở đâu?

Blue/green thường chuyển toàn bộ traffic tại một thời điểm. A/B giữ hai phiên bản cùng phục vụ để so sánh hành vi, ví dụ 90% vào prod và 10% vào pre. Quyết định phân nhóm có thể dựa trên cookie, header, path hoặc một hash ổn định theo user.

CloudFront nằm ở edge; S3 hoặc origin phía sau chứa hai site. Terraform quản lý distribution, origin, IAM và code function. Function quyết định origin nào nhận request.

resource "aws_cloudfront_distribution" "site" {
  enabled = true

  origin {
    domain_name = aws_s3_bucket.prod.bucket_regional_domain_name
    origin_id   = "prod"
  }

  origin {
    domain_name = aws_s3_bucket.pre.bucket_regional_domain_name
    origin_id   = "pre"
  }

  default_cache_behavior {
    target_origin_id       = "prod"
    viewer_protocol_policy = "redirect-to-https"
    allowed_methods        = ["GET", "HEAD"]
    cached_methods         = ["GET", "HEAD"]
  }
}

Phân nhóm phải ổn định

Nếu mỗi request random lại chọn origin khác nhau, người dùng sẽ thấy trạng thái không nhất quán. Edge function nên đọc cookie đã gán hoặc hash một identifier. Cần suy nghĩ kỹ về privacy, cache key và việc không được đưa secret vào cookie client.

Pseudo-code dễ hiểu:

const bucket = stableHash(userId) % 100;
request.headers['x-release'] = [{ key: 'X-Release', value: bucket < 10 ? 'pre' : 'prod' }];
return request;

Trong CloudFront, runtime, version publish và region triển khai function có ràng buộc riêng. Hãy test bằng staging distribution trước; propagation có thể mất thời gian và chi phí request/log tăng nhanh.

Cache là bẫy lớn nhất

Nếu cache key không bao gồm cookie/header dùng để phân nhóm, CloudFront có thể trả response của nhóm A cho nhóm B. Ngược lại, đưa quá nhiều header vào cache key làm giảm hit rate. Xác định rõ dữ liệu nào được phép cache và invalidation sau release.

Đo lường và kết thúc thử nghiệm

Gắn release label vào log/metric, theo dõi conversion, error rate, latency và rollback threshold. A/B test không có ý nghĩa nếu hai nhóm nhận traffic hoặc dữ liệu khác nhau một cách không kiểm soát.

Ma trận kiểm thử trước khi bật traffic

Tình huống Kết quả cần kiểm tra
Không có cookie Người dùng được gán nhóm một lần, không nhảy nhóm
Có cookie pre Request tới đúng origin pre
Cache hit Response không bị chia sẻ sai giữa hai nhóm
Origin lỗi Có hành vi fail/rollback đã định nghĩa
Purge/invalidation Nội dung mới xuất hiện đúng thời điểm

Hãy test bằng hai user giả lập và đọc cả response header lẫn log edge. Nếu chỉ mở trình duyệt một lần, rất dễ bỏ qua lỗi cache key. Khi kết thúc, chuyển 100% về phiên bản thắng, lưu kết quả thí nghiệm rồi xóa origin/function tạm để tránh phí và cấu hình chết.

Expected state và experiment safety gate

Dùng staging distribution/origin, release header/cookie không chứa secret và traffic 0% trước khi bật thử. Expected state là hai origin có version marker khác nhau, user ổn định ở cùng cohort, cache policy phân biệt đúng variation, response header/log ghi cohort, metrics có denominator và rollback về 100% prod hoạt động.

Thực hiện các drill:

  1. Test hai user giả lập với/không cookie, refresh nhiều lần và kiểm tra origin/release header; nếu cohort nhảy, dừng trước traffic.
  2. Cố ý loại cookie/header khỏi cache key, quan sát response có nguy cơ lẫn cohort rồi sửa policy; không invalidate mù để che lỗi phân loại.
  3. Làm origin pre lỗi hoặc edge function version sai, kiểm tra error/rollback threshold, fail-closed/fail-safe behavior và chuyển 100% về prod.
  4. Đo propagation/invalidation/cost/log sampling và xóa function/origin/distribution test theo plan; lưu experiment result, cohort size, time window và privacy/retention decision.

Quality gate

Pass khi cohort assignment deterministic, cache key không trộn response, origin/function version/region được pin, metrics/error/latency có acceptance threshold, rollback có một thay đổi nhỏ và evidence, privacy/cookie/log policy rõ và cleanup không để CloudFront/function/request cost ngoài ý muốn. Terraform không tự chứng minh statistical validity hay application correctness của experiment.