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

Python 为什么AWS Lambda在将函数传递给装饰器时超时?,python,amazon-web-services,aws-lambda,python-decorators,pydantic,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) 我已经发现,调用

我正在开发一个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)
我已经发现,调用
\u stringify=validator(“a”,allow\u reuse=True)(\u stringify)
将\u stringify函数传递给验证器装饰器时会出现问题。这在本地环境中完全起作用,但在AWS Lambda中不起作用。以下“SomeModel”的替代定义也适用于AWS Lambda环境

class SomeModel(BaseModel):
    a: int

    @validator("a")
    def stringify(cls, v):
        return str(v)
对AWS Lambda有更好理解的人是否有任何想法,为什么
\u stringify=validator(“a”,allow\u reuse=True)(\u stringify)
会导致超时,您能否建议任何可能的修复方案

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

在本地和Lambda环境中运行时,代码不会引发异常

class SomeModel(BaseModel):
    a: int

    @validator("a")
    def stringify(cls, v):
        return str(v)
环境:
AWS Lambda
Python3.8-通过docker定制运行时构建。Lambda层支持:

  • pydantic-v1.6.1(python 3.8)
环境: python 3.8

AWS Lambda不支持Python 3.8,除非您使用自己的自定义运行时()

您需要执行以下步骤:

  • 检查您的代码在Python3.7下是否可以正常工作
  • 检查Lambda的设置,并确保已将其设置为使用Python 3.7
  • 准备一个包含所有第三方依赖项(pydantic等)的zip文件,并将其上载到AWS Lambda的配置网页,或在Lambda的部署过程中在脚本中使用它:。不要忘记在这一步中使用Python3.7和适当的Linux发行版。最好使用CentOS(或适用于Linux的Windows子系统(WSL)软件包)。然而,Ubuntu18.04(以及一个合适的WSL软件包)在大多数情况下工作正常。如果您遇到某个第三方python包的问题,请从pypi.org下载适当的与linux兼容的通用.whl文件,并将此.whl文件添加到生成的.zip文件中,其中包含您的第三方依赖项

  • 通过我们的步骤#3,您将无法使用第三方库

    在本地运行需要多长时间?是否有例外?工作版本相当于在普通函数定义之后编写
    stringify=validator(“a”)(stringify)
    。非工作版本基本上只是等号后面的部分-您实际上没有定义任何东西,
    SomeModel
    不受代码行的任何影响。本地运行@Parsifal需要1.4微秒。我尝试了您的建议@jasonharper,但没有解决问题。很好的提示:)。我已经编辑了代码来修复@jasonharper.Hi注意到的错误!我们正在运行一个使用docker构建的自定义运行时,以支持python 3.8和其他依赖项。我会更新帖子,让它更明确。