什么是 virtualenv?它如何帮助打包依赖项以便在 AWS Lambda 函数中使用?

What is virtualenv & how does it help package dependencies for use in an AWS Lambda Function?

我有一个项目使用 virtualenv 打包了一个 python 2.7 项目,我在 requirements.txt 文件中找到了 3 个依赖项:boto3、botocore 和 pypdftk。

Boto3 是用于 Python 的 Amazon Web Services SDK,botocore 也是(我相信。)Pypdftk 是一些用于在 python 中转换 PDF 的外部库。

现在我应该将这个项目压缩成一个 zip 文件并上传到 AWS Lambda,这是一种无服务器计算服务。

此外,AWS Lambda 仅支持标准 python 3.9 库和运行时。所以因为我的项目有这些外部库和依赖项,似乎过去的开发人员使用 virtualenv 来:

AWS Lambda 有一个称为层的功能,您可以在其中上传压缩二进制文件以扩展标准核心 python3 库。

总结:

我无法理解如何上传压缩的 python3.9 项目。
我是否在 AWS Lambda 层中单独上传这些依赖项?
或者在 virtualenv 中压缩我的文件会处理依赖关系吗?
很像 Docker 容器? virtualenv 附带 compiler/interpreter & dependencies?

将您的 Python code/dependencies 升级到 3.9,按照此处的“操作方法”:https://docs.python.org/3/howto/pyporting.html

虽然可以使用 Docker 映像部署 2.7 代码(至少目前仍由 AWS 提供),但这不是长期解决方案,您几乎肯定会投入使用更多的工作来实现它。

关于您的其他问题

package a deprecated version of python 2.7

虚拟环境不允许您这样做。 pyenv 等工具可以,但它们 不会 用于 Lambda,因为用于 运行 您的 Python 的版本Lambda 是 Lambda 配置的一部分,无法替换。

package the dependencies listed in the requirements.txt file

是的,这就是虚拟环境的用途。当您激活虚拟环境和 运行 pip install 时,它会将软件包安装到虚拟环境中的 lib 目录中。

要生成 Lambda 部署包,您必须将源代码与安装的包一起压缩。使这更具挑战性,这些包实际上安装在 lib/python3.9/site-packages/ 中,而 Lambda 不想看到该路径;在构建 ZIP 时更改目录。

这是生成 Python 包的官方文档:https://docs.aws.amazon.com/lambda/latest/dg/python-package.html

Do I upload these dependencies separately in the AWS Lambda Layer?

可以,但这仅在您要共享 Lambda 之间的依赖项时才有用。否则它会增加部署的复杂性,但收效甚微。