如何正确构建 AWS Lambda Python 层以避免导入错误?

How do I properly structure AWS Lambda Python Layer to avoid Import Errors?

提问人:meowmeow 提问时间:11/14/2023 更新时间:11/15/2023 访问量:33

问:

我在 AWS Lambda 中有一个自定义 python 层,其结构如下:

/python
|_/m_utilities
  |_/functions
    |_/__init__.py
    |_/Defaults.py
    |_/Athena.py
  |_/parameterizer
    |_/classes
      |_/__init__.py
      |_/AthenaLite.py
      |_/BaseParameter.py
    |_/__init__.py
|_/misc
  • 参数化程序 init.py 包含from parameterizer.classes.AthenaLite import athena_parameterizer as athena_lite

lambda 处理程序以以下方式开头:

from m_utilities.functions.Athena import <various functions>
from m_utilities.parameterizer import athena_lite

这种结构在本地按预期工作,我可以毫无问题地导入所有内容。但是,当我尝试测试lambda时,出现错误:[ERROR] Runtime.ImportModuleError:无法导入模块“parameterizer”

在尝试调试时,我尝试的一件事是编辑 lambda 处理程序以检查文件夹结构(看起来正确)并打印掉m_utilities包中的模块以查看我的“参数化器”模块是否存在。

在 lambda 处理程序中:

try:
    from m_utilities.parameterizer import athena_lite
except:
    import os.path, pkgutil,m_utilities
    pkgpath = os.path.dirname(fp_utilities.__file__)
    print([name for _, name, _ in pkgutil.iter_modules([pkgpath])])

AWS 中的回报:

['functions', 'messaging', 'parameterizer', 'misc']

该模块似乎在那里,那么我做错了什么,以至于它无法导入它?

python-3.x aws-lambda-layers

评论

1赞 Paolo 11/14/2023
您确定在图层中该文件夹有一个?parameterizer__init.py__
0赞 meowmeow 11/14/2023
是的,为了仔细检查,我编辑了处理程序以打印“参数化器”文件夹中的所有内容,它返回:“/opt/python/utilities/parameterizer/__init__.py”和“/opt/python/utilities/parameterizer/classes”
0赞 meowmeow 11/14/2023
我真的不知所措。我可能会尝试将模块分成不同的层,但我希望有一个可以更轻松地维护的整合包。
1赞 Paolo 11/14/2023
你是如何打包图层的?

答:

0赞 meowmeow 11/15/2023 #1

出于某种原因,我不确定为什么,这种结构在 AWS 中有效:

/python
|_/m_utilities
  |_/functions
    |_/__init__.py
    |_/Defaults.py
    |_/Athena.py
|_/parameterizer
  |_/classes
    |_/__init__.py
    |_/AthenaLite.py
    |_/BaseParameter.py
  |_/__init__.py
|_/misc

我将“参数化器”模块移动到顶级文件夹中,然后开始工作。from parameterizer import athena_lite