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