公司动态

Python 312 运行时现在可以在 AWS Lambda 中使用 计算博客

AWS Lambda 支持 Python 312 运行时

由 詹姆斯贝斯维克 于 2023 年 12 月 14 日发布在 AWS Lambda,无服务器永久链接 分享

本篇文章由高级专家 TAM 负责人杰夫盖巴特撰写。

关键要点

AWS Lambda 现在支持 Python 312 作为管理运行时和容器基础镜像。Python 312 在性能和语言可读性方面进行了多项增强。更新包括 Unicode 字符在 JSON 响应中直接返回、优雅关机功能以及对新 Python 特性的支持。

AWS Lambda 现在支持 Python 312,这不仅是一种受管理的运行时,还可作为容器基础镜像。Python 312 在 Python 311 中首次发布的性能增强的基础上,增加了许多性能和语言可读性功能。借助此版本,Python 开发者可以在 AWS Lambda 上创建无服务器应用时利用这些新功能和增强。

您可以使用 Python 312 和 AWS Lambda PowertoolsPython 版本,这是一款开发工具包,用于实施无服务器最佳实践,比如可观测性、批处理、参数存储集成、幂等性、特性标记、CloudWatch 指标和结构化日志等功能。

此外,您还可以在 Lambda@Edge 上使用 Python 312,从而自定义通过 Amazon CloudFront 提供的低延迟内容。

Python 是构建无服务器应用的热门语言。Python 312 版本带来了许多解释器和语法的改进。

新引入的 Lambda 运行时在启动时的使用量通常低于现有成熟的运行时。这可能导致冷启动时间更长,因为在内部 Lambda 子系统中的缓存驻留减少。随着使用量的增加,冷启动时间通常会在发布后的几周内改善。因此,AWS 建议在性能稳定之前,不要从其他 Lambda 运行时进行并列性能比较。由于性能高度依赖于工作负载,客户应该进行自己的性能测试,而不是依赖通用的测试基准。

Lambda 运行时的变化

基于亚马逊 Linux 2023

Python 312 运行时基于 providedal2023 运行时,该运行时基于 Amazon Linux 2023 最小容器镜像。此操作系统更新相较于用于 Lambda Python 运行时的 Amazon Linux 2AL2操作系统带来了多项改进。

providedal2023 仅包含安装其他软件包所需的基本组件,提供的部署占用空间小于 40MB,相比 AL2 基于镜像的 100MB 以上大幅减小。

通过 glibc 版本 234,客户可以访问现代版本的 glibc,这是从 AL2 基于镜像的版本 226 更新而来的。

鲸鱼加速器 安卓蓝鲸

Amazon Linux 2023 最小镜像使用 microdnf 作为包管理器,symlinked 为 dnf。这替代了 AL2 基于镜像中使用的 yum 包管理器。如果您将 Lambda 函数以容器镜像的方式部署,您必须更新 Dockerfile,使用 dnf 替代 yum 来升级到 Python 312 基础镜像。

此外,curl 和 gnupg2 也以其最小版本 curlminimal 和 gnupg2minimal 包含在内。

要了解更多关于 providedal2023 运行时的信息,请查看博客文章 Introducing the Amazon Linux 2023 runtime for AWS Lambda 和 Amazon Linux 2023 发布博客文章。

响应格式变化

从 Python 312 运行时开始,函数将 Unicode 字符作为 JSON 响应的一部分返回。以前的版本返回的是 Unicode 字符在响应中的转义序列。

例如,在 Python 311 中,如果返回一个 Unicode 字符串,如“”,它会转义 Unicode 字符并返回“u3053u3093u306bu3061u306f”。而 Python 312 运行时则返回原始值“”。

此更改减少了 Lambda 返回负载的大小。在前面的示例中,转义的版本为 32 字节,而 Unicode 字符串则为 17 字节。使用 Unicode 响应减小了 Lambda 响应的大小,使得更容易将较大的响应放入 6MB 的 Lambda 响应同步限制内。

在升级到 Python 312 时,您可能需要调整其他模块中的代码,以适应这种新行为。如果调用方根据先前的运行时行为期望转义的 Unicode,您必须在返回函数中添加代码手动转义 Unicode,或调整调用方处理 Unicode 返回值。

扩展处理和优雅关闭

带有外部扩展的 Lambda 函数现在可以受益于改进的优雅关闭功能。当 Lambda 服务即将关闭运行时时,会向运行时发送 SIGTERM 信号,然后向每个注册的外部扩展发送 SHUTDOWN 事件。

这些事件在每次执行环境关闭时发送。这允许您在 Lambda 函数中捕获 SIGTERM 信号,并清理如数据库连接等由函数创建的资源。

要了解 Lambda 执行环境生命周期的更多信息,请查看 Lambda 执行环境。关于如何在扩展中使用优雅关闭的更多详细信息和示例可以在 AWS Samples GitHub 存储库中找到。

新的 Python 特性

理解内联

通过实现 PEP 709,字典、列表和集合理解现在是内联的。先前版本会创建一个单次使用的函数来执行这些理解。移除这种开销使理解的执行速度提高了两倍。

由于此次更新,理解的行为有些变化。例如,从理解内调用 locals() 函数不会仅返回理解内的对象,而会包括来自包含作用域的对象。您应测试从早期版本迁移到 Python 312 的函数。

类型变化

Python 312 继续演进,包括类型注解到 Python 中。 PEP 695 引入了用于通用类和函数的新、更加简明的语法,并添加了新的“类型”语句,以允许类型别名的创建。类型别名按需进行评估,这些别名可以引用稍后定义的其他类型。

类型参数在声明的作用域和任何嵌套作用域内可见,但在外部作用域不可见。

f字符串的正式化

Python 312 中最大的变化之一是 f字符串语法的正式化,这在 PEP 701 中有所涵盖。任何有效表达式现在都可以包含在 f字符串内,包括其他 f字符串。

在先前的 Python 版本中,在 f字符串中重用引号会导致错误。但在 Python 312 中,嵌套 f字符串中的引号重用完全得到支持,如下例所示:

python

songs = [Take me back to Eden Alkaline Ascensionism]fThis is the playlist { join(songs)}This is the playlist Take me back to Eden Alkaline Ascensionism

此外,任何有效的 Python 表达式都可以包含在 f字符串中。这包括多行表达式和在 f字符串中嵌入评论的能力。

在 Python 312 之前,反斜杠“”字符不被允许在 f字符串中使用。这阻止了在 f字符串中使用“N”语法定义转义 Unicode 字符。

Asyncio 改进

asyncio 模块还有许多改进。这些包括写入套接字的性能提升和 asynciocurrenttask() 的新实现,可以提高 4 到 6 倍的性能。事件循环现在为其基础环境优化了子观察者。

如何在 Lambda 中使用 Python 312

AWS 管理控制台

要开发使用 Python 312 的 Lambda 函数,请在创建或更新函数时指定 runtime 参数值为 Python 312。Python 312 版本现已在创建函数页面的 Runtime 下拉菜单中可用:

要将现有 Lambda 函数更新为 Python 312,请在 Lambda 控制台中导航到该函数,并在 Runtime settings 面板中选择编辑。新的 Python 版本可在 Runtime 下拉菜单中找到:

Python 312 运行时现在可以在 AWS Lambda 中使用 计算博客

AWS Lambda 容器镜像

通过修改 Dockerfile 中的 FROM 语句来更改 Python 基础镜像版本:

dockerfileFROM publicecraws/lambda/python312

复制函数代码

COPY lambdahandlerpy {LAMBDATASKROOT}

客户在本地运行 Python 312 Docker 镜像时,包括使用 AWS SAM 的客户,必须将 Docker 安装升级到 201010 或更高版本。

AWS 无服务器应用模型 (AWS SAM)

在 AWS SAM 中,将 Runtime 属性设置为 python312 来使用此版本。

yamlAWSTemplateFormatVersion 20100909Transform AWSServerless20161031Description 简单的 Lambda 函数 MyFunction Type AWSServerlessFunction Properties Description 我的 Python Lambda 函数 CodeUri myfunction/ Handler lambdafunctionlambdahandler Runtime python312

AWS SAM 支持使用 sam init 命令为新的无服务器应用生成此模板,指定 Python 312。有关详细信息,请参阅 AWS SAM 文档。

AWS 云开发工具包AWS CDK

在 AWS CDK 中,将运行时属性设置为 RuntimePYTHON312 以使用此版本。在 Python CDK 中:

pythonfrom constructs import Construct from awscdk import ( App Stack awslambda as lambda )

class SampleLambdaStack(Stack) def init(self scope Construct id str kwargs) gt None super()init(scope id kwargs)

    baselambda = lambdaFunction(self SampleLambda                                    handler=lambdahandlerhandler                                    runtime=lambdaRuntimePYTHON312                                    code=lambdaCodefromasset(lambda))

在 TypeScript CDK 中:

typescriptimport as cdk from awscdklibimport as lambda from awscdklib/awslambdaimport as path from pathimport { Construct } from constructs

export class CdkStack extends cdkStack { constructor(scope Construct id string props cdkStackProps) { super(scope id props)

// 定义您的栈的代码// 启用 python312 的 Lambda 函数const lambdaFunction = new lambdaFunction(this python311LambdaFunction {  runtime lambdaRuntimePYTHON312  memorySize 512  code lambdaCodefromAsset(pathjoin(dirname //lambda))  handler lambdahandlerhandler})

}}

结论

Lambda 现在支持 Python 312。此版本使用了 Amazon Linux 2023 操作系统,支持 Unicode 响应、优雅关闭功能以及 Python 312 的语言特性。

您可以使用 AWS 管理控制台、AWS CLI、AWS SDK、AWS SAM、AWS CDK 或您选择的基础设施即代码IaC工具来构建和部署使用 Python 312 的函数。如果您更喜欢使用容器镜像构建和部署函数,也可以使用 Python 312 容器基础镜像。

Python 312 运行时的支持帮助开发者构建更高效、强大和可扩展的无服务器应用。今天就试试 Python 312 运行时在 Lambda 中的应用,体验这个更新版本语言的好处。

有关更多无服务器学习资源,请访问 Serverless Land。

标签 贡献,无服务器