我正在研究一个 python AWS Lambda 函数,该函数利用 pydantic 执行输入验证。我最近发现执行以下代码时 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)
对于 _stringify = validator("a", allow_reuse=True)(_stringify)
导致超时的原因,对 AWS Lambda 有更好了解的人是否有任何想法,您能否提出任何可能的建议修复?
(注意:SomeModel 的替代定义是不可取的,因为它违反了 DRY 原则,因为我们想在多个模型中使用 _stringify。)
代码在本地和 Lambda 环境中运行时都不会引发异常。
环境:
AWS lambda
python 3.8 - 通过 docker 自定义运行时构建。 Lambda 层支持:
- pydantic - v1.6.1 (python 3.8)
最佳答案
Environment: 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(或适当的 Windows Linux 子系统 (WSL) 包)。但是 Ubuntu 18.04(和适当的 WSL 包)大部分时间都可以正常工作。如果您遇到某些第三方 python 包的问题,请从 pypi.org 下载适当的通用 linux 兼容 .whl 文件,并将此 .whl 文件添加到生成的包含第三方依赖项的 .zip 文件中。
通过我们的第 3 步,您将无法使用第三方库
关于python - 为什么 AWS Lambda 在将函数传递给装饰器时会超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63449884/