【问题标题】:How to store data in GCS while accessing it from GAE and 'GCE' locally如何在本地从 GAE 和“GCE”访问数据时将数据存储在 GCS 中
【发布时间】:2013-09-17 21:02:16
【问题描述】:

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

在生产中,部署在实际的 GAE > GCS

按照建议,我使用 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?

【问题讨论】:

    标签: python google-app-engine boto google-cloud-storage google-compute-engine


    【解决方案1】:

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

    如示例至Client library authentication:

    # 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)
    

    【讨论】:

      【解决方案2】:

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

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

      GOOGLE_APPLICATION_CREDENTIALS=../sa-b0af54dea5e.json
      

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            【解决方案5】:

            为此目的有一个谷歌云存储本地/开发服务器: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 连接。

            【讨论】:

            • 这是用于本地 Datastore 的。我认为 OP 正在尝试从本地 GAE 服务器访问真正的 Google Cloud Storage
            • 确实,Google Cloud Storage 不是 Google Cloud Datastore。
            猜你喜欢
            • 2015-07-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多