python - 为什么将函数传递给装饰器时 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 层支持:
- pydantic - v1.6.1 (python 3.8)
解决方案
环境:python 3.8
AWS Lambda 不支持 Python 3.8,除非您使用自己的自定义运行时 ( https://docs.aws.amazon.com/lambda/latest/dg/runtimes-custom.html )。
您需要执行以下步骤:
- 检查您的代码在 Python 3.7 下是否正常工作
- 检查您的 Lambda 设置并确保它已设置为使用 Python 3.7
- 准备一个包含所有第三方依赖项(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 步,您将无法使用第三方库
推荐阅读
- git - 在编译和构建 delphi 应用程序期间查询 Git 数据
- html - 从 v-on 调用另一个视图实例中的 Vue 方法:单击同一页面?
- typescript - 在 typescript 3.7 中使用 typescript 4 模块在编译时出错
- mongodb - 在 $lookup 管道中正确使用 MongoDB 复合主键
- powershell - 在 CSV 中查找行
- flutter - 颤振中的 SSLHandshakeException
- firebase - 在 Next.js 应用程序中获取 firebase 存储文件 URL 返回 XMLHttpRequest ReferenceError
- java - 我遇到了 CardLayout 问题,其中一个 JPanel 没有收到键盘事件
- php - PHP/Ajax 页面加载/超时
- apache-spark - Apache Spark:“作为”与“缓存”