Deployment

使用 CloudFront 的藍/綠部署

  • September 14, 2018

我正在尋找一種使用CloudFront進行藍/綠部署的方法。

有沒有人有一個很好的解決方案來從一個 CloudFront 分配遷移到另一個,或者每個人真的只是創建他們的分配然後再也不碰它了嗎?

我的 CloudFront 分配由一個用於靜態內容(javascript 等)的 S3和一個指向 AWS ELB 的自定義源組成。

CloudFront 沒有變化

在正常情況下,我們根本不會對 CloudFront 分配進行任何更改。我們通過更改 S3 中靜態內容文件的名稱來對 S3 源中的靜態內容進行版本控制,並對彈性負載均衡器 (ELB) 下的 EC2 實例進行滾動部署。但是,有時我們需要對 CloudFront 分配本身進行測試和更改,或者對我們的環境進行足夠大的更改,我們需要在新環境中指向新的 ELB。

兩個 CloudFront 分配

我嘗試的第一個選項是擁有兩個單獨的 CloudFront Web Distributions,一個用於我目前的環境或 A 環境,一個用於我的新環境或 B 環境。我嘗試使用 Route53加權路由策略,為我的 www.domain.com Route53 記錄添加了兩條記錄,一條指向權重為 1 的 CloudFront 分配 A,另一條指向權重為 0 的 CloudFront 分配 B。計劃是在我想從分配 A 移動到分配 B 時更改權重。但是,一次只有一個 CloudFront 分配可以註冊 www.domain.com備用域名 (CNAME),否則您會收到以下錯誤:

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)

一個 CloudFront 分配

第二種選擇是保留一個 CloudFront Web 分配。我有 S3 和自定義源指向我的 A 和 B 環境,然後當我想從一個環境移動到另一個環境時,我更新 CloudFront記憶體行為以指向另一個源。這非常混亂,因為這些更新需要 15 到 60 分鐘,無法看到更新的進度,並且根據您的更改的性質,您可能需要使用CloudFront 失效來跟進,這樣您就不會提供記憶體的內容來自舊環境和新內容。

謝謝你的建議!

兩個 Cloudfront 發行版

由於 AWS 允許同一 AWS 賬戶中的萬用字元備用 CNAME 之間存在重疊,因此您可以通過以下方式在兩個雲端分配之間切換:

  • 使用 www.domain.com 作為 Prod 分發的備用 CNAME 1
  • 使用 *.domain.com 作為 Prod 分發 2 的備用 CNAME
  • 將您的 CNAME DNS www.domain.com 指向分佈 1 或分佈 2。 (*.cloudfront.net)。
  • 從您不想再提供內容的分發中刪除備用 CNAME。

但是,兩個不同的分發 DNS (*.cloudfront.net) 可能指向相同的邊緣節點,這意味著提供內容的方式是將 cloudfront.net CNAME 與為其提供服務的邊緣節點進行匹配,然後通過以下方式進行匹配主機名。在這種情況下,如果您的兩個分佈都使用相同的邊緣節點(例如可以使用 進行檢查dig),則切割將不干淨。

例如,如果兩個分佈共享一個或多個邊緣節點,則具有 Alt CNAME www.domain.com 的分佈 1 將優先於具有更通用 *.domain.com 的分佈 2,直到 CNAME 從所有邊緣節點的分佈 1 配置中刪除. 因此,在過渡期間,從一個請求中檢索到的版本可能與另一個不同。

引用自:https://serverfault.com/questions/714742