← 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.

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.

Xem bài nguồn A/B Testing Deployment và luôn kiểm tra giá CloudFront/Lambda@Edge trước khi thử ở quy mô lớn.