首页 > 解决方案 > 为什么将函数传递给装饰器时 AWS Lambda 会超时?

问题描述

我正在研究一个利用 pydantic 执行输入验证的 python AWS Lambda 函数。我最近发现执行以下代码时 Lambda 超时(超时 15 秒):

def _stringify(v):
    return str(v)

class SomeModel(BaseModel):
    a: int
    _stringify = validator("a", allow_reuse=True)(_stringify)

SomeModel(a=12)

我已经确定在调用_stringify = validator("a", allow_reuse=True)(_stringify)将 _stringify 函数传递给验证器装饰器时会出现问题。这在本地环境中是完全可用的,但在 AWS Lambda 中却没有。以下“SomeModel”的替代定义也适用于 AWS Lambda 环境。

class SomeModel(BaseModel):
    a: int

    @validator("a")
    def stringify(cls, v):
        return str(v)

是否有人对 AWS Lambda 有更好的了解,对为什么_stringify = validator("a", allow_reuse=True)(_stringify)会导致超时有任何想法,您能否提出任何可能的修复建议?

(注意:SomeModel 的替代定义是不可取的,因为它违反了 DRY 原则,因为我们想在多个模型中使用 _stringify。)

该代码在本地和 Lambda 环境中运行时均未引发异常。

环境:
AWS Lambda
python 3.8 - 通过 docker 构建自定义运行时。Lambda 层支持:

标签: pythonamazon-web-servicesaws-lambdapython-decoratorspydantic

解决方案


环境:python 3.8

AWS Lambda 不支持 Python 3.8,除非您使用自己的自定义运行时 ( https://docs.aws.amazon.com/lambda/latest/dg/runtimes-custom.html )。

您需要执行以下步骤:

  1. 检查您的代码在 Python 3.7 下是否正常工作
  2. 检查您的 Lambda 设置并确保它已设置为使用 Python 3.7
  3. 准备一个包含所有第三方依赖项(pydantic 等)的 zip 文件,并将其上传到 AWS Lambda 的配置网页或在 Lambda 部署过程中在脚本中使用它:https ://docs.aws.amazon.com /lambda/latest/dg/python-package.html。不要忘记在此步骤中使用 Python3.7 和适当的 Linux 发行版。最好使用 CentOS(或适用于 Linux 的 Windows 子系统 (WSL) 软件包)。但是 Ubuntu 18.04(和适当的 WSL 包)大部分时间都可以正常工作。如果您遇到某些第三方 python 包的问题,​​请从 pypi.org 下载适当的通用 linux 兼容 .whl 文件,并将此 .whl 文件添加到生成的带有第三方依赖项的 .zip 文件中。

没有我们的第 3 步,您将无法使用第三方库


推荐阅读