我正在尝试在AWS Lambda上运行一个脚本,该脚本最后将数据发送到Google云端存储(GCS)。当我在本地执行此操作时,它可以工作,但是当我在AWS Lambda上运行脚本时,导入GCS客户端库失败(其他导入工作正常)。谁知道为什么?
以下是脚本导入的摘录:
# main_script.py
import robobrowser
from google.cloud import storage
# ...generate data...
# ...send data to storage...
来自AWS的错误消息:
Unable to import module 'main_script': No module named google.cloud
要确认问题出在google客户端库导入中,我在AWS Lambda中运行了此脚本的一个版本,包含和不包含GCS导入(注释掉以后对它的引用),并且脚本按常规进行而不导入 - 注释掉GCS客户端库导入时的相关错误。其他导入(robobrowser
)在本地和AWS上始终可以正常工作。
我使用的是virtualenv,python设置为2.7.6。要部署到AWS Lambda,我将完成以下手动过程:
cd ~/.virtualenvs/{PROJECT_NAME}/lib/python2.7/site-packages
zip -r9 ~/Code/{PROJECT_NAME}.zip *
zip -g ~/Code/{PROJECT_NAME}.zip *
以下是在tree
内运行~/.virtualenvs/{PROJECT_NAME}/lib/python2.7/site-packages
的结果的子集:
...
│
├── 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
│ ├── ...
...
解压缩并检查拉链内容确认在拉链过程中此结构保持完好。
答案 0 :(得分:4)
我能够通过将__init__.py
添加到google
google/cloud
安装中的pip
和google-cloud
目录来解决此问题。尽管当前google-cloud
包(0.24.0)表示它支持python 2.7,但使用pip
下载的包结构似乎对我造成了问题。
为了报告所有内容,我在执行此操作后还遇到了一个单独的问题:AWS lambda无法将主脚本作为模块导入。我通过从头开始逐步重新创建repo来解决这个问题。无法确定第二期的原因,但是嘿。计算机。