亚马逊AWS官方博客

适用于 Python 和 .NET 函数的 AWS Lambda SnapStart 现已全面上线



今天,我们宣布适用于 Python 和 .NET 函数的 AWS Lambda SnapStart 全面上线,这项服务可提高函数启动性能,将启动时间从数秒缩短至最少一秒以内,而且通常仅需要对 Python、C#、F# 和 Powershell 代码进行很少的更改甚至完全不需要更改。

2022 年 11 月 28 日,我们推出了适用于 Java 函数的 Lambda SnapStart,将启动性能提高了多达 10 倍。借助 Lambda SnapStart,您可以降低函数初始化造成的异常延迟,而不必预置资源或花费时间来实施复杂的性能优化。

Lambda SnapStart 通过对任何一次性初始化代码或仅在首次调用 Lambda 函数时运行的代码的内存和磁盘状态快照进行缓存和重复使用来发挥作用。Lambda 会为已初始化的执行环境的内存和磁盘状态创建 Firecracker microVM 快照、加密该快照并对其进行缓存以实现低延迟访问。

当您首次调用某个函数版本时,以及随着调用的纵向扩展,Lambda 会从缓存的快照恢复新的执行环境,而不是从头开始初始化,从而减少了启动延迟。借助 Lambda SnapStart,您可以使用 AWS Lambda 轻松在 Python 和 .NET 中构建高度可扩展且响应迅速的应用程序。

对于 Python 函数,初始化代码造成的启动延迟可能长达数秒。在需要加载依赖项(如 LangChain、Numpy、Pandas 和 DuckDB)或使用框架(如 Flask 或 Django)等场景下,即可能会发生这类延迟。此外,许多函数还使用 Lambda 执行机器学习(ML)推理,需要在初始化期间加载 ML 模型,而根据所用模型的大小,这一过程可能需要数十秒才能完成。启用 Lambda SnapStart 可以将这类场景的启动延迟从数秒缩短至最少一秒以内。

对于 .NET 函数,由于 .NET 即时(JIT)编译需要长达数秒,我们预计大多数应用场景都可以从中受益。长期以来,与 Lambda 函数初始化相关的延迟可变性一直是阻止客户使用适用于 AWS Lambda 的 .NET 的一大因素。SnapStart 通过对函数内存和磁盘状态的快照进行缓存,使得这些函数能够快速恢复。因此,启用 Lambda SnapStart 后,大多数 .NET 函数的延迟可变性都将得到显著改善。

开始使用适用于 Python 和 .NET 的 Lambda SnapStart
首先,您可以使用 AWS 管理控制台AWS 命令行界面(AWS CLI)AWS SDK 为 Python 和 .NET 函数激活、更新和删除 SnapStart。

AWS Lambda 控制台中,前往函数页面并选择要启用 Lambda SnapStart 的函数。依次选择配置常规配置编辑。您可以在编辑基本设置页面中查看 SnapStart 设置。

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

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

下面是一段 AWS CLI 命令,可通过运行带有 --snap-start 选项的 update-function-configuration 命令来更新函数配置。

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

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

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

运行 get-function-configuration 命令并指定版本号,确认为该函数版本激活 SnapStart。

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

若响应显示 OptimizationStatusOnStateActive,则 SnapStart 成功激活,此时指定函数版本将有快照可用。

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

要了解有关使用 AWS SDK、AWS CloudFormationAWS Serverless Application Model(AWS SAM)AWS Cloud Development Kit(AWS CDK)激活、更新和删除快照的更多信息,请访问 AWS Lambda 开发人员指南中的激活和管理 Lambda SnapStart 部分。

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

Python 运行时钩子作为开源 Snapshot Restore for Python 库的一部分提供,后者包含在 Python 受管运行时中。该库提供两个装饰器,@register_before_snapshot 用于在 Lambda 创建快照之前运行代码,@register_after_restore 用于在 Lambda 从快照恢复函数时运行代码。要了解更多信息,请访问 AWS Lambda 开发人员指南中的适用于 Python 的 Lambda SnapStart 运行时钩子部分。

下面的 Python 处理程序示例展示了如何在检查点之前和恢复之后运行代码:

from snapshot_restore_py import register_before_snapshot, register_after_restore

def lambda_handler(event, context):
    # handler code

@register_before_snapshot
def before_checkpoint():
    # Logic to be executed before taking snapshots

@register_after_restore
def after_restore():
    # Logic to be executed after restore

您也可以使用作为 NuGet Amazon.Lambda.Core 包(2.4 或更高版本)的一部分提供的 .NET 运行时钩子。该库提供两种方法,RegisterBeforeSnapshot() 用于在创建快照之前运行代码,RegisterAfterRestore() 用于在从快照恢复函数之后运行代码。要了解更多信息,请访问 AWS Lambda 开发人员指南中的适用于 .NET 的 Lambda SnapStart 运行时钩子部分。

下面的 C# 处理程序示例展示了如何在检查点之前和恢复之后运行代码:

public class SampleClass
{
    public SampleClass()
    { 
        Amazon.Lambda.Core.SnapshotRestore.RegisterBeforeSnapshot(BeforeCheckpoint); 
        Amazon.Lambda.Core.SnapshotRestore.RegisterAfterRestore(AfterRestore);
    }
    
    private ValueTask BeforeCheckpoint()
    {
        // Add logic to be executed before taking the snapshot
        return ValueTask.CompletedTask;
    }

    private ValueTask AfterRestore()
    {
        // Add logic to be executed after restoring the snapshot
        return ValueTask.CompletedTask;
    }

    public APIGatewayProxyResponse FunctionHandler(APIGatewayProxyRequest request, ILambdaContext context)
    {
        // INSERT business logic
        return new APIGatewayProxyResponse
        {
            StatusCode = 200
        };
    }
}

要了解如何为您的首选运行时实施运行时钩子,请访问 AWS Lambda 开发人员指南中的在 Lambda 函数快照之前或之后实施代码

注意事项
下面是关于 Lambda SnapStart,您应该了解的一些事情:

  • 处理唯一性 – 如果您的初始化代码生成了快照中包含的唯一内容,则跨执行环境重复使用该内容时,该内容将不是唯一的。若要在使用 SnapStart 时保持唯一性,您必须在初始化后生成唯一的内容,例如,您的代码使用了不依赖于内置库的自定义随机数生成,或缓存了 DNS 条目等可能在初始化期间过期的任何信息。要了解如何恢复唯一性,请访问 AWS Lambda 开发人员指南中的 Lambda SnapStart 处理唯一性部分。
  • 性能调优 – 为了最大限度提高性能,我们建议您在初始化代码中而非函数处理程序中预加载导致启动延迟的依赖项并初始化资源。这可以消除调用路径中因繁重的类加载而引起的延迟,进一步优化使用 SnapStart 时的启动性能。
  • 网络连接最佳实践 – Lambda 从快照恢复函数时,无法保证函数在初始化阶段建立的连接状态。在大多数情况下,AWS SDK 建立的网络连接会自动恢复。对于其他连接,请参阅 AWS Lambda 开发人员指南中的最大限度地提高 Lambda SnapStart 的 性能部分。
  • 监控函数 – 您可以使用 Amazon CloudWatch 日志流、AWS X-Ray 活动跟踪监控 SnapStart 函数,以及使用遥测 APIAmazon API Gateway 和函数 URL 指标访问扩展的实时遥测数据。要了解有关 SnapStart 函数差异的更多信息,请访问 AWS Lambda 开发人员指南中的 Lambda SnapStart 监控

现已上线
适用于 Python 和 .NET 函数的 AWS Lambda SnapStart 现已在以下 AWS 区域上线:美国东部(弗吉尼亚州北部)、美国东部(俄亥俄州)、美国西部(俄勒冈州)、亚太地区(新加坡)、亚太地区(悉尼)、亚太地区(东京)、欧洲地区(法兰克福)、欧洲地区(爱尔兰)和欧洲地区(斯德哥尔摩)。

使用 Python 和 .NET 受管运行时需支付两类 SnapStart 费用,分别是为您在启用 SnapStart 情况下发布的每个函数版本缓存快照的费用,以及每次从快照恢复函数实例时的恢复费用。因此,建议删除未使用的函数版本以减少 SnapStart 缓存费用。要了解更多信息,请访问 AWS Lambda 定价页面。

现在就前往 AWS Lambda 控制台试试适用于 Python 和 .NET 的 Lambda SnapStart 吧。如需了解更多信息,请访问 Lambda SnapStart 页面,并通过适用于 AWS Lambda 的 AWS re:Post 或您平时的 AWS Support 联系人发送反馈。

Channy


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您了解行业前沿技术和发展海外业务选择推介该服务。