

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

# 使用 逐步部署無伺服器應用程式 AWS SAM
<a name="automating-updates-to-serverless-apps"></a>

AWS Serverless Application Model (AWS SAM) 內建 [CodeDeploy](https://docs.aws.amazon.com/codedeploy/latest/userguide/welcome.html)，可提供逐步 AWS Lambda 部署。只要幾行組態， 就會為您 AWS SAM 執行下列動作：
+ 部署 Lambda 函數的新版本，並自動建立指向新版本的別名。
+ 逐漸將客戶流量轉移到新版本，直到您滿意其如預期般運作。如果更新無法正常運作，您可以轉返變更。
+ 定義流量前和流量後測試函數，以確認新部署的程式碼已正確設定，且您的應用程式可如預期運作。
+ 如果觸發 CloudWatch 警示， 會自動復原部署。

**注意**  
如果您透過 AWS SAM 範本啟用逐步部署，會自動為您建立 CodeDeploy 資源。您可以透過 直接檢視 CodeDeploy 資源 AWS 管理主控台。

**範例**

下列範例示範如何使用 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 函數版本控制和別名](https://docs.aws.amazon.com/lambda/latest/dg/versioning-aliases.html)。
+ `Deployment Preference Type`：在上述範例中，10% 的客戶流量會立即轉移到新版本。10 分鐘後，所有流量都會轉移到新版本。不過，如果您的流量前或流量後測試失敗，或觸發 CloudWatch 警示，CodeDeploy 會復原您的部署。您可以透過下列方式指定如何在版本之間轉移流量：
  + `Canary`：流量以兩個增量轉移。您可以從預先定義的 Canary 選項中進行選擇。選項會指定在第一個增量中轉移到更新 Lambda 函數版本的流量百分比，以及剩餘流量在第二個增量中轉移之前的間隔，以分鐘為單位。
  + `Linear`：流量以每個增量之間的相等分鐘數以同等增量轉移。您可以從預先定義的線性選項中進行選擇，以指定以每個增量移動的流量百分比，以及每個增量之間的分鐘數。
  + `AllAtOnce`：所有流量都會一次從原始 Lambda 函數轉移到更新的 Lambda 函數版本。

  下表概述範例所用流量轉移選項以外的其他可用流量轉移選項。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/serverless-application-model/latest/developerguide/automating-updates-to-serverless-apps.html)
+ `Alarms`：這些是由部署引發的任何錯誤觸發的 CloudWatch 警示。遇到時，它們會自動復原您的部署。例如，如果您正在部署的更新程式碼在應用程式中導致錯誤。另一個範例是，如果您指定的任何 [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/monitoring-functions-metrics.html)或自訂 CloudWatch 指標已超過警示閾值。
+ `Hooks`：這些是流量轉移開始到新版本之前，以及在流量轉移完成後執行檢查的流量前和流量後測試函數。
  + `PreTraffic`：在流量轉移開始之前，CodeDeploy 會叫用預先流量掛鉤 Lambda 函數。此 Lambda 函數必須回呼 CodeDeploy，並指出成功或失敗。如果函數失敗，它會中止並回報失敗 CloudFormation。如果函數成功，CodeDeploy 會繼續進行流量轉移。
  + `PostTraffic`：流量轉移完成後，CodeDeploy 會叫用流量後勾點 Lambda 函數。這類似於預先流量掛鉤，函數必須回呼 CodeDeploy 以報告成功或失敗。使用後置流量掛勾執行整合測試或其他驗證動作。

  如需詳細資訊，請參閱[安全部署的 SAM 參考](https://github.com/aws/serverless-application-model/blob/master/docs/safe_lambda_deployments.rst)。

## 第一次逐漸部署 Lambda 函數
<a name="automating-updates-to-serverless-apps-first-time"></a>

 逐步部署 Lambda 函數時，CodeDeploy 需要先前部署的函數版本才能從中轉移流量。因此，您的第一個部署應完成兩個步驟：
+ **步驟 1**：部署 Lambda 函數，並使用 自動建立別名`AutoPublishAlias`。
+ **步驟 2**：使用 執行逐步部署`DeploymentPreference`。

在兩個步驟中執行您的第一次逐步部署，可讓 CodeDeploy 先前的 Lambda 函數版本轉移流量。

### 步驟 1：部署 Lambda 函數
<a name="automating-updates-to-serverless-apps-first-time-step1"></a>

```
Resources:
MyLambdaFunction:
  Type: AWS::Serverless::Function
  Properties:
    Handler: index.handler
    Runtime: nodejs20.x
    CodeUri: s3://bucket/code.zip

    AutoPublishAlias: live
```

### 步驟 2：執行逐步部署
<a name="automating-updates-to-serverless-apps-first-time-step2"></a>

```
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
```

## 進一步了解
<a name="automating-updates-to-serverless-apps-learn"></a>

如需設定逐步部署的實作範例，請參閱*完成 AWS SAM 研討會*中的[單元 5 - Canary Deployments](https://s12d.com/sam-ws-en-canaries)。