如何在本地访问GAE和'GCE'时将数据存储在GCS中

28
有一个使用GCS存储/检索文件的GAE项目。这些文件还需要被在GCE上运行的代码读取(需要C++库,因此无法在GAE上运行)。在实际的GAE > GCS < GCE部署中,这种设置很好地工作。然而,在本地测试和开发方面,我正在努力解决不同的问题。按照建议,我正在使用GoogleAppEngineCloudStorageClient运行GAE的dev_appserver来访问(模拟的)GCS。文件放在本地blobstore中。非常适合测试GAE。由于没有GCE SDK可以在本地运行VM,因此每当我提到本地“GCE”时,它只是运行Linux的我的本地开发机器。在本地GCE方面,我只是使用默认的boto库(https://developers.google.com/storage/docs/gspythonlibrary)和Python 2.x运行时来与C++代码进行接口,并从GCS检索文件。然而,在开发中,这些文件无法从boto中访问,因为它们存储在dev_appserver的blobstore中。是否有一种方法可以正确连接本地GAE和GCE到本地GCS?

目前,我放弃了本地GCS部分并尝试使用真正的GCS。使用boto的GCE部分很容易。使用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?
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)

1
谷歌库像火车站里的游客一样来了又走。目前(2020年),google-cloud-storage 应该可以在Python 3的GCE和GAE标准环境中使用。
在GAE和CGE上,它会从环境中获取访问凭据,而在本地,您可以提供一个服务账户JSON文件,如下所示:
GOOGLE_APPLICATION_CREDENTIALS=../sa-b0af54dea5e.json

0

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

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

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


-1

看起来 Python 的 appengine-gcs-client 现在只对生产 App Engine 和 dev_appserver.py 有用了,而它的本地示例已经从开发者文档中删除,转而使用 Boto :( 如果您决定不使用本地 GCS 模拟,则最好在本地测试和 GCE 中坚持使用 Boto。

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


-3

为此,有一个适用于Google Cloud Storage本地/开发服务器: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连接。


6
这是针对本地的“数据存储”。我认为提问者试图从本地GAE服务器访问真正的Google云存储。 - Su Zhang
1
确实,Google Cloud Storage并不是Google Cloud Datastore。 - kvdb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接