

# 激活和管理 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 SDK 结合使用](#snapstart-credentials)
+ [将 SnapStart 与 CloudFormation、AWS SAM 和 AWS CDK 结合使用](#snapstart-cfn-sam)
+ [删除快照](#snapshot-delete)

## 激活 SnapStart（控制台）
<a name="snapshot-console"></a>

**为函数激活 SnapStart**

1. 打开 Lamba 控制台的[函数](https://console.aws.amazon.com/lambda/home#/functions)页面。

1. 选择一个函数的名称。

1. 选择 **Configuration**（配置），然后选择 **General configuration**（常规配置）。

1. 在 **General configuration**（常规配置）窗格上，选择 **Edit**（编辑）。

1. 在 **Edit basic settings**（编辑基本设置）页面上，为 **SnapStart** 选择 **Published versions**（已发布版本）。

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. 通过运行带有 **--snap-start** 选项的 [update-function-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-configuration.html) 命令来更新函数配置。

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

   如果使用 **cli-binary-format** 版本 2，则 AWS CLI 选项是必需的。要将其设为默认设置，请运行 `aws configure set cli-binary-format raw-in-base64-out`。有关更多信息，请参阅*版本 2 的 AWS Command Line Interface 用户指南*中的 [AWS CLI 支持的全局命令行选项](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list)。

**创建新的函数时激活 SnapStart**

1. 通过运行带有 **--snap-start** 选项的 [create-function](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-function.html) 命令来创建函数。对于 **--role**，指定您的[执行角色](lambda-intro-execution-role.md)的 Amazon 资源名称（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
   ```

   如果使用 **cli-binary-format** 版本 2，则 AWS CLI 选项是必需的。要将其设为默认设置，请运行 `aws configure set cli-binary-format raw-in-base64-out`。有关更多信息，请参阅*版本 2 的 AWS Command Line Interface 用户指南*中的 [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](https://docs.aws.amazon.com/lambda/latest/api/API_SnapStart.html) 参数，为现有函数激活 SnapStart。

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 运行时的函数，Lambda 会在 14 天未调用后删除快照。如果您在 14 天后调用函数版本，Lambda 会返回 `SnapStartNotReadyException` 响应并开始初始化新的快照。函数版本达到 `Active` 状态之后再调用该函数。

**失败**  
Lambda 在运行初始化代码或创建快照时出现错误。

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

Lambda 为每个已发布的函数版本创建快照。若要更新快照，请发布新的函数版本。

## 将 SnapStart 与 AWS SDK 结合使用
<a name="snapstart-credentials"></a>

为了从您的函数调用 AWS 开发工具包，Lambda 通过代入函数的执行角色来生成一组临时凭证。这些凭证在函数调用期间可用作环境变量。您无需直接在代码中为开发工具包提供凭证。默认情况下，凭证提供程序链会按顺序检查每个可以设置凭证的位置，然后选择第一个可用位置，通常是环境变量（`AWS_ACCESS_KEY_ID`、`AWS_SECRET_ACCESS_KEY` 和 `AWS_SESSION_TOKEN`）。

**注意**  
SnapStart 激活后，Lambda 运行时会自动使用容器凭证（`AWS_CONTAINER_CREDENTIALS_FULL_URI` 和 `AWS_CONTAINER_AUTHORIZATION_TOKEN`），而非访问密钥环境变量。这样可以防止凭证在函数还原之前过期。

## 将 SnapStart 与 CloudFormation、AWS SAM 和 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 天未被调用后，函数版本将转换为[非活动](#snapstart-function-states)状态。如果您在 14 天后调用函数版本，Lambda 会返回 `SnapStartNotReadyException` 响应并开始初始化新的快照。函数版本达到[活动](#snapstart-function-states)状态之后再调用该函数。

Lambda 根据《一般数据保护条例》（GDPR）删除与已删除的快照相关的所有资源。