Amazon-Web-Services

藍/綠部署 - 使用 ELB 作為自定義源的 AWS Cloudfront

  • September 21, 2018

我有以下配置:

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。

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