本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 逐步部署無伺服器應用程式 AWS SAM
AWS Serverless Application Model (AWS SAM) 內建 CodeDeploy 以提供逐步 AWS Lambda 部署。只要幾行組態, 就會為您 AWS SAM 執行下列動作:
-
部署 Lambda 函數的新版本,並自動建立指向新版本的別名。
-
逐漸將客戶流量轉移到新版本,直到您滿意其如預期般運作為止。如果更新無法正常運作,您可以復原變更。
-
定義流量前和流量後測試函數,以確認新部署的程式碼已正確設定,且您的應用程式可如預期運作。
-
如果觸發 CloudWatch 警示,則會自動復原部署。
注意
如果您透過 AWS SAM 範本啟用逐步部署,系統會自動為您建立 CodeDeploy 資源。您可以透過 直接檢視 CodeDeploy 資源 AWS Management Console。
範例
下列範例示範使用 逐步 CodeDeploy 將客戶轉移到新部署的 Lambda 函數版本:
Resources: MyLambdaFunction: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs20.x CodeUri: s3://bucket/code.zip AutoPublishAlias: live DeploymentPreference: Type: Canary10Percent10Minutes Alarms: # A list of alarms that you want to monitor - !Ref AliasErrorMetricGreaterThanZeroAlarm - !Ref LatestVersionErrorMetricGreaterThanZeroAlarm Hooks: # Validation Lambda functions that are run before & after traffic shifting PreTraffic: !Ref PreTrafficLambdaFunction PostTraffic: !Ref PostTrafficLambdaFunction
範本的這些修訂會 AWS SAM 執行下列動作:
-
AutoPublishAlias
:透過新增此屬性並指定別名名稱, AWS SAM即可:-
根據 Lambda 函數 Amazon S3 的變更,偵測新程式碼何時部署URI。
-
使用最新程式碼建立和發佈該函數的更新版本。
-
使用您提供的名稱建立別名 (除非別名已存在),並指向 Lambda 函數的更新版本。函式呼叫應該利用別名限定詞以充分善用此功能。如果您不熟悉 Lambda 函數版本控制和別名,請參閱AWS Lambda 函數版本控制和別名 。
-
-
Deployment Preference Type
:在上一個範例中,10% 的客戶流量會立即轉移到新版本。10 分鐘後,所有流量都會轉移到新版本。但是,如果您的交通前或交通後測試失敗,或者觸發 CloudWatch 警示, 會 CodeDeploy 復原部署。您可以透過下列方式指定如何在版本之間轉移流量:-
Canary
:流量以兩個增量轉移。您可以從預先定義的 Canary 選項中進行選擇。選項會指定在第一個增量中轉換至更新 Lambda 函數版本的流量百分比,以及以分鐘為單位的間隔,之後剩餘的流量則會以第二個增量轉移。 -
Linear
:流量以每個增量之間的相等分鐘數以同等增量轉移。您可以從預先定義的線性選項中選擇,這些選項會指定以每個增量移動的流量百分比,以及每個增量之間的分鐘數。 -
AllAtOnce
:所有流量都會一次從原始 Lambda 函數轉換為更新的 Lambda 函數版本。
下表概述範例所用流量以外的其他流量轉移選項。
部署偏好類型 Canary10Percent30Minutes
Canary10Percent5Minutes
Canary10Percent10Minutes
Canary10Percent15Minutes
Linear10PercentEvery10Minutes
Linear10PercentEvery1Minute
Linear10PercentEvery2Minutes
Linear10PercentEvery3Minutes
AllAtOnce
-
-
Alarms
:這些是部署所產生之任何錯誤所觸發的 CloudWatch 警示。遇到時,它們會自動復原您的部署。例如,如果您正在部署的更新程式碼在應用程式中造成錯誤。另一個範例是您指定的任何 AWS Lambda或 自訂 CloudWatch 指標已違反警示閾值。 -
Hooks
:這些是流量轉移開始至新版本之前,以及流量轉移完成後執行檢查的流量前和流量後測試函數。-
PreTraffic
:在流量轉移開始之前, CodeDeploy 會叫用流量前掛鉤 Lambda 函數。此 Lambda 函數必須回撥 , CodeDeploy 並指出成功或失敗。如果函數失敗,它會中止並將失敗回報給 AWS CloudFormation。如果函數成功, 會 CodeDeploy 繼續進行流量轉移。 -
PostTraffic
:流量轉移完成後, CodeDeploy 會叫用流量後掛鉤 Lambda 函數。這與行前掛鉤類似,函數必須回撥 CodeDeploy 以報告成功或失敗。使用後置流量掛勾執行整合測試或其他驗證動作。
如需詳細資訊,請參閱SAM參考安全部署。
-
第一次逐漸部署 Lambda 函數
當逐步部署 Lambda 函數時, CodeDeploy 需要先前部署的函數版本才能從中轉移流量。因此,您的第一次部署應該透過兩個步驟完成:
-
步驟 1:部署 Lambda 函數,並使用 自動建立別名
AutoPublishAlias
。 -
步驟 2:使用 執行逐步部署
DeploymentPreference
。
以兩個步驟執行您的第一次逐步部署 CodeDeploy ,可讓先前的 Lambda 函數版本從中轉移流量。
步驟 1:部署 Lambda 函數
Resources: MyLambdaFunction: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs20.x CodeUri: s3://bucket/code.zip AutoPublishAlias: live
步驟 2:執行逐步部署
Resources: MyLambdaFunction: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs20.x CodeUri: s3://bucket/code.zip AutoPublishAlias: live DeploymentPreference: Type: Canary10Percent10Minutes Alarms: # A list of alarms that you want to monitor - !Ref AliasErrorMetricGreaterThanZeroAlarm - !Ref LatestVersionErrorMetricGreaterThanZeroAlarm Hooks: # Validation Lambda functions that are run before and after traffic shifting PreTraffic: !Ref PreTrafficLambdaFunction PostTraffic: !Ref PostTrafficLambdaFunction
進一步了解
如需設定逐步部署的實作範例,請參閱 完成 AWS SAM 研討會 中的模組 5 - Canary Deployments