Serverless Framework / Python - 在一个服务中部署多个函数

Serverless Framework / Python - Deploying multiple functions in a service

我正在使用 无服务器框架AWS Lambda 来部署多个功能,其中一个是用 Python3 并与我正在使用的一些外部库(redis、elasticsearch、dateutil)捆绑在一起。 当 运行 在本地使用 serverless invoke local --function function-name lambda 时,它工作正常。当 运行 在本地使用 python3 function.py 时,我收到错误 ImportError: attempted relative import with no known parent package,因为我正在使用点前缀导入本地 python 文件,即 from .imported_file import one, two, three。当 运行 在云端时,即 serverless invoke --function function-name,我收到错误 Unable to import module 'function-name/function': No module named 'redis'

由于我在同一个 yaml 文件下部署多个函数,每个函数都有自己的文件夹,我使用以下设置进行部署:

package:
  individually: true
  exclude:
    - "*/**"
    - "*"

并且在每个函数中:

package:
      include:
        - function-name/**

文件结构如下所示:

service-name/
├─ function-name/
│  ├─ packages/
│  │  ├─ dateutil/
│  │  ├─ elasticsearch/
│  │  ├─ redis/
│  ├─ function.py
│  ├─ imported_file.py
├─ function-name-2/
├─ serverless.yaml

我已经尝试了很多方法来克服这个问题,但主要是将所有文件和文件夹都放在 lambda 的根文件夹中。问题是我无法完成此操作,因为使用上述方法打包函数会强制文件结构如下所示:

./
├─ function-name/
│  ├─ packages/
│  ├─ function.py

而不是这个:

./
├─ packages/
├─ function.py

如果有人能向我解释发生了什么以及如何让它在云中工作,将不胜感激。

通过将 PYTHONPATH 设置为指向本地 packages/ 文件夹的环境变量来解决。