本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
逐步部署無伺服器應用程式 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: nodejs12.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
:流量以兩個增量轉移。您可以從預定義的加那利選項中選擇。這些選項會指定在第一個增量中轉移至更新 Lambda 函數版本的流量百分比,以及在第二個增量中移動剩餘流量之前的間隔 (以分鐘為單位)。 -
Linear
:流量以每個增量之間的相等分鐘數以同等增量轉移。您可以從預先定義的線性選項中進行選擇,以指定每個增量中移動的流量百分比以及每個增量之間的分鐘數。 -
AllAtOnce
:所有流量都會立即從原始 Lambda 函數轉移到更新的 Lambda 函數版本。
下表概述在範例中使用的選項以外可用的其他流量轉移選項。
部署偏好類型 Canary10Percent30Minutes
Canary10Percent5Minutes
Canary10Percent10Minutes
Canary10Percent15Minutes
線性 10 分鐘 PercentEvery
線性 10 PercentEvery 1 分鐘
線性 10 2 分鐘 PercentEvery
線性 10 3 分鐘 PercentEvery
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: nodejs12.x CodeUri: s3://bucket/code.zip AutoPublishAlias: live
步驟 2:執行逐步部署
Resources: MyLambdaFunction: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs12.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 部署