Python 中的 AWS Lambda:在 Lambda 函数处理程序中导入父 package/directory
AWS Lambda in Python: Import parent package/directory in Lambda function handler
我的无服务器应用程序(避免混乱的最简单应用程序)中的目录结构如下所示,我使用 AWS SAM 创建了 Python 3.8 作为 运行 时间:
├── common
│ └── a.py
├── hello_world
│ ├── __init__.py
│ ├── app.py
│ └── requirements.txt
└── template.yaml
我想在 Lambda 处理程序中导入 common/a.py
模块 - hello_world/app.py
。现在我知道我可以通过将路径添加到 PYTHONPATH
或 sys.path
来 import it normally in Python,但是当代码在 [=51 中的 Lambda 中是 运行 时它不起作用=] 容器。调用时,Lambda 处理程序函数在 /var/task
目录中 运行,不考虑文件夹结构。
我尝试像这样以编程方式将 /var/task/common
、/var/common
、/var
甚至 /common
插入到 sys.path
:
import sys
sys.path.insert(0, '/var/task/common')
from common.a import Alpha
但我仍然得到错误:
ModuleNotFoundError: No module named 'common'
我知道 Lambda Layers 但是考虑到我的场景,我想直接引用多个 Lambda 函数中的公共代码而不需要上传到层.我想在 Serverless 框架 但在 AWS SAM 中有类似 serverless-python-requirements
的插件。
所以我的问题是,我应该如何将common
这个路径添加到PYTHONPATH
或sys.path
?或者是否有替代解决方法,例如 [serverless-python-requirements][3]
直接在父文件夹中导入模块而不使用 Lambda 层?
我在包依赖性方面遇到了类似的问题,根据 AWS 知识中心,您应该将所有项目放在根级别:
You might need to create a deployment package that includes the
function modules located in the root of the .zip file with read and
execute permissions for all files.
根据https://aws.amazon.com/premiumsupport/knowledge-center/build-python-lambda-deployment-package/
我没有找到我要找的东西,但我最终找到了在根目录中创建单个 Lambda 函数的解决方案,该函数处理函数内所有不同的 API 调用。是的,我的 Lambda 函数与 API 网关集成,我可以分别使用 event["httpMethod"]
和 event ["httpPath"]
获取 API 方法和 API 路径。然后我可以将所有包放在根目录下并在彼此之间导入它们。
例如,假设我有 2 个 API 路径 /items
和 /employees
需要处理,并且它们都需要处理 GET 和 POST 方法,以下代码就足够了:
if event["path"] == '/items':
if event["httpMethod"] == 'GET':
...
elif event["httpMethod"] == 'POST':
...
elif event["path"] == '/employees':
if event["httpMethod"] == 'GET':
...
if event["httpMethod"] == 'POST':
...
所以现在我可以在这个 Lambda 函数下拥有尽可能多的包。例如,以下是存储库现在的样子:
├── application
│ └── *.py
├── persistence
│ └── *.py
├── models
│ └── *.py
└── rootLambdaFunction.py
└── requirements.txt
这样,我就可以在给定结构中随意导入包了。
我的无服务器应用程序(避免混乱的最简单应用程序)中的目录结构如下所示,我使用 AWS SAM 创建了 Python 3.8 作为 运行 时间:
├── common
│ └── a.py
├── hello_world
│ ├── __init__.py
│ ├── app.py
│ └── requirements.txt
└── template.yaml
我想在 Lambda 处理程序中导入 common/a.py
模块 - hello_world/app.py
。现在我知道我可以通过将路径添加到 PYTHONPATH
或 sys.path
来 import it normally in Python,但是当代码在 [=51 中的 Lambda 中是 运行 时它不起作用=] 容器。调用时,Lambda 处理程序函数在 /var/task
目录中 运行,不考虑文件夹结构。
我尝试像这样以编程方式将 /var/task/common
、/var/common
、/var
甚至 /common
插入到 sys.path
:
import sys
sys.path.insert(0, '/var/task/common')
from common.a import Alpha
但我仍然得到错误:
ModuleNotFoundError: No module named 'common'
我知道 Lambda Layers 但是考虑到我的场景,我想直接引用多个 Lambda 函数中的公共代码而不需要上传到层.我想在 Serverless 框架 但在 AWS SAM 中有类似 serverless-python-requirements
的插件。
所以我的问题是,我应该如何将common
这个路径添加到PYTHONPATH
或sys.path
?或者是否有替代解决方法,例如 [serverless-python-requirements][3]
直接在父文件夹中导入模块而不使用 Lambda 层?
我在包依赖性方面遇到了类似的问题,根据 AWS 知识中心,您应该将所有项目放在根级别:
You might need to create a deployment package that includes the function modules located in the root of the .zip file with read and execute permissions for all files.
根据https://aws.amazon.com/premiumsupport/knowledge-center/build-python-lambda-deployment-package/
我没有找到我要找的东西,但我最终找到了在根目录中创建单个 Lambda 函数的解决方案,该函数处理函数内所有不同的 API 调用。是的,我的 Lambda 函数与 API 网关集成,我可以分别使用 event["httpMethod"]
和 event ["httpPath"]
获取 API 方法和 API 路径。然后我可以将所有包放在根目录下并在彼此之间导入它们。
例如,假设我有 2 个 API 路径 /items
和 /employees
需要处理,并且它们都需要处理 GET 和 POST 方法,以下代码就足够了:
if event["path"] == '/items':
if event["httpMethod"] == 'GET':
...
elif event["httpMethod"] == 'POST':
...
elif event["path"] == '/employees':
if event["httpMethod"] == 'GET':
...
if event["httpMethod"] == 'POST':
...
所以现在我可以在这个 Lambda 函数下拥有尽可能多的包。例如,以下是存储库现在的样子:
├── application
│ └── *.py
├── persistence
│ └── *.py
├── models
│ └── *.py
└── rootLambdaFunction.py
└── requirements.txt
这样,我就可以在给定结构中随意导入包了。