藍/綠部署 - 使用 ELB 作為自定義源的 AWS Cloudfront
我有以下配置:
Cloudfront - ELB - AutoScalingGroup - EC2s
- Cloudfront 提供
file-[hash].js
來自自定義源 (ELB) 的文件(名稱中包含 chunkhash)。- EC2 為 Cloudfront 提供文件以及指向 Cloudfront 中適當文件的
file-[hash].js
動態生成的文件。index.html``.js
- ELB 已啟用連接耗盡。
一切正常,直到觸發具有更改資產的 Cloudformation 部署(假設從
file-1.js
到) - 當新版本被打開時,瀏覽器獲取指向file-2.js
的新文件時有一個短時間視窗,但是當它嘗試下載時它從 Cloudfront 獲得 404,從而向使用者顯示錯誤。index.html``file-2.js``file-2.js
我理解這是因為藍/綠部署的工作原理——即有時兩個版本的應用程序同時工作,ELB 可以將一個請求重定向到新版本(
index.html
來自瀏覽器的請求),第二個重定向到舊版本(file-2.js
來自 Cloudfront的請求)。Cloudfront 文件說您應該“在所有伺服器上託管和提供相同的內容。”但是我如何在部署期間實現這一點?是否可以強制在任何給定時間通過 ELB 只能訪問單個版本的應用程序,以便 Cloudfront 永遠不會為新資產獲得 404?
如果沒有,除了從自定義來源切換到 S3 之外,還有其他選擇可以解決這個問題嗎?(由於部署/維護的複雜性,想避免它)
注意從更新策略 AutoScalingRollingUpdate 切換到 AutoScalingReplacingUpdate 沒有幫助:
助理秘書長: 類型:AWS::AutoScaling::AutoScalingGroup 創作方針: 資源信號: 數數: 參考:2 超時:PT10M 更新政策: 自動縮放替換更新: 將替換:真
我認為解決方案是將靜態 .js 文件保留在 S3 中,並在發布新應用程序期間將舊版本與新版本一起維護。
CloudFront 將提供來自 S3 的靜態內容和來自 EC2 的動態內容。
先將靜態內容髮佈到 S3,然後開始過渡。
在這種情況下,動態生成的索引頁面將在舊版本中引用一個 S3 儲存桶,在新版本中引用另一個。由於這兩種資源總是在 S3 中解析,因此不會出現 404。