【发布时间】:2022-03-17 18:42:17
【问题描述】:
我正在使用 Serverless 框架 和 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
如果有人可以向我解释发生了什么以及如何使其在云中运行,将不胜感激。
【问题讨论】:
标签: python aws-lambda serverless serverless-framework aws-serverless