首页 > 解决方案 > Python 中的 AWS Lambda:在 Lambda 函数处理程序中导入父包/目录

问题描述

我在使用 AWS SAM 和 Python 3.8 作为运行时创建的无服务器应用程序(避免混乱的最简单应用程序)中有如下目录结构:

├── common
│   └── a.py
├── hello_world
│   ├── __init__.py
│   ├── app.py
│   └── requirements.txt
└── template.yaml

我想common/a.py在 Lambda 处理程序中导入模块 - hello_world/app.py。现在我知道我可以通过添加or的路径在 Python 中正常导入它,但是当代码在 Docker 容器内的 Lambda 中运行时它不起作用。调用时,Lambda 处理程序函数在目录内运行,不考虑文件夹结构。PYTHONPATHsys.path/var/task

我尝试插入/var/task/common, /var/common/var甚至像这样/commonsys.path编程方式插入:

import sys
sys.path.insert(0, '/var/task/common')
from common.a import Alpha

但我仍然收到错误:

ModuleNotFoundError: No module named 'common'

我知道Lambda 层,但考虑到我的场景,我想直接引用多个 Lambda 函数中的通用代码,而不需要上传到层。我想在无服务器框架中但在 AWS SAM中拥有类似serverless-python-requirements插件的东西。

所以我的问题是,我应该如何将此路径添加commonPYTHONPATHor sys.path?或者是否有替代解决方法,例如[serverless-python-requirements][3]直接在父文件夹中导入模块而不使用 Lambda 层?

标签: pythonpython-3.xaws-lambdaaws-samaws-sam-cli

解决方案


我在包依赖项方面遇到了类似的问题,根据 AWS 知识中心,您应该将所有项目放在根级别:

您可能需要创建一个部署包,其中包含位于 .zip 文件根目录中的功能模块,并对所有文件具有读取和执行权限。

根据https://aws.amazon.com/premiumsupport/knowledge-center/build-python-lambda-deployment-package/


推荐阅读