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 功能,例如读取、写入、移除和列出对象。迁移应该只需对代码进行细微更改。
差异:
在 App Engine 库中,检索对象列表的函数异步运行。Cloud 客户端库不提供用于列出对象的异步函数,但您可以使用分页并迭代一组少量对象。
App Engine 客户端库要求您使用访问控制列表 (ACL) 来控制对存储分区和对象的访问。但是,Cloud Storage 和 Cloud 客户端库支持两个系统,这两个系统可用于向用户授予访问您的存储分区和对象的权限:ACL 和统一存储分区级访问权限。统一存储分区级访问权限为您的所有 Cloud 资源提供更简单、一致的访问权限控制体验。
迁移到 Cloud 客户端库后,您与 App Engine 客户端库一起使用的所有 ACL 仍然对现有存储分区有效,并且您可以根据需要继续使用 ACL。
如果统一存储分区级访问权限可满足您的需求,我们建议您将此更简单的系统用于您创建的任何新存储分区。虽然您可以将现有存储分区转换为使用统一存储分区级访问权限,但这可能需要对应用保护其存储对象访问安全的方式进行重大更改。
代码示例:
使用 App Engine API 的基本存储操作
开始迁移之前
如果尚未设置,请设置 Python 开发环境以使用与 Google Cloud 兼容的 Python 版本,并安装用于创建独立 Python 环境的测试工具。
了解 Cloud Storage 权限
默认情况下,应用的自动创建默认服务账号对您项目中的存储桶具有读写权限,并且对迁移之前和之后创建的对象具有完整权限。
如果您使用其他服务账号或用户账号来保护对 Cloud Storage 存储分区和对象的访问权限,请务必在迁移前后继续使用相同的账号和身份验证技术。
迁移过程概览
要迁移 Python 应用以使用 Cloud Storage 的 Cloud 客户端库而不是 App Engine 客户端库,请执行以下操作:
安装 Cloud Storage 的 Cloud 客户端库
要使 Cloud Storage 的 Cloud 客户端库在应用在 App Engine 中运行时可供应用使用,请执行以下操作:
更新
app.yaml
文件。- 如果您使用 Cloud 客户端库,请添加最新版本的
grpcio
和setuptools
库。 - 添加
ssl
库,因为 Cloud Storage 要求这样做。
下面是一个
app.yaml
文件示例:runtime: python27 threadsafe: yes api_version: 1 libraries: - name: grpcio version: 1.0.0 - name: setuptools version: 36.6.0 - name: ssl version: latest
某些客户端库不需要 SSL 库。如果您没有为需要 SSL 库的客户端库添加 SSL 库,当您的应用收到请求时,您会在日志浏览器中看到 SSL 错误。
- 如果您使用 Cloud 客户端库,请添加最新版本的
通过将 Cloud Storage 的 Cloud 客户端库添加到依赖项列表中来更新
requirements.txt
文件:google-cloud-storage==1.24.1
我们建议您使用 Cloud Storage 客户端库 1.24.1 版,因为它支持 Python 2.7 应用。
然后,运行
pip install -t lib -r requirements.txt
以更新应用的可用库列表。对于 Python 2 应用,如果您的应用使用内置库或复制的库,则必须在
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')
更新代码以使用 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
要将对象列表分页,请使用 |
写入存储空间 | blob.upload_from_file
blob.upload_from_filename
blob.upload_from_string
请参阅代码示例。 |
指定 ACL | 要应用预定义 ACL,请在创建存储分区或创建对象时使用 predefined_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 应用,请参阅测试和部署应用。
部署应用
准备好部署应用后,您应该执行以下操作:
如果应用运行正常(没有错误),请使用流量拆分功能为更新后的应用缓慢增加流量。请先仔细监控应用是否存在任何问题,然后再将更多流量路由到更新后的应用。