迁移至 Cloud 客户端库以进行存储

Cloud Storage 让应用可提供大型数据对象,例如视频或图片文件,并让您的用户可上传大型数据文件。在 Python 2 运行时中,App Engine 为在 Cloud Storage 中写入和读取对象提供了自己的客户端库。此 App Engine 库在较新的 App Engine 运行时(包括 Python 3 运行时)中不可用。

如果您的 Python 2 应用使用 GoogleAppEngineCloudStorageClient 库,您需要先迁移到 Cloud Storage 的 Cloud 客户端库,然后才能在 Python 3 运行时中运行该应用。请注意,您只需迁移应用即可使用新的客户端库。现有 Cloud Storage 存储分区中的所有数据对象和权限保持不变,并且您可以使用新的客户端库访问现有存储分区

App Engine 与 Cloud 客户端库的比较

相似之处:

  • Cloud 客户端库支持 App Engine 客户端库启用的所有 Cloud Storage 功能,例如读取、写入、移除和列出对象。迁移应该只需对代码进行细微更改。

    Cloud 客户端库还支持额外的功能,例如创建存储分区和为存储分区加标签,以及检索旧版本的对象

差异:

  • 在 App Engine 库中,检索对象列表的函数异步运行。Cloud 客户端库不提供用于列出对象的异步函数,但您可以使用分页并迭代一组少量对象。

  • App Engine 客户端库要求您使用访问控制列表 (ACL) 来控制对存储分区和对象的访问。但是,Cloud Storage 和 Cloud 客户端库支持两个系统,这两个系统可用于向用户授予访问您的存储分区和对象的权限:ACL 和统一存储分区级访问权限。统一存储分区级访问权限为您的所有 Cloud 资源提供更简单、一致的访问权限控制体验。

    迁移到 Cloud 客户端库后,您与 App Engine 客户端库一起使用的所有 ACL 仍然对现有存储分区有效,并且您可以根据需要继续使用 ACL。

    如果统一存储分区级访问权限可满足您的需求,我们建议您将此更简单的系统用于您创建的任何新存储分区。虽然您可以将现有存储分区转换为使用统一存储分区级访问权限,但这可能需要对应用保护其存储对象访问安全的方式进行重大更改。

代码示例:

开始迁移之前

了解 Cloud Storage 权限

默认情况下,应用的默认服务帐号对您项目中的存储分区具有读写权限,并且对迁移之前和之后创建的对象具有完整权限。

如果您使用其他服务帐号或用户帐号来保护对 Cloud Storage 存储分区和对象的访问权限,请务必在迁移前后继续使用相同的帐号和身份验证技术

迁移过程概览

要迁移 Python 应用以使用 Cloud Storage 的 Cloud 客户端库而不是 App Engine 客户端库,请执行以下操作:

  1. 安装 Cloud Storage 的 Cloud 客户端库。

  2. 更新代码以使用 Cloud 客户端库。

  3. 测试您的更新。

  4. 将应用部署到 App Engine。

安装 Cloud Storage 的 Cloud 客户端库

要使 Cloud Storage 的 Cloud 客户端库在应用在 App Engine 中运行时可供应用使用,请执行以下操作:

  1. app.yaml 文件所在的文件夹中创建 requirements.txt 文件,并添加以下行:

     google-cloud-storage==1.24.1
    

    我们建议您使用 Cloud Storage 客户端库 1.24.1 版,因为它支持 Python 2.7 应用。

  2. 在应用的 app.yaml 文件的 libraries 部分中指定所需的 Google RPC 和 setuptools 库以及可选 SSL 库:

    libraries:
    - name: grpcio
      version: 1.0.0
    - name: setuptools
      version: 36.6.0
    - name: ssl
      version: latest
    

    某些客户端库不需要 SSL 库。如果您没有为需要 SSL 库的客户端库添加 SSL 库,当您的应用收到请求时,您会在日志浏览器中看到 SSL 错误。

  3. 创建一个用于存储第三方库的目录,如 lib/。然后使用 pip install 将库安装到该目录中。 例如:

      pip install -t lib -r requirements.txt
      

  4. app.yaml 文件所在的文件夹中创建 appengine_config.py 文件。将以下内容添加到 appengine_config.py 文件:

    # appengine_config.py
    import pkg_resources
    from google.appengine.ext import vendor
    
    # Set path to your libraries folder.
    path = 'lib'
    # Add libraries installed in the path folder.
    vendor.add(path)
    # Add libraries to pkg_resources working set to find the distribution.
    pkg_resources.working_set.add_entry(path)
    

    上例中的 appengine_config.py 文件假定 lib 文件夹位于当前工作目录中。如果您无法保证 lib 始终位于当前工作目录中,请指定 lib 文件夹的完整路径。例如:

    import os
    path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'lib')
    

对于本地开发,我们建议您在虚拟环境(如 Python 2 的 virtualenv)中安装依赖项。

更新代码以使用 Cloud 客户端库

创建 Cloud Storage 客户端

要使用 Cloud Storage 的 Cloud 客户端库,请创建一个 Client 对象。客户端包含连接到 Cloud Storage 所需的凭据和其他数据。例如:

from google.cloud import storage

client = storage.Client()

之前所述的默认授权场景中,Cloud Storage 客户端包含 App Engine 默认服务帐号中的凭据,该帐号有权与您的项目的存储分区和对象进行交互。如果您未使用此默认场景,请参阅应用默认凭据 (ADC),了解如何提供凭据。

使用 Cloud 客户端库方法

下表总结了 Cloud 客户端库中在实现特定 Cloud Storage 功能时使用的方法。

Cloud Storage 功能 Cloud 客户端方法
列出存储分区中的对象 Client.list_blobs

请参阅简单代码示例模拟目录模式示例。

要将对象列表分页,请使用 Client.list_blobs 返回的迭代器对象的 pages 属性。

写入存储空间 blob.upload_from_file
blob.upload_from_filename
blob.upload_from_string

请参阅代码示例

指定 ACL 要应用预定义 ACL,请在创建存储分区创建对象时使用 predefined_acl 参数。

要实现更精细的控制,请使用 bucket.acl.reload()blob.acl.reload() 检索当前定义的任何 ACL。然后使用 ACL 方法添加或移除 ACL。请参阅代码示例

从存储空间读取 blob.download_to_file
blob.download_to_filename
blob.download_as_string

请参阅代码示例

删除对象 blob.delete

请参阅代码示例

复制对象 bucket.copy_blob

请参阅代码示例

读取对象的元数据 blob.propertyname

blob.metadata

请参阅代码示例

测试更新

您可以在本地环境中测试应用的更新,但所有 Cloud Storage 请求都必须通过互联网发送到实际的 Cloud Storage 存储分区。App Engine 和 Cloud Storage 都不提供 Cloud Storage 模拟器。

如需详细了解如何测试 Python 2 应用,请参阅使用本地开发服务器

如需详细了解如何测试 Python 3 应用,请参阅测试和部署应用

部署应用

准备好部署应用后,您应该执行以下操作:

  1. 在 App Engine 上测试应用

  2. 如果应用运行正常(没有错误),请使用流量拆分功能为更新后的应用缓慢增加流量。请先仔细监控应用是否存在任何问题,然后再将更多流量路由到更新后的应用。