Triển khai xanh / xanh với CloudFront


16

Tôi đang tìm cách triển khai Blue / Green với CloudFront .

Có ai có một giải pháp tốt để chuyển từ phân phối CloudFront này sang phân phối khác hay mọi người thực sự chỉ tạo phân phối của họ và sau đó không bao giờ chạm vào nó nữa?

Bản phân phối CloudFront của tôi bao gồm một nguồn gốc S3 cho nội dung tĩnh (javascript, v.v.) và nguồn gốc tùy chỉnh trỏ đến AWS ELB.

Không có thay đổi đối với CloudFront

Trong các trường hợp thông thường, chúng tôi không thực hiện bất kỳ thay đổi nào đối với bản phân phối CloudFront của mình. Chúng tôi phiên bản nội dung tĩnh của chúng tôi trong nguồn gốc S3 bằng cách thay đổi tên của các tệp nội dung tĩnh trong S3 và thực hiện triển khai cho các phiên bản EC2 trong Bộ cân bằng tải đàn hồi (ELB). Tuy nhiên, đôi khi chúng ta cần kiểm tra và thực hiện các thay đổi đối với bản phân phối CloudFront hoặc có những thay đổi đủ quan trọng đối với môi trường của chúng ta mà chúng ta cần chỉ ra ELB mới trong môi trường mới.

Hai bản phân phối CloudFront

Tùy chọn đầu tiên tôi đã thử là có hai Bản phân phối Web CloudFront riêng biệt , một cho môi trường hiện tại hoặc A, môi trường và một cho môi trường mới hoặc B của tôi. Tôi đã cố gắng sử dụng chính sách định tuyến có trọng số Route53 trong đó tôi đã thêm hai bản ghi cho bản ghi www.domain.com Route53 của mình, một bản ghi vào CloudFront Distribution A có trọng số 1 và bản còn lại chỉ vào CloudFront Distribution B với trọng số 0. kế hoạch sẽ là thay đổi các trọng số khi tôi muốn chuyển từ phân phối A sang phân phối B. Tuy nhiên, chỉ một phân phối CloudFront tại một thời điểm có thể có Tên miền thay thế www.domain.com (CNAME) đăng ký hoặc bạn gặp phải lỗi sau:

com.amazonaws.services.cloudfront.model.CNAMEAlreadyExistsException: One or more of the CNAMEs you provided are already associated with a different resource. (Service: AmazonCloudFront; Status Code: 409; Error Code: CNAMEAlreadyExists; Request ID: ef84a5f0-44e7-11e5-9315-0ba167bb108a)

Phân phối một CloudFront

Tùy chọn thứ hai là giữ một bản phân phối web CloudFront. Tôi có S3 và nguồn gốc tùy chỉnh trỏ đến cả hai môi trường A và B của tôi và sau đó tôi cập nhật Hành vi bộ đệm của CloudFront để trỏ đến nguồn gốc khác khi tôi muốn chuyển từ môi trường này sang môi trường khác. Điều này cực kỳ lộn xộn vì các bản cập nhật này mất 15-60 phút, không thể thấy được tiến trình của bản cập nhật và tùy thuộc vào bản chất thay đổi của bạn, bạn có thể cần phải theo dõi điều đó với Vô hiệu hóa CloudFront để bạn không phục vụ nội dung được lưu trong bộ nhớ cache từ môi trường cũ cùng với nội dung mới.

Cảm ơn lời khuyên của bạn!


Bạn đã tìm thấy bất kỳ giải pháp? Chúng tôi có cùng một vấn đề trong dự án của chúng tôi và cách chúng tôi thực hiện ngay bây giờ - chúng tôi thay đổi điểm cuối đám mây theo cách thủ công trong dự án của chúng tôi.
Dmytriy Voloshyn

1
tiếc là không - tôi không nghĩ có một cái tốt. Cách thực hành tốt nhất là sử dụng một bản phân phối trên nền tảng đám mây, phiên bản bất kỳ nội dung nào trong các thùng s3 và sử dụng các bản ghi dns có trọng số route53 cho nguồn gốc trỏ đến nội dung động. sau đó, bạn chỉ cần cập nhật tuyến53 để thay đổi nội dung động và bạn không cần phải chạm vào đám mây. Chúng tôi duy trì phân phối đám mây riêng cho dev và qa. EX: stackoverflow.com/questions/9130555/ Mạnh
Peter M

Câu trả lời:


8

Hai bản phân phối Cloudfront

Vì AWS cho phép chồng lấp giữa các CNAME thay thế ký tự đại diện trong cùng một tài khoản AWS, bạn có thể chuyển đổi giữa hai bản phân phối trên nền tảng đám mây theo cách sau:

  • Sử dụng www.domain.com làm CNAME thay thế cho phân phối Prod 1
  • Sử dụng * .domain.com làm CNAME thay thế cho phân phối Prod 2
  • Trỏ CNAME DNS www.domain.com của bạn sang phân phối 1 hoặc phân phối 2. (* .cloudfront.net).
  • Xóa CNAME thay thế khỏi bản phân phối mà bạn không muốn phân phát nội dung nữa.

Tuy nhiên, hai DNS phân phối khác nhau (* .cloudfront.net) có thể trỏ đến cùng các nút cạnh, điều đó có nghĩa là cách thức cung cấp nội dung của bạn bằng cách khớp với CNAME của cloudfront.net với các nút Edge phục vụ nó và sau đó khớp với tên máy chủ. Trong trường hợp này, nếu cả hai bản phân phối của bạn đang sử dụng cùng một nút cạnh (có thể được kiểm tra ví dụ với dig) thì phần cắt sẽ không sạch.

ví dụ: Nếu cả hai bản phân phối chia sẻ một hoặc nhiều nút cạnh, phân phối 1 với Alt CNAME www.domain.com sẽ được ưu tiên hơn phân phối 2 với * .domain.com chung hơn cho đến khi CNAME bị xóa khỏi cấu hình phân phối 1 trong tất cả các nút cạnh . Vì vậy, phiên bản được truy xuất từ ​​một yêu cầu có thể khác với yêu cầu khác trong giai đoạn chuyển tiếp.


Do thời gian tăng sinh thay đổi kéo dài trong CloudFront, đây thực sự là lựa chọn duy nhất của bạn.
CloudWalker

Cảm ơn - đây là một câu trả lời cực kỳ thú vị. Tôi chưa bao giờ nghĩ về việc làm theo cách này. Tôi sẽ đánh dấu nó đúng vì nó bị cắt từ phân phối này sang phân phối khác, tuy nhiên, tôi cần tránh thời gian tăng sinh kéo dài và nguy cơ phục vụ nội dung sai trong quá trình chuyển đổi, vì vậy tôi không thể sử dụng nó trong trường hợp của mình . Tôi đồng ý với @CloudWalker rằng không có lựa chọn nào khác.
Peter M

3

Một chút muộn trong trò chơi ở đây, nhưng cho bất cứ ai khác tìm kiếm điều này. Tôi tin rằng điều này có thể được thực hiện bằng cách sử dụng lambda @ edge. Tương tự như xét nghiệm A / B. https://docs.aws.amazon.com/lambda/latest/dg/lambda-edge.html . Bạn có thể thực hiện chức năng lambda được kích hoạt khi người dùng yêu cầu url. Chọn phân phát nội dung màu xanh / xanh từ các nguồn gốc hoặc tiền tố url khác nhau. Một giá trị cookie sẽ xác định triển khai nào sẽ được phục vụ. Khi yêu cầu đầu tiên đến (không có cookie), đặt cookie ngẫu nhiên nói 95% xanh 5% xanh lục.


1

Chụp từ hông, mất bao lâu để chuyển đổi nguồn gốc trong phân phối phía trước đám mây? 1) triển khai mã mới phía sau ELB, làm ấm lên 2) thêm ELB này làm nguồn gốc mới vào bản phân phối phía trước đám mây của bạn trong khi xóa nguồn gốc cũ 3) sau khi cắt, xé mã cũ phía sau ELB cũ.

Để thoát khỏi sự chậm trễ liên quan đến các bản cập nhật CloudFront hoặc cập nhật DNS, bạn có thể trao đổi nhóm tự động phía sau ELB của mình. 1) triển khai mã mới trong ASG mới, làm nóng nó 2) đăng ký ELB hiện tại của bạn với ASG 3 mới này) hủy đăng ký ASG cũ từ ELB 4 của bạn) sau khi cắt bỏ ASG cũ.


0

Tôi cũng đã nghiên cứu về chủ đề này và giải quyết vấn đề (xem bên dưới).

Lý lịch:

CloudFront yêu cầu CNAME trong cấu hình phân phối phải là duy nhất trên toàn bộ tài khoản của bạn. Vì vậy, kiểm soát màu xanh / xanh thông qua DNS đến các bản phân phối khác nhau sẽ không hoạt động. Có một bản hack xoay quanh sẽ sử dụng thẻ hoang dã nhưng điều đó không đảm bảo rằng các tệp chính xác được phục vụ. Kiểm soát màu xanh / xanh thông qua DNS và CloudFront là không khả thi.

Hơn nữa, việc thay đổi bất kỳ cấu hình nào trong CloudFront (bao gồm CNAME) sẽ dẫn đến 15-60 phút chờ trong khi các thay đổi được truyền đến các máy chủ biên. Ngoài ra, không phải là một thiết lập lý tưởng.

Làm việc xung quanh:

Đối với ứng dụng một trang, cấu hình này có thể thực hiện thủ thuật:

  • URL ứng dụng: app.mydomain.com/app
  • Cấu trúc S3:
    • ứng dụng / (trang web trực tiếp của bạn)
    • app2 / (trang web không trực tiếp của bạn)

Bây giờ hãy định cấu hình CloudFront để sử dụng nhóm của bạn để phục vụ các tệp. Tại thời điểm này, tất cả là do bạn cài đặt bộ đệm. Vì CloudFront mất mãi mãi, hãy đặt tiêu đề CacheControl trên các đối tượng S3 của chúng tôi. Đối với index.html, chúng tôi sử dụng 5 phút, mọi thứ khác, 1 ngày. Khi đến lúc phải chuyển đổi, trao đổi tên thư mục S3. Trong vòng 5 phút, ứng dụng sẽ hoạt động cho tất cả ý định và mục đích.

Đối với các ứng dụng đã chạy, chúng tôi có phiên bản xây dựng được tích hợp mã và tệp json cấu hình trên thư mục gốc của ứng dụng. Sau đó, ứng dụng sẽ thỉnh thoảng yêu cầu tệp json, kiểm tra phiên bản, nếu hết hạn, hãy nhắc làm mới.

Hạn chế

Bạn không thể thực hiện kiểm tra ngâm rất tốt. Tôi cho rằng có thể tăng chỉ số TTL.html lên vài giờ hoặc vài ngày (tùy theo nhu cầu của bạn), điều đó sẽ giúp đảm bảo khách hàng sẽ nhận được các phiên bản mới khi bộ nhớ cache cục bộ của họ hết hạn.


0

Trong bài đăng trên blog này , tác giả thực hiện thử nghiệm ab thông qua Lambda @ Edge đang xử lý mã trong tài liệu AWS (bạn có thể xem ví dụ của họ ở đây: https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda- ví dụ.html ).

Về cơ bản những gì bạn làm là bạn tạo một bản phân phối Cloudfront duy nhất chỉ ra hai nguồn gốc khác nhau. Sau đó, bạn có thể sử dụng Lambda @ Edge để hướng lưu lượng truy cập đến nguồn gốc (thông qua Cookies) và tất nhiên bạn có thể triển khai những thứ khác thông qua Lambda như tăng trọng lượng lưu lượng hoặc lật nó, v.v. Bạn cũng dễ dàng thêm nguồn gốc và logic .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.