如何从google.cloud导入模块以在AWS Lambda中使用?

时间:2017-04-17 19:50:36

标签: python-2.7 amazon-web-services google-cloud-storage aws-lambda

我正在尝试在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,我将完成以下手动过程:

  • 压缩虚拟环境的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控制台进行测试

以下是在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
│   ├── ...
...

解压缩并检查拉链内容确认在拉链过程中此结构保持完好。

1 个答案:

答案 0 :(得分:4)

我能够通过将__init__.py添加到google google/cloud安装中的pipgoogle-cloud目录来解决此问题。尽管当前google-cloud包(0.24.0)表示它支持python 2.7,但使用pip下载的包结构似乎对我造成了问题。

为了报告所有内容,我在执行此操作后还遇到了一个单独的问题:AWS lambda无法将主脚本作为模块导入。我通过从头开始逐步重新创建repo来解决这个问题。无法确定第二期的原因,但是嘿。计算机。