

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Amazon ECS 藍/綠服務部署工作流程
<a name="blue-green-deployment-how-it-works"></a>

Amazon ECS 藍/綠部署程序採用結構化方法，包含六個不同階段，以確保安全可靠的應用程式更新。每個階段都有特定用途，以驗證應用程式，並將其從目前版本 (藍色) 轉換為新版本 (綠色)。

1. **準備階段** – 在現有的藍色環境旁建立綠色環境。這包括佈建新的服務修訂版以及準備目標群組。

1. **部署階段**：將新的服務修訂版部署到綠色環境。Amazon ECS 會使用更新後的服務修訂版啟動新任務，同時藍色環境會繼續處理生產流量。

1. **測試階段**：使用測試流量路由驗證綠色環境。Application Load Balancer 會將測試請求導向綠色環境，同時生產流量仍保留在藍色環境中。

1. **流量轉移階段**：根據設定的部署策略，將生產流量從藍色環境轉移到綠色環境。此階段包含監控與驗證檢查點。

1. **監控階段**：在封裝時間段內監控應用程式運作狀態、效能指標與警示狀態。偵測到問題時，會啟動復原操作。

1. **完成階段**：視組態而定，透過終止藍色環境或者為潛在復原案例維持該環境來完成最終部署。

## 工作流程
<a name="blue-green-deployment-workflow"></a>

下圖說明完整的藍/綠部署工作流程，顯示了 Amazon ECS 與 Application Load Balancer 之間的互動：

![\[完整圖表，顯示了 Amazon ECS 中的藍/綠部署程序，其中包含詳細的元件互動、流量轉移階段與監控檢查點\]](http://docs.aws.amazon.com/zh_tw/AmazonECS/latest/developerguide/images/blue-green.png)


增強型部署工作流程包含下列詳細步驟：

1. **初始狀態**：藍色服務 (目前生產環境) 處理 100% 的生產流量。Application Load Balancer 具有一個接聽程式，其規則會將所有請求路由至包含運作狀態良好之藍色任務的藍色目標群組。

1. **綠色環境佈建**：Amazon ECS 會使用更新後的任務定義建立新任務。這些任務已向新的綠色目標群組註冊，但最初不會接收任何流量。

1. **運作狀態檢查驗證**：Application Load Balancer 會對綠色任務執行運作狀態檢查。只有在綠色任務通過運作狀態檢查時，部署才會進入下一階段。

1. **測試流量路由**：如果已設定，Application Load Balancer 的接聽程式規則會將特定流量模式 (例如具有測試標頭的請求) 路由至綠色環境進行驗證，而生產流量仍保留在藍色環境中。這由處理生產流量的同一接聽程式控制，並根據請求屬性使用不同的規則。

1. **生產流量轉移**：根據部署組態，流量會從藍色環境轉移到綠色環境。在 ECS 藍/綠部署中，這是即時 (一次全部) 轉移，其中 100% 的流量會從藍色環境移至綠色環境。Application Load Balancer 搭配接聽程式規則使用單一接聽程式，根據權重控制藍色與綠色目標群組之間的流量分佈。

1. **監控與驗證**：在整個流量轉移期間，Amazon ECS 會監控 CloudWatch 指標、警示狀態與部署運作狀態。如果偵測到問題，就會觸發自動復原。

1. **封裝時間段**：在生產流量轉移後，藍色與綠色服務修訂版同時執行的持續時間。

1. **藍色環境終止**：在成功的流量轉移與驗證之後，藍色環境會終止以釋放叢集資源，或者會保留以實現快速復原功能。

1. **最終狀態**：綠色環境會成為新的生產環境，處理 100% 的流量。部署會標記為成功。

## 部署生命週期階段
<a name="blue-green-deployment-stages"></a>

藍/綠部署程序會經歷不同的生命週期階段 (部署操作中的一系列事件，例如「生產流量轉移後」)，每個事件都有特定的責任與驗證檢查點。了解這些階段有助於監控部署進度並對問題進行有效的疑難排解。

 每個生命週期階段最多可持續 24 小時。建議將該值保持在 24 小時標記以內。這是因為非同步程序需要時間來觸發勾點。系統逾時、部署失敗，然後在階段達到 24 小時後啟動轉返。 CloudFormation 部署有額外的逾時限制。雖然 24 小時階段限制仍然有效，但 對整個部署 CloudFormation 強制執行 36 小時限制。 部署 CloudFormation 失敗，然後在程序未在 36 小時內完成時啟動轉返。


| 生命週期階段 | Description | 是否將此階段用於 lifecycle hook？ | 
| --- | --- | --- | 
| RECONCILE\$1SERVICE | 僅當啟動新的服務部署且存在多個處於 ACTIVE 狀態的服務修訂版時，此階段才會發生。 | 是 | 
| PRE\$1SCALE\$1UP | 綠色服務修訂版尚未啟動。藍色服務修訂版正在處理 100% 的生產流量。沒有測試流量。 | 是 | 
| SCALE\$1UP | 綠色服務修訂版向上擴展到 100% 並啟動新任務的時間。此時綠色服務修訂版不處理任何流量。 | 否 | 
| POST\$1SCALE\$1UP | 綠色服務修訂版已啟動。藍色服務修訂版正在處理 100% 的生產流量。沒有測試流量。 | 是 | 
| TEST\$1TRAFFIC\$1SHIFT | 藍色與綠色服務修訂版均在執行中。藍色服務修訂版處理 100% 的生產流量。綠色服務修訂版正在從 0% 遷移至 100% 的測試流量。 | 是 | 
| POST\$1TEST\$1TRAFFIC\$1SHIFT | 測試流量轉移已完成。綠色服務修訂版處理 100% 的生產流量。 | 是 | 
| PRODUCTION\$1TRAFFIC\$1SHIFT | 生產流量正在轉移至綠色服務修訂版。綠色服務修訂版正在從 0% 遷移至 100% 的生產流量。 | 是 | 
| POST\$1PRODUCTION\$1TRAFFIC\$1SHIFT | 生產流量轉移已完成。 | 是 | 
| BAKE\$1TIME | 藍色與綠色服務修訂版同時執行的持續時間。 | 否 | 
| CLEAN\$1UP | 藍色服務修訂已完全縮減至 0 項執行中任務。在此階段之後，綠色服務修訂版現在是生產服務修訂版。 | 否 | 

每個生命週期階段都包含內建的驗證檢查點，必須通過這些檢查點才能進入下一階段。如果有任何驗證失敗，部署可以自動復原，以維持服務可用性與可靠性。

當您使用 Lambda 函式時，該函式必須在 15 分鐘內完成工作或傳回 IN\$1PROGRESS。您可以使用 `callBackDelaySeconds` 來延遲對 Lambda 的呼叫。如需詳細資訊，請參閱 GitHub 上 sample-amazon-ecs-blue-green-deployment-patterns 中的 [app.py function](https://github.com/aws-samples/sample-amazon-ecs-blue-green-deployment-patterns/blob/main/ecs-bluegreen-lifecycle-hooks/src/approvalFunction/app.py#L20-L25)。