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/
文件夹的环境变量来解决。
我正在使用 无服务器框架 和 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/
文件夹的环境变量来解决。