python - 为什么 AWS Lambda 在将函数传递给装饰器时会超时?

标签 python amazon-web-services aws-lambda python-decorators pydantic

我正在研究一个 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)。

您需要进行后续步骤:

  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(或适当的 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/

相关文章:

python - xlsx writer - 如何仅在单元格的一侧获得粗边框?

Python内部实体模拟

python - 如何将 png 文件转换为 geotiff

ssh - 无法从 LAN 通过 SSH 访问我的 Amazon EC2 实例,我认为该实例阻塞了端口 22

aws-lambda - aws serverless - 导出 Cognito 授权者的输出值

amazon-s3 - 参数中缺少必需的 key 'Bucket'

python - 在 Python 中对多维数据样本应用非线性回归

amazon-web-services - 预订 ec2 实例后的 AWS 通用 SSD 费用

amazon-web-services - 我听说使用弹性 IP 通常被认为是一种糟糕的架构设计。为什么这样 ?为什么不建议使用弹性 IP?

python - 如何使用 Poetry 创建可部署的 Python Lambda zip