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。现在我知道我可以通过将路径添加到 PYTHONPATHsys.pathimport 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这个路径添加到PYTHONPATHsys.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

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