08/29 2024

運用AWS Lambda 和 CloudFormation 自訂資源來簡化ECS的工作流程!

AWS CloudFormation 自定義資源

在 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 工作流程,化繁為簡:

  1. 使用者透過管道(Pipeline)部署來建立或更新一個 CloudFormation 自訂資源。
  2. Amazon ECS 叢集和服務名稱是該自訂資源的屬性。 該自訂資源會使用 Lambda 函數作為服務代碼來啟動流程。 
  3. Lambda 函數從觸發事件中提取 Amazon ECS 叢集和服務名稱,並針對該服務使用 forceNewDeployment 選項來發出 UpdateService API 調用。 
  4. Amazon ECS 服務隨即重啟所有的任務。 
  5. 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 映像,把自動化的工作流程發揮到淋漓盡致。