跳转到内容

AWS Lambda

pydantic 与 AWS Lambda 函数能很好地集成。在本指南中,我们将讨论如何为 AWS Lambda 函数设置 pydantic

为 AWS Lambda 函数安装 Python 库

在 AWS Lambda 函数中使用 Python 库有很多种方法。正如 AWS Lambda 文档 中所述,最常见的方法包括:

所有这些方法都可以与 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)!
  1. 使用与您的 Lambda 运行时相对应的平台。
  2. 指定您想要安装包的目录(对于 Lambda Layers 通常是 python)。
  3. 使用 CPython 实现。
  4. Python 版本必须与 Lambda 运行时兼容。
  5. 此标志确保安装预构建的二进制 wheels 包。
  6. 将安装最新版本的 pydantic

问题排查

缺少 pydantic_core 模块

这个

no module named `pydantic_core._pydantic_core`

错误是一个常见问题,表明您错误地安装了 pydantic。要调试此问题,您可以(在导入失败之前)尝试以下步骤:

  1. 检查已安装的 pydantic-core 包的内容。已编译的库及其类型存根(type stubs)是否都存在?

    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 版本而变化。

  2. 检查您的 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 依赖项时,尝试向 pip install 传递正确的 --platform 参数,或者在针对正确平台的 Linux docker 容器内进行构建。目前可能的平台包括 --platform manylinux2014_x86_64--platform manylinux2014_aarch64,但这些可能会随着 Pydantic 的未来主要版本发布而改变。

  • 您的 Python 版本不匹配(例如 cpython-310 vs cpython-312)。尝试向 pip install 传递正确的 --python-version 参数,或者更改您构建时使用的 Python 版本。

找不到 email-validator 的包元数据

Pydantic 使用 importlib.metadata 中的 version检查已安装的 email-validator 版本。这种包版本控制机制与 AWS Lambda 有些不兼容,尽管它是 Python 中包版本控制的行业标准。有几种方法可以解决此问题:

如果您使用 serverless 框架部署 Lambda,很可能 email-validator 包的相应元数据没有被包含在您的部署包中。像 serverless-python-requirements 这样的工具会移除元数据以减小包的大小。您可以通过在您的 serverless.yml 文件中将 slim 设置为 false 来解决此问题:

pythonRequirements:
    dockerizePip: non-linux
    slim: false
    fileName: requirements.txt

您可以在这篇博客文章中阅读有关此修复方法以及其他可能相关的 slim 设置的更多信息。

如果您正在为您的代码和/或依赖项使用 .zip 存档,请确保您的包包含所需的版本元数据。为此,请确保将 email-validator 包的 dist-info 目录包含在您的 .zip 存档中。

其他流行的 Python 库(如 jsonschema)也报告了此问题,因此您也可以在那里阅读更多关于该问题和潜在修复方法的信息。

额外资源

更多调试技巧

如果您在为 AWS Lambda 安装 pydantic 时仍然遇到困难,您可以查阅此 issue,其中涵盖了其他开发者遇到的各种问题和解决方案。

验证 eventcontext 数据

请查看我们的博客文章,了解更多关于如何使用 pydantic 在 AWS Lambda 函数中验证 eventcontext 数据的信息。