AWS Lambda SnapStart 现在针对 Python 和 .NET 函数正式上线 新闻博

AWS Lambda SnapStart现已全面开放

关键要点

  • AWS Lambda SnapStart 现已面向Python和.NET函数全面提供,显著提升函数启动性能,启动时间可从数秒缩短至毫秒级,通常无需或仅需少量代码更改。
  • SnapStart通过缓存和重用一次性初始化代码的快照内存和磁盘状态,使得调用函数时启动延迟大幅减少。
  • 用户可以通过AWS管理控制台、AWS CLI或AWS SDK激活、更新和删除SnapStart。
  • 支持Python 3.12及更高版本和.NET 8及更高版本的管理运行时。

今天,我们宣布AWS Lambda SnapStart 现已全面提供,支持Python和.NET函数。此功能能显著提高函数启动速度,从数秒缩短至毫秒级,通常代码改动极小。SnapStart的推出降低了初始化函数所耗费的延迟,使开发者无需复杂的性能优化就能获得更好的响应速度。

在2022年11月28日,我们首次推出了Java函数的LambdaSnapStart,它能将启动性能提高至10倍。使用SnapStart,用户无需预置资源或花费时间进行复杂的性能优化便能减少初始化带来的延迟。

LambdaSnapStart的工作原理是缓存并重用任何一次性初始化代码或仅在Lambda函数首次调用时执行的代码的快照内存和磁盘状态。Lambda会创建一个,对初始化执行环境的内存和磁盘状态进行快照,加密并缓存,以便于低延迟访问。

![](https://d2908q01vomqb2.cloudfront.net/da4b9237bacccdf19c0760cab7aec4a8359010b0/2024/11/12/2024-lambda- 删除)

当首次调用函数版本时,且调用量增加时,Lambda将从缓存快照恢复新的执行环境,从而提高启动延迟。Lambda SnapStart使得在使用AWSLambda构建高可扩展性和响应能力应用程序变得轻而易举。

对于Python函数,初始化代码的启动延迟可能长达数秒。在某些情况下,例如加载依赖(如LangChain、Numpy、Pandas、DuckDB)或使用框架(如Flask、Django),都可能出现此问题。许多函数在使用Lambda时执行机器学习(ML)推理,并需要在初始化时加载ML模型,根据所用模型的大小,这个过程可能会花费数十秒。使用LambdaSnapStart可以将这些情况下的启动延迟从几秒钟缩短到毫秒级。

对于.NET函数,我们预期大多数使用案例都会受益,因为.NET的即时编译(JIT)可能需要几秒的时间。初始化Lambda函数的延迟变异性一直是客户在AWSLambda中使用.NET的一大障碍。SnapStart通过快照记忆和磁盘状态来快速恢复函数,从而减少了延迟的不确定性,绝大多数.NET函数在使用LambdaSnapStart时能够显著改善延迟变异性。

开始使用Lambda SnapStart

可以通过、或来激活、更新和删除Python和.NET函数的SnapStart。

在中,前往函数 页面,选择要使用Lambda SnapStart的函数。选择配置 ,然后选择常规配置 ,接着选择编辑 。可以在编辑基本设置 页面上看到SnapStart 设置。

![](https://d2908q01vomqb2.cloudfront.net/da4b9237bacccdf19c0760cab7aec4a8359010b0/2024/11/15/2024-lambda- 删除)

您可以激活使用Python 3.12及更高版本和.NET 8及更高版本的托管运行时的Lambda函数。选择已发布版本 ,然后选择保存

当您发布函数的新版本时,Lambda将初始化您的代码,创建初始化执行环境的快照,然后缓存该快照以便于低延迟访问。您可以调用该函数以确认SnapStart已激活。

以下是通过运行update-function-configuration命令和--snap-start选项更新函数配置的AWS CLI命令。

bash aws lambda update-function-configuration \ --function-name lambda- python-snapstart-test \ --snap-start ApplyOn=PublishedVersions

使用publish-version命令发布函数版本。

bash aws lambda publish-version \ --function-name lambda-python-snapstart- test

通过运行get-function-configuration命令并指定版本号,确认SnapStart已激活。

bash aws lambda get-function-configuration \ --function-name lambda-python- snapstart-test:1

如果响应显示OptimizationStatusOnStateActive,那么SnapStart已激活,该指定函数版本的快照可用。

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

要了解如何使用AWS SDK激活、更新和删除快照,访问。

运行时钩子

您可以使用运行时钩子在Lambda创建快照之前或从快照恢复之后运行代码。运行时钩子用于执行清理或资源释放操作、动态更新配置或其他元数据、与外部服务或系统集成(例如发送通知或更新外部状态),或者微调您函数的启动顺序,例如通过预加载依赖项。

Python运行时钩子是开源的一部分,此库随Python托管运行时提供。该库提供两个装饰器:@register_before_snapshot在Lambda创建快照之前运行,@register_after_restore在Lambda从快照恢复时运行。要了解更多信息,请访问。

以下是一个Python处理程序示例,展示如何在检查点之前和恢复之后运行代码:

register_after_restore

def lambda_handler(event, context): # 处理代码

@register_before_snapshot def before_checkpoint(): # 在拍摄快照之前执行的逻辑

@register_after_restore def after_restore(): # 在恢复之后执行的逻辑 ```

您还可以使用.NET运行时钩子,此功能是Amazon.Lambda.Core包(版本2.5或更高版本)的一部分,从获取。该库提供两个方法:`RegisterBeforeSnapshot()`在创建快照之前运行,`RegisterAfterRestore()`在从快照恢复函数之后运行。要了解更多信息,请访问。

以下是一个C#处理程序示例,说明如何在检查点之前和恢复之后运行代码:

```csharp public class SampleClass { public SampleClass() {
Amazon.Lambda.Core.SnapshotRestore.RegisterBeforeSnapshot(BeforeCheckpoint);
Amazon.Lambda.Core.SnapshotRestore.RegisterAfterRestore(AfterRestore); }

    
    
    private ValueTask BeforeCheckpoint()
    {
        // 在快照之前执行的逻辑
        return ValueTask.CompletedTask;
    }
    
    private ValueTask AfterRestore()
    {
        // 在恢复快照之后执行的逻辑
        return ValueTask.CompletedTask;
    }
    
    public APIGatewayProxyResponse FunctionHandler(APIGatewayProxyRequest request, ILambdaContext context)
    {
        // 插入业务逻辑
        return new APIGatewayProxyResponse
        {
            StatusCode = 200
        };
    }
    

} ```

有关如何为您喜欢的运行时实现运行时钩子的详细说明,请访问。

## 需要知道的事项

以下是有关Lambda SnapStart的一些信息:

  * **处理唯一性** \- 如果您的初始化代码生成的唯一内容包含在快照中,则在跨执行环境重用时,该内容将不是唯一的。要在使用SnapStart时保持唯一性,您必须在初始化后生成唯一内容,例如如果您的代码使用不依赖于内置库的自定义随机数生成,或缓存信息如可能在初始化期间过期的DNS条目。有关如何恢复唯一性的信息,请访问。
  * **性能调优** \- 为了最大限度提高性能,我们建议您在初始化代码中预加载依赖项和初始化资源,而不是在函数处理程序中执行。这将重载与重类加载相关的延迟,从而优化SnapStart的启动性能。
  * **网络最佳实践** \- 在初始化阶段建立的连接,Lambda从快照恢复函数时不能保证状态。在大多数情况下,AWS SDK自动建立的网络连接将再次恢复。对于其他连接,请查看。
  * **监控函数** \- 您可以通过日志流、活动跟踪,以及通过访问实时遥测数据来监控您的SnapStart函数。要了解SnapStart函数的不同之处,请访问。

## 现在可用

AWS LambdaSnapStart现在可在美国东部(弗吉尼亚北部)、美国东部(俄亥俄州)、美国西部(俄勒冈州)、亚太地区(新加坡)、亚太地区(悉尼)、亚太地区(东京)、欧洲(法兰克福)、欧洲(爱尔兰)和欧洲(斯德哥尔摩)等AWS区域使用。

使用Python和.NET管理运行时时,SnapStart分为两种类型的收费:一种是为您发布的每个启用SnapStart的函数版本缓存快照的费用,另一种是每次从快照恢复函数实例的费用。因此,请以降低SnapStart缓存费用。要了解更多信息,请访问页面。

立即在体验Lambda SnapStartfor Python和.NET。要了解更多信息,请访问,您还可以通过或您常用的AWS支持联系人发送反馈。

— 

![Channy删除)

### [Channy Yun (윤석찬)](https://aws.amazon.com/blogs/aws/author/channy-yun/)

Channy是AWS云的首席开发者倡导者。他热爱社区驱动的学习和分享技术。

Leave a Reply

Required fields are marked *