在 Amazon Elastic Container Service(Amazon ECS)中,長時間運行的任務,像是網頁應用程式,通常會在啟動時從 AWS Secrets Manager 中讀取秘密的值(Secret Value) 。然而,當該秘密的值在 Secrets Manager 中被輪替時,所有使用該秘密值的 Amazon ECS 任務都必須重新啟動,以讀取新的值。
傳統的作法上,架構師可以使用 AWS 管理控制台或 AWS 指令行界面(CLI),透過 UpdateService API 呼叫並使用 forceNewDeployment 選項來重新啟動 Amazon ECS 服務下的任務。然而,對於只能藉由管道部署來允許更改的應用環境,這個方法是不可行的。在這些情況下,架構師甚至必須得重新建構並重新部署容器,這對於擁有大量 Amazon ECS 部署的組織來說,可能會帶來操作上的挑戰。
博弘雲端架構師專欄將介紹一種解決方案,透過結合 AWS Lambda 函數和 AWS CloudFormation 自訂資源,以程式化的方式回收 Amazon ECS 服務下的任務。每當管道部署(Pipeline Deployment)時,Amazon ECS 任務就會重新啟動,簡化繁瑣流程!
架構圖搶先看 運用哪些服務達成自動部署ECS?
我們來看看如何透過AWS CloudFormation 自訂資源來重新利用Amazon ECS 工作流程,化繁為簡:
- 使用者透過管道(Pipeline)部署來建立或更新一個 CloudFormation 自訂資源。
- Amazon ECS 叢集和服務名稱是該自訂資源的屬性。 該自訂資源會使用 Lambda 函數作為服務代碼來啟動流程。
- Lambda 函數從觸發事件中提取 Amazon ECS 叢集和服務名稱,並針對該服務使用 forceNewDeployment 選項來發出 UpdateService API 調用。
- Amazon ECS 服務隨即重啟所有的任務。
- Lambda 函數會將結果回傳給自訂資源。
在這樣的配置中,每當架構師建立、更新或刪除自訂資源時,Lambda 函數都會被調用。甚至還可以將參數配置為自訂資源的屬性,並將其傳遞給 Lambda 函數。這使您可以透過傳遞相應的識別符來重啟任何 Amazon ECS 服務。您也可以將此解決方案整合到部署管道中,在受限環境中重啟 Amazon ECS 任務。
5個步驟輕鬆簡化Amazon ECS 工作流程!
詳細的步驟如下,跟著博弘雲端的架構師透過以下五個步驟,輕鬆簡化Amazon ECS 的工作流程:
步驟一:替Lambda 的函數開啟帶有核可權限的IAM執行角色
首先在IAM的主控台當中,建立角色(Role),並且在「許可政策」欄位中,選擇AWSLambdaVPCAccessExecutionRole,並且將其命名。隨後點進這個創建完成的角色,並且新增Elastic Container Service。在其中要特別注意「寫入」的權限中,選擇「UpdateService」,且將資源權限設定為「所有」。
步驟二:建立Lambda 函數
在建立Lambda 函數時,先選擇「Python3.12」作為運行的程式語言。隨後在角色當中選擇步驟一所建立的IAM執行角色。接著在Lambda 函數的腳本中貼上以下的程式碼
步驟三:建立CloudFormation 的模板
接著將以下的程式碼貼到本地伺服器內的 .yaml 檔案,這個就會是您CloudFormation 的模板。
需要注意的地方是,<arn of Lambda function> 這個欄位暫時留空,需要把您稍早創建的Lambda 的Amazon Resource Number (ARN) 貼入其中。完成後將這份 YAML的檔案存在本機,在下個步驟當中將會上傳此檔案。
步驟四:建立CloudFormation 的自訂資源
在 CloudFormation 的介面當中,建立堆疊(Stack),並選擇新的資源,同時將稍早建立完成的YAML格式模板,上傳到AWS CloudFormation 當中。接續在參數的設定當中,將「ECSCluster 聚集」與「ECSService」的參數輸入進去,並提交。
步驟五:驗證該解決方案
CloudFormation 的介面部署完成之後,接續打開 Amazon ECS 的介面,確認在您創建自訂資源之前,新增的任務數量與之前存在的任務數量相同,並且將舊的任務刪除,同步執行健診。接續要重新啟動相同的任務,移駕到「參數」的區域,,並使用不同的 ReRunParam 參數值更新堆疊。
這個解決方案,不僅能夠透過使用Lambda 函數與CloudFormation 的自訂資源,來簡化重啟Amazon ECS的任務,同時更可以應用在現有的管道部署的生產環境中,進行金鑰輪替與啟動一項新的Docker 映像,把自動化的工作流程發揮到淋漓盡致。