

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

# 啟動及管理 Lambda SnapStart
<a name="snapstart-activate"></a>

若要使用 SnapStart，請對新的或現有的 Lambda 函數啟動 SnapStart。然後發布並調用函數版本。

**Topics**
+ [啟動 SnapStart (主控台)](#snapshot-console)
+ [啟動 SnapStart (AWS CLI)](#snapshot-cli)
+ [啟動 SnapStart (API)](#snapshot-api)
+ [Lambda SnapStart 和函數狀態](#snapstart-function-states)
+ [更新快照](#update-snapshot)
+ [使用 SnapStart AWS SDKs](#snapstart-credentials)
+ [搭配 CloudFormation AWS SAM、 和 使用 SnapStart AWS CDK](#snapstart-cfn-sam)
+ [刪除快照](#snapshot-delete)

## 啟動 SnapStart (主控台)
<a name="snapshot-console"></a>

**為函數啟動 SnapStart**

1. 開啟 Lambda 主控台中的 [函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇函數的名稱。

1. 選擇**組態**，然後選擇**一般組態**。

1. 在**一般組態**窗格中，選擇**編輯**。

1. 在**編輯基本設定**頁面中，為 **SnapStart** 選擇**已發布的版本**。

1. 選擇 **儲存** 。

1. [發佈函數版本](configuration-versions.md#configuration-versions-config)。Lambda 會初始化程式碼、建立初始化執行環境的快照，然後快取快照以實現低延遲存取。

1. [調用函數版本](configuration-versions.md#versioning-versions-using)。

## 啟動 SnapStart (AWS CLI)
<a name="snapshot-cli"></a>

**為現有函數啟動 SnapStart**

1. 執行 [update-function-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-configuration.html) 命令搭配 **--snap-start** 選項來更新函數組態。

   ```
   aws lambda update-function-configuration \
     --function-name my-function \
     --snap-start ApplyOn=PublishedVersions
   ```

1. 使用 [publish-version](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/publish-version.html) 命令發佈函數版本。

   ```
   aws lambda publish-version \
     --function-name my-function
   ```

1. 執行 [get-function-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/get-function-configuration.html) 命令並指定版本編號，確認已為函數版本啟動 SnapStart。以下範例命令指定第 1 版。

   ```
   aws lambda get-function-configuration \
     --function-name my-function:1
   ```

   如果回應顯示 [OptimizationStatus](https://docs.aws.amazon.com/lambda/latest/api/API_SnapStartResponse.html) 為 `On` 且 [State](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionConfiguration.html#lambda-GetFunctionConfiguration-response-State) 為 `Active`，便會啟動 SnapStart，且快照可用於指定的函數版本。

   ```
   "SnapStart": { 
       "ApplyOn": "PublishedVersions",
       "OptimizationStatus": "On"
    },
    "State": "Active",
   ```

1. 執行 [invoke](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/invoke.html) 命令並指定版本來調用函數版本。以下範例調用第 1 版。

   ```
   aws lambda invoke \
     --cli-binary-format raw-in-base64-out \
     --function-name my-function:1 \
     --payload '{ "name": "Bob" }' \
     response.json
   ```

   如果您使用的是第 2 AWS CLI 版，則需要 **cli-binary-format**選項。若要讓此成為預設的設定，請執行 `aws configure set cli-binary-format raw-in-base64-out`。若要取得更多資訊，請參閱*《AWS Command Line Interface 使用者指南第 2 版》*中 [AWS CLI 支援的全域命令列選項](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list)。

**建立新函數時啟動 SnapStart**

1. 執行 [create-function](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-function.html) 命令搭配 **--snap-start** 選項來建立函數。針對 **--role**，請指定[執行角色](lambda-intro-execution-role.md)的 Amazon Resource Name (ARN)。

   ```
   aws lambda create-function \
     --function-name my-function \
     --runtime "java25" \
     --zip-file fileb://my-function.zip \
     --handler my-function.handler \
     --role arn:aws:iam::111122223333:role/lambda-ex \
     --snap-start ApplyOn=PublishedVersions
   ```

1. 使用 [publish-version](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/publish-version.html) 命令來建立版本。

   ```
   aws lambda publish-version \
     --function-name my-function
   ```

1. 執行 [get-function-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/get-function-configuration.html) 命令並指定版本編號，確認已為函數版本啟動 SnapStart。以下範例命令指定第 1 版。

   ```
   aws lambda get-function-configuration \
     --function-name my-function:1
   ```

   如果回應顯示 [OptimizationStatus](https://docs.aws.amazon.com/lambda/latest/api/API_SnapStartResponse.html) 為 `On` 且 [State](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionConfiguration.html#lambda-GetFunctionConfiguration-response-State) 為 `Active`，便會啟動 SnapStart，且快照可用於指定的函數版本。

   ```
   "SnapStart": { 
        "ApplyOn": "PublishedVersions",
        "OptimizationStatus": "On"
     },
     "State": "Active",
   ```

1. 執行 [invoke](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/invoke.html) 命令並指定版本來調用函數版本。以下範例調用第 1 版。

   ```
   aws lambda invoke \
     --cli-binary-format raw-in-base64-out \
     --function-name my-function:1 \
     --payload '{ "name": "Bob" }' \
     response.json
   ```

   如果您使用的是第 2 AWS CLI 版，則需要 **cli-binary-format**選項。若要讓此成為預設的設定，請執行 `aws configure set cli-binary-format raw-in-base64-out`。若要取得更多資訊，請參閱*《AWS Command Line Interface 使用者指南第 2 版》*中 [AWS CLI 支援的全域命令列選項](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list)。

## 啟動 SnapStart (API)
<a name="snapshot-api"></a>

**啟動 SnapStart**

1. 執行以下任意一項：
   + 使用 [CreateFunction](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunction.html) API 動作搭配 [SnapStart](https://docs.aws.amazon.com/lambda/latest/api/API_SnapStart.html) 參數，建立啟動 SnapStart 的新函數。
   + 使用 [UpdateFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionConfiguration.html) 動作搭配 SnapStart 參數，為現有函數啟動 [SnapStart](https://docs.aws.amazon.com/lambda/latest/api/API_SnapStart.html)。

1. 使用 [PublishVersion](https://docs.aws.amazon.com/lambda/latest/api/API_PublishVersion.html) 動作發佈函數版本。Lambda 會初始化程式碼、建立初始化執行環境的快照，然後快取快照以實現低延遲存取。

1. 使用 [GetFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionConfiguration.html) 動作，確認已為函數版本啟動 SnapStart。指定版本編號以確認已為該版本啟動 SnapStart。如果回應顯示 [OptimizationStatus](https://docs.aws.amazon.com/lambda/latest/api/API_SnapStartResponse.html) 為 `On` 且 [State](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionConfiguration.html#lambda-GetFunctionConfiguration-response-State) 為 `Active`，便會啟動 SnapStart，且快照可用於指定的函數版本。

   ```
   "SnapStart": { 
           "ApplyOn": "PublishedVersions",
           "OptimizationStatus": "On"
        },
        "State": "Active",
   ```

1. 使用 [Invoke](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html) 動作調用函數版本。

## Lambda SnapStart 和函數狀態
<a name="snapstart-function-states"></a>

使用 SnapStart時，可能會出現下列函數狀態。

**待定**  
Lambda 正在初始化您的程式碼，並擷取初始化執行環境的快照。在函數上操作的任何調用或其他 API 動作都會失敗。

**作用中**  
快照建立完成，您可以調用函數。若要使用 SnapStart，您必須調用已發佈的函數版本，而不是未發佈版本 (\$1LATEST)。

**非作用中**  
當 Lambda 定期重新產生函式快照以套用軟體更新時，可能會出現 `Inactive` 狀態。在此執行個體中，如果函數無法初始化，則函數會進入`Inactive`狀態。  
對於使用 Java 執行時期的函式，若已有 14 天未調用快照，Lambda 會將其刪除。如果您在 14 天後調用函數版本，Lambda 會傳回 `SnapStartNotReadyException` 回應並開始初始化新快照。等待函數版本進入 `Active` 狀態，然後再次調用它。

**失敗**  
Lambda 在執行初始化程式碼或建立快照時發生錯誤。

## 更新快照
<a name="update-snapshot"></a>

Lambda 會為每個已發佈的函數版本建立快照。若要更新快照，請發佈新函數版本。

## 使用 SnapStart AWS SDKs
<a name="snapstart-credentials"></a>

若要從函數進行 AWS SDK 呼叫，Lambda 會透過擔任函數的執行角色來產生一組暫時性的登入資料。這些憑證在函數調用期間可當成環境變數使用。您不需要直接在程式碼中提供 SDK 的憑證。根據預設，憑證提供者鏈會依序檢查您可以設定憑證的每個位置，並選擇第一個可用的位置，通常是環境變數 (`AWS_ACCESS_KEY_ID`、`AWS_SECRET_ACCESS_KEY` 和 `AWS_SESSION_TOKEN`)。

**注意**  
SnapStart 啟動時，Lambda 執行時期會自動使用容器憑證 (`AWS_CONTAINER_CREDENTIALS_FULL_URI` 和 `AWS_CONTAINER_AUTHORIZATION_TOKEN`)，而不是存取金鑰環境變數。這樣可防止憑證在函數還原之前過期。

## 搭配 CloudFormation AWS SAM、 和 使用 SnapStart AWS CDK
<a name="snapstart-cfn-sam"></a>
+ **AWS CloudFormation：**在範本中宣告 [SnapStart](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-snapstart.html) 實體。
+ **AWS Serverless Application Model (AWS SAM)：**宣告範本中的 [SnapStart](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html#sam-function-snapstart) 屬性。
+ **AWS Cloud Development Kit (AWS CDK)：**使用 [SnapStartProperty](https://docs.aws.amazon.com/cdk/api/v2/java/software/amazon/awscdk/services/lambda/CfnFunction.SnapStartProperty.html) 類型。

## 刪除快照
<a name="snapshot-delete"></a>

Lambda 會在發生以下情況時刪除快照：
+ 您刪除了函數或函數版本。
+ (**僅限 Java 執行時期**) 您 14 天內都沒有調用函數版本。連續 14 天都沒有呼叫之後，函數版本會轉換為 [Inactive](#snapstart-function-states) (非作用中) 狀態。如果您在 14 天後調用函數版本，Lambda 會傳回 `SnapStartNotReadyException` 回應並開始初始化新快照。等待函數版本進入 [Active](#snapstart-function-states) (作用中) 狀態，然後再次調用它。

根據一般資料保護規範 (GDPR)，Lambda 會移除與已刪除快照相關聯的所有資源。