將 CodeDeploy 藍/綠部署遷移至 Amazon ECS 藍/綠部署 - Amazon Elastic Container Service

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

將 CodeDeploy 藍/綠部署遷移至 Amazon ECS 藍/綠部署

CodeDeploy 藍/綠部署與 Amazon ECS 藍/綠部署提供類似的功能,但兩者在設定與管理方式上有所不同。

CodeDeploy 藍/綠部署概觀

使用 CodeDeploy 建立 Amazon ECS 服務時,您需要:

  1. 建立具有生產接聽程式與測試接聽程式 (選用) 的負載平衡器。每個接聽程式都會設定單一 (預設) 規則,將所有流量路由至單一目標群組 (主要目標群組)。

  2. 建立 Amazon ECS 服務,設定為使用該接聽程式與目標群組,並將 deploymentController 類型設定為 CODE_DEPLOY。建立服務後,會建立已向指定目標群組註冊的 (藍色) 任務集。

  3. 建立 CodeDeploy 部署群組 (作為 CodeDeploy 應用程式的一部分),並使用 Amazon ECS 叢集、服務名稱、負載平衡器接聽程式、兩個目標群組 (用於生產接聽程式規則的主要目標群組,以及用於替代任務的次要目標群組)、服務角色 (向 CodeDeploy 授予操作 Amazon ECS 與 Elastic Load Balancing 資源的許可) 以及用於控制部署行為之各種參數的詳細資訊對該部署群組進行設定。

使用 CodeDeploy 時,會指定 CodeDeploy 應用程式名稱、部署群組名稱與 AppSpec 檔案 (該檔案提供有關新修訂版與選用 lifecycle hook 的詳細資訊),透過 CreateDeployment() 部署新版本的服務。CodeDeploy 部署會建立替代 (綠色) 任務集,並向次要目標群組註冊其任務。當運作狀態良好時,即可進行測試 (選用) 與生產。在這兩種情況下,會透過將個別接聽程式規則變更為指向與綠色任務集關聯的次要目標群組來實現重新路由。透過將生產接聽程式規則變更回主要目標群組來實現復原。

Amazon ECS 藍/綠部署概觀

使用 Amazon ECS 藍/綠部署時,部署組態是 Amazon ECS 服務本身的一部分:

  1. 必須預先設定負載平衡器生產接聽程式,並使其具備的規則包含兩個權重分別為 1 與 0 的目標群組。

  2. 您需要指定下列資源,或更新服務資源:

    • 此接聽程式規則的 ARN

    • 兩個目標群組

    • IAM 角色,用於授予 Amazon ECS 呼叫 Elastic Load Balancing API 的許可

    • 選用 IAM 角色,用於執行 Lambda 函式

    • deploymentController 類型設定為 ECS,並將 deploymentConfiguration.strategy 設定為 BLUE_GREEN。這會建立 (藍色) 服務部署,並向主要目標群組註冊其任務。

使用 Amazon ECS 藍/綠部署時,會透過呼叫 Amazon ECS UpdateService() 建立新的服務修訂版,並傳遞新修訂版的詳細資訊。服務部署會建立新的 (綠色) 服務修訂版任務,並向次要目標群組註冊任務。Amazon ECS 透過切換接聽程式規則上的權重來處理重新路由與復原操作。

關鍵實作差異

雖然這兩種方法都會建立初始任務集,但基礎實作有所不同:

  • CodeDeploy 使用任務集,而 Amazon ECS 使用服務修訂版。Amazon ECS 任務集是較舊的建構模組,已由 Amazon ECS 服務修訂版與部署取代。後者提供了對部署程序以及服務部署與服務修訂版歷史記錄的更高可見性。

  • 對於 CodeDeploy,lifecycle hook 會指定為提供給 CreateDeployment() 之 AppSpec 檔案的一部分。這表示勾點可以在不同的部署之間變更。對於 Amazon ECS 藍/綠部署,勾點會指定為服務組態的一部分,進行任何更新都需要呼叫 UpdateService()

  • CodeDeploy 與 Amazon ECS 藍/綠部署都使用 Lambda 進行勾點實作,但預期的輸入與輸出有所不同。

    對於 CodeDeploy,函式必須呼叫 PutLifecycleEventHookExecutionStatus() 才能傳回勾點狀態,狀態可以是 SUCCEEDEDFAILED。對於 Amazon ECS,Lambda 回應用於指示勾點狀態。

  • CodeDeploy 會調用每個勾點作為一次性呼叫,且預期會在一小時內傳回最終執行狀態。Amazon ECS 勾點則更具彈性,因為它們可以傳回 IN_PROGRESS 指標,這表示必須反复重新調用勾點,直到狀態為 SUCCEEDEDFAILED。如需詳細資訊,請參閱Amazon ECS 服務部署的 lifecycle hook

遷移方法

從 CodeDeploy 藍/綠部署遷移到 Amazon ECS 藍/綠部署主要有三種方法。每種方法在複雜性、風險、復原功能與潛在停機時間方面都有不同的特性。

重複使用用於 CodeDeploy 的相同 Elastic Load Balancing 資源

您可以更新現有的 Amazon ECS 服務,以搭配藍/綠部署策略使用 Amazon ECS 部署控制器,而不是 CodeDeploy 部署控制器。採取此方法時,請考量下列事項:

  • 遷移程序更為簡單,因為您正在更新現有的 Amazon ECS 服務部署控制器與部署策略。

  • 正確設定與遷移時,不會有停機時間。

  • 復原需要您還原服務修訂版。

  • 風險較高,因為沒有平行的藍/綠組態。

您可以使用與用於 CodeDeploy 的相同負載平衡器接聽程式及目標群組。如果您使用的是 CloudFormation,請參閱 將 CloudFormation CodeDeploy 藍/綠部署範本遷移至 Amazon ECS 藍/綠 CloudFormation 範本

  1. 修改生產/測試接聽程式的預設規則,以包含替代目標群組,並將主要目標群組的權重設定為 1,將替代目標群組設定為 0。

    對於 CodeDeploy,必須為連接至服務的負載平衡器接聽程式設定單一 (預設) 規則,將所有流量路由至單一目標群組。對於 Amazon ECS 藍/綠部署,負載平衡器接聽程式必須預先設定規則,其中包含兩個具有權重的目標群組。主要目標群組的權重必須為 1,替代目標群組的權重必須為 0。

  2. 透過呼叫 UpdateService API 並將參數 deploymentController 設定為 ECS,將參數 deploymentStrategy 設定為 BLUE_GREEN,來更新現有的 Amazon ECS 服務。指定目標群組、替代目標群組、生產接聽程式以及選用的測試接聽程式的 ARN。

  3. 驗證服務是否如預期般運作。

  4. 刪除此 Amazon ECS 服務的 CodeDeploy 設定,因為您現在使用的是 Amazon ECS 藍/綠部署。

使用現有負載平衡器的新服務

此方法使用藍/綠策略進行遷移。

採取此方法時,請考量下列事項:

  • 干擾最少。僅在 Elastic Load Balancing 連接埠交換期間發生。

  • 復原需要還原 Elastic Load Balancing 連接埠交換。

  • 風險較低,因為存在平行組態。因此,您可以在流量轉移之前進行測試。

  1. 保持 CodeDeploy 設定的接聽程式、目標群組與 Amazon ECS 服務不變,以便您可以視需要輕鬆復原至此設定。

  2. 在現有負載平衡器下建立新的目標群組與新的接聽程式 (使用與原始接聽程式不同的連接埠)。然後,建立一個符合現有 Amazon ECS 服務的新 Amazon ECS 服務,不同之處在於使用 ECS 作為部署控制器,BLUE_GREEN 作為部署策略,並傳遞新目標群組與新接聽程式規則的 ARN。

  3. 透過向服務手動傳送 HTTP 流量來驗證新設定。如果一切順利,請交換原始接聽程式與新接聽程式的連接埠,將流量路由至新設定。

  4. 驗證新設定,如果一切繼續如預期般運作,則刪除 CodeDeploy 設定。

使用新負載平衡器的新服務

與前一種方法類似,此方法使用藍/綠策略進行遷移。關鍵差異在於從 CodeDeploy 設定切換到 Amazon ECS 藍/綠設定發生於負載平衡器上方的反向代理層。反向代理層的範例實作是 Route 53 與 CloudFront。

此方法適用於已經擁有此反向代理層的客戶,並且所有與服務的通訊都透過該代理層進行的情況 (例如,負載平衡器層級沒有直接通訊)。

採取此方法時,請考量下列事項:

  • 這需要反向代理層。

  • 遷移程序更為複雜,因為您需要更新現有的 Amazon ECS 服務部署控制器與部署策略。

  • 干擾最少。僅在 Elastic Load Balancing 連接埠交換期間發生。

  • 復原需要您反轉代理組態變更。

  • 風險較低,因為存在平行組態。因此,您可以在流量轉移之前進行測試。

  1. 請勿完全修改現有的 CodeDeploy 設定 (負載平衡器、接聽程式、目標群組、Amazon ECS 服務與 CodeDeploy 部署群組)。

  2. 建立針對 Amazon ECS 藍/綠部署設定的新負載平衡器、目標群組與接聽程式。

    設定相應的資源。

  3. 建立新服務,將 ECS 作為部署控制器,BLUE_GREEN 作為部署策略,並指向新的負載平衡器資源。

  4. 透過新的負載平衡器測試新設定,以驗證設定。

  5. 更新反向代理組態,將流量路由至新的負載平衡器。

  6. 觀測新的服務修訂版,如果一切繼續如預期般運作,則刪除 CodeDeploy 設定。

後續步驟

遷移至 Amazon ECS 藍/綠部署之後:

  • 更新部署指令碼與 CI/CD 管道,以使用 Amazon ECS UpdateService API 而不是 CodeDeploy CreateDeployment API。

  • 更新監控與提醒,以追蹤 Amazon ECS 服務部署,而不是 CodeDeploy 部署。

  • 請考慮實作新部署程序的自動化測試,確保其如預期般運作。