28

有一个使用 GCS 存储/检索文件的 GAE 项目。这些文件还需要由将在 GCE 上运行的代码读取(需要 C++ 库,因此不能在 GAE 上运行)。

在生产中,部署在实际的 GAE > GCS < GCE 上,此设置工作正常。然而,在本地测试和开发是一个不同的故事,我试图弄清楚。

按照建议,我使用 GoogleAppEngineCloudStorageClient 运行 GAE 的 dev_appserver 来访问(模拟的)GCS。文件放在本地 blobstore 中。非常适合测试 GAE。

由于这些不是在本地运行 VM 的 GCE SDK,所以每当我提到本地的“GCE”时,它只是我运行 linux 的本地开发机器。在本地 GCE 方面,我只是使用带有 python 2.x 运行时的默认 boto 库 ( https://developers.google.com/storage/docs/gspythonlibrary ) 与 C++ 代码交互并从 GCS 检索文件. 但是,在开发中,这些文件无法从 boto 访问,因为它们存储在 dev_appserver 的 blobstore 中。

有没有办法将本地 GAE 和 GCE 正确连接到本地 GCS?

目前,我放弃了本地 GCS 部分并尝试使用真正的 GCS。带有 boto 的 GCE 部分很简单。GCS 部分还能够使用 access_token 使用真正的 GCS,因此它使用真正的 GCS 而不是本地 blobstore,方法是:

cloudstorage.common.set_access_token(access_token)

根据文档:

access_token: you can get one by run 'gsutil -d ls' and copy the
  str after 'Bearer'.

该令牌的工作时间有限,因此并不理想。有没有办法设置更永久的 access_token?

4

5 回答 5

1

有从开发环境访问 Google Cloud Storage 的便捷选项。您应该使用随 Google Cloud SDK 提供的客户端库。在本地执行后gcloud init,您可以访问您的资源。

如客户端库身份验证示例所示:

# Get the application default credentials. When running locally, these are
# available after running `gcloud init`. When running on compute
# engine, these are available from the environment.
credentials = GoogleCredentials.get_application_default()

# Construct the service object for interacting with the Cloud Storage API -
# the 'storage' service, at version 'v1'.
# You can browse other available api services and versions here:
#     https://developers.google.com/api-client-library/python/apis/
service = discovery.build('storage', 'v1', credentials=credentials)
于 2016-01-08T17:41:56.000 回答
1

谷歌图书馆就像火车站的游客一样来来去去。今天(2020 年)google-cloud-storage应该可以在 GCE 和 GAE 标准环境中使用 Python 3。

在 GAE 和 CGE 上,它从环境中获取访问凭证,您可以在本地提供它一个服务帐户 JSON 文件,如下所示:

GOOGLE_APPLICATION_CREDENTIALS=../sa-b0af54dea5e.json
于 2020-11-20T12:37:36.727 回答
0

如果您一直在使用“真正的”远程 GCS,较新的 gcloud 可能是最好的库:http: //googlecloudplatform.github.io/gcloud-python/

Python 有多少存储客户端库,这真是令人困惑。有些仅用于 AE,但在使用 dev_appserver.py 运行时,它们通常强制(或至少默认为)使用本地模拟 Blobstore。

似乎 gcloud 总是使用真正的 GCS,这正是我想要的。它还在本地运行时“神奇地”修复了身份验证。

于 2016-07-28T17:54:30.283 回答
-1

看起来Python 的appengine-gcs-client现在只对生产 App Engine 和 dev_appserver.py 内部有用,并且它的本地示例已从开发人员文档中删除,以支持 Boto :( 如果您决定不使用本地 GCS 仿真,最好坚持使用 Boto 进行本地测试和 GCE。

如果您仍想使用“google.appengine.ext.cloudstorage”,访问令牌总是会过期,因此您需要手动刷新它。老实说,鉴于您的设置,最简单的方法就是从 Python 调用“gsutil -d ls”并解析输出以从本地凭据中获取新令牌。您可以使用API 客户端库以更“正确”的方式获取令牌,但此时事情会变得如此迂回,您不妨只使用 Boto。

于 2016-02-20T04:21:19.793 回答
-3

为此目的有一个谷歌云存储本地/开发服务器:https ://developers.google.com/datastore/docs/tools/devserver

设置完成后,创建数据集并启动 GCS 开发服务器

gcd.sh create [options] <dataset-directory>
gcd.sh start [options] <dataset-directory>

导出环境变量

export DATASTORE_HOST=http://yourmachine:8080
export DATASTORE_DATASET=<dataset_id>

然后您应该能够datastore在本地使用代码中的连接。

于 2014-01-15T05:01:21.200 回答