Python 中的 AWS Lambda:在 Lambda 函数处理程序中导入父包/目录

Waq*_*hah 10 python python-3.x aws-lambda aws-sam-cli aws-sam

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

??? common
?   ??? a.py
??? hello_world
?   ??? __init__.py
?   ??? app.py
?   ??? requirements.txt
??? template.yaml
Run Code Online (Sandbox Code Playgroud)

我想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
Run Code Online (Sandbox Code Playgroud)

但我仍然收到错误:

ModuleNotFoundError: No module named 'common'

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

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

Waq*_*hah 3

我没有找到我想要的东西,但我最终得到了一个解决方案,在根目录中创建一个 Lambda 函数,该函数处理函数内的所有不同的 API 调用。是的,我的 Lambda 函数与 API Gateway 集成,我可以分别使用event["httpMethod"]和获取 API 方法和 API 路径event ["httpPath"]。然后我可以将所有包放在根目录下并在彼此之间导入它们。

\n

例如,假设我有 2 个 API 路径/items/employees需要处理它们,并且它们都需要处理 GET 和 POST 方法,以下代码就足够了:

\n
if event["path"] == '/items':\n   if event["httpMethod"] == 'GET':\n      ...\n   elif event["httpMethod"] == 'POST':\n      ...\nelif event["path"] == '/employees':\n   if event["httpMethod"] == 'GET':\n      ...\n   if event["httpMethod"] == 'POST':\n      ...\n
Run Code Online (Sandbox Code Playgroud)\n

所以现在我可以在这个 Lambda 函数下拥有尽可能多的包。例如,以下是存储库现在的样子:

\n
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 application\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 *.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 persistence\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 *.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 models\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 *.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 rootLambdaFunction.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 requirements.txt\n
Run Code Online (Sandbox Code Playgroud)\n

这样,我可以在给定结构中随意导入包。

\n