AWS Lambda
pydantic
与 AWS Lambda 函数集成良好。在本指南中,我们将讨论如何为 AWS Lambda 函数设置 pydantic
。
为 AWS Lambda 函数安装 Python 库¶
在 AWS Lambda 函数中,有很多方法可以利用 Python 库。正如 AWS Lambda 文档 中概述的那样,最常见的方法包括
- 使用
.zip
文件存档 来打包您的代码和依赖项 - 使用 AWS Lambda Layers 在多个函数之间共享库
- 使用 容器镜像 来打包您的代码和依赖项
所有这些方法都可以与 pydantic
一起使用。最适合您的方法将取决于您的具体需求和约束。我们将在下面更深入地介绍前两种情况,因为使用容器镜像进行依赖管理更直接。如果您正在使用容器镜像,您可能会发现 此评论 对安装 pydantic
有帮助。
提示
如果您在多个函数中使用 pydantic
,您可能需要考虑 AWS Lambda Layers,它支持在多个函数之间无缝共享库。
无论您选择哪种依赖管理方法,遵循这些指南都有助于确保依赖管理过程顺利进行。
为 AWS Lambda 函数安装 pydantic
¶
当您使用代码和依赖项构建 .zip
文件存档,或者为 Lambda Layer 组织 .zip
文件时,您可能会使用本地虚拟环境来安装和管理依赖项。如果您正在使用 pip
,这可能会有点棘手,因为 pip
安装为您的本地平台编译的 wheels,这可能与 Lambda 环境不兼容。
因此,我们建议您使用类似于以下的命令
pip install \
--platform manylinux2014_x86_64 \ # (1)!
--target=<your_package_dir> \ # (2)!
--implementation cp \ # (3)!
--python-version 3.10 \ # (4)!
--only-binary=:all: \ # (5)!
--upgrade pydantic # (6)!
- 使用与您的 Lambda 运行时对应的平台。
- 指定您要安装软件包的目录(通常是 Lambda Layers 的
python
)。 - 使用 CPython 实现。
- Python 版本必须与 Lambda 运行时兼容。
- 此标志确保安装预构建的二进制 wheels 包。
- 将安装最新版本的
pydantic
。
故障排除¶
no module named 'pydantic_core._pydantic_core'
¶
这个
no module named `pydantic_core._pydantic_core`
错误是一个常见问题,表明您安装 pydantic
的方式不正确。要调试此问题,您可以尝试以下步骤(在失败的导入之前)
- 检查已安装的
pydantic-core
包的内容。编译后的库及其类型存根是否都存在?
from importlib.metadata import files
print([file for file in files('pydantic-core') if file.name.startswith('_pydantic_core')])
"""
[PackagePath('pydantic_core/_pydantic_core.pyi'), PackagePath('pydantic_core/_pydantic_core.cpython-312-x86_64-linux-gnu.so')]
"""
您应该期望看到如上所示的两个文件。编译库文件将是 .so 或 .pyd,其名称因操作系统和 Python 版本而异。
- 检查您的 lambda 的 Python 版本是否与上面找到的编译库版本兼容。
import sysconfig
print(sysconfig.get_config_var("EXT_SUFFIX"))
#> '.cpython-312-x86_64-linux-gnu.so'
您应该期望在此处看到与编译库相同的后缀,例如,在这里我们看到后缀 .cpython-312-x86_64-linux-gnu.so
确实与 _pydantic_core.cpython-312-x86_64-linux-gnu.so
匹配。
如果这两个检查不匹配,则您的构建步骤没有为 lambda 的目标平台安装正确的本机代码。您应该调整您的构建步骤以更改安装的库版本。
最有可能的错误
-
您的操作系统或 CPU 架构不匹配(例如 darwin vs x86_64-linux-gnu)。尝试在安装 lambda 依赖项时,将正确的
--platform
参数传递给pip install
,或者在 linux docker 容器内构建以获得正确的平台。目前可能的平台包括--platform manylinux2014_x86_64
或--platform manylinux2014_aarch64
,但这些可能会随着未来 Pydantic 主要版本的发布而更改。 -
您的 Python 版本不匹配(例如
cpython-310
vscpython-312
)。尝试将正确的--python-version
参数传递给pip install
,或者更改构建中使用的 Python 版本。
No package metadata was found for email-validator
¶
Pydantic 使用 importlib.metadata
中的 version
来 检查已安装的 email-validator
版本。尽管这种包版本控制机制是 Python 中版本控制包的行业标准,但在某种程度上与 AWS Lambda 不兼容。以下是一些解决此问题的方法
如果您正在使用 serverless framework 部署您的 lambda,则 email-validator
包的相应元数据可能未包含在您的部署包中。诸如 serverless-python-requirements
之类的工具会删除元数据以减小包大小。您可以通过在 serverless.yml
文件中将 slim
设置为 false 来解决此问题
pythonRequirements:
dockerizePip: non-linux
slim: false
fileName: requirements.txt
您可以在 此处 阅读有关此修复以及其他可能相关的 slim
设置的更多信息。
如果您正在为您的代码和/或依赖项使用 .zip
存档,请确保您的包包含所需的版本元数据。为此,请确保在您的 .zip
存档中包含 email-validator
包的 dist-info
目录。
此问题已在其他流行的 python 库(如 jsonschema
)中报告过,因此您也可以在那里阅读有关该问题和潜在修复的更多信息。
额外资源¶
更多调试技巧¶
如果您仍然在为您的 AWS Lambda 安装 pydantic
苦苦挣扎,您可以查阅 此问题,其中涵盖了其他开发人员遇到的一系列问题和解决方案。
验证 event
和 context
数据¶
查看我们的博客文章,了解更多关于如何在 AWS Lambda 函数中使用 pydantic
验证 event
和 context
数据的信息。