python-2.7 - 如何从 google.cloud 导入模块以用于 AWS Lambda?

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

我正在尝试在 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 中的 googlegoogle/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/

相关文章:

python - Pandas DataFrame 如何解释两个给定的列?

amazon-web-services - 创建预签名 url 时出现紧急错误

amazon-web-services - AWS EKS : Enabling Admission Controllers

google-cloud-platform - 如何检索我的所有 Google Cloud Storage 存储桶的大小?

node.js - 以编程方式将文件从任何 CDN 传输到 Google Cloud 存储桶

google-app-engine - NoClassDefFoundError : Could not initialize OauthRawGcsServiceFactory on production environment

python time.time() 在 python 2 和 3 中的区别

python - 在 python 2.7 中导入 Pandas 时出现 "ValueError: unknown locale: UTF-8"

python - psycopg2 在/tmp 上的权限被拒绝

amazon-web-services - 加密 .aws/credentials