我正在尝试在 AWS Lambda 上运行一个脚本,该脚本最后将数据发送到 Google Cloud Storage (GCS)。当我在本地这样做时,它有效,但是当我在 AWS Lambda 上运行脚本时,导入 GCS 客户端库失败(但其他导入工作正常)。有人知道为什么吗?
这是脚本导入的摘录:
# main_script.py
import robobrowser
from google.cloud import storage
# ...generate data...
# ...send data to storage...
来自 AWS 的错误信息:
无法导入模块“main_script”:没有名为 google.cloud 的模块
为了确认问题出在谷歌客户端库导入上,我在 AWS Lambda 中运行了这个脚本的一个版本,有和没有 GCS 导入(注释掉后面对它的引用)并且脚本照常进行而没有导入 -注释掉 GCS 客户端库导入时的相关错误。其他导入(robobrowser
)在任何时候都可以在本地和 AWS 上正常工作。
我正在使用 virtualenv,python 设置为 2.7.6。要部署到 AWS Lambda,我将执行以下手动过程:
- 压缩虚拟环境的 pip 包:
cd ~/.virtualenvs/{PROJECT_NAME}/lib/python2.7/site-packages
zip -r9 ~/Code/{PROJECT_NAME}.zip *
- 压缩项目的内容,将它们添加到与上面相同的 zip 中:
zip -g ~/Code/{PROJECT_NAME}.zip *
- 将 zip 上传到 AWS 并使用 Web 控制台进行测试
这是在 ~/.virtualenvs/{PROJECT_NAME}/lib/python2.7/site-packages
中运行 tree
结果的子集:
...
│
├── google
│ ├── ...
│ ├── cloud
│ │ ├── _helpers.py
│ │ ├── _helpers.pyc
│ │ ├── ...
│ │ ├── bigquery
│ │ │ ├── __init__.py
│ │ │ ├── __init__.pyc
│ │ │ ├── _helpers.py
│ │ │ ├── _helpers.pyc
│ │ ├── ...
│ │ ├── storage
│ │ │ ├── __init__.py
│ │ │ ├── __init__.pyc
│ │ │ ├── _helpers.py
│ │ │ ├── _helpers.pyc
├── robobrowser
│ ├── __init__.py
│ ├── __init__.pyc
│ ├── browser.py
│ ├── browser.pyc
│ ├── ...
...
解压缩并检查 zip 的内容确认此结构在压缩过程中保持完好无损。
最佳答案
我能够通过将 __init__.py
添加到 pip 中的
google
和 google/cloud
目录来解决这个问题google-cloud
安装。尽管当前的 google-cloud
包 (0.24.0) 表示它支持 python 2.7,但使用 pip
下载的包结构似乎给我带来了问题。
为了报告所有内容,我在执行此操作后还遇到了一个单独的问题:AWS lambda 在将主脚本作为模块导入时遇到问题。我通过从头开始逐步重新创建 repo 协议(protocol)来解决此问题。无法查明第二个问题的原因,但是嘿。计算机。
关于python-2.7 - 如何从 google.cloud 导入模块以用于 AWS Lambda?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43458559/