使用 逐步部署無伺服器應用程式 AWS SAM - AWS Serverless Application Model

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

使用 逐步部署無伺服器應用程式 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