Google Cloud 提供了一些单独的产品,其功能与 Python 2 运行时中的某些捆绑服务类似。对于在 Google Cloud 中不能作为单独产品提供的捆绑服务(如图片处理、搜索和消息传递),本指南会建议使用第三方提供商或使用其他解决方法。
本页面介绍了每项捆绑服务的迁移路径。
了解 Google Cloud 权限
由于您迁移的应用及其使用的 Google Cloud 服务不再在同一“沙盒”环境中运行,因此您的应用需要获得授权才能访问各项服务。例如,如需与 Datastore 模式的 Firestore (Datastore) 或 Cloud Tasks 进行交互,您的应用需要提供有权访问这些服务的帐号的凭据。
默认情况下,App Engine 标准运行时中的应用会提供 App Engine 默认服务帐号的凭据,该帐号有权访问该应用所在项目中的数据库。
如果满足以下任何条件,则您需要使用明确提供凭据的备用身份验证技术:
您的应用和 Memorystore 数据库位于不同的 Google Cloud 项目中。
您已更改分配给默认 App Engine 服务帐号的角色。
如需了解备用身份验证技术,请参阅为服务器到服务器的生产应用设置身份验证。
本地开发的身份验证
要在本地开发或测试您的应用,建议创建并使用服务帐号。请勿使用 App Engine 默认的服务帐号,因为它对您项目中的所有内容都有较高级别的权限。请创建并使用具有特定开发和测试任务所需的最低权限级别的服务帐户。
有关设置服务帐号并将其与应用关联的说明,请参阅手动获取和提供服务帐号凭据。
安装客户端库
从 Python 应用使用 Google Cloud 服务的最简单方法是安装该服务的 Python 客户端库。(Google Cloud 服务还提供 JSON REST 和其他接口。) 对于 Python 2 应用和 Python 3 应用,将客户端库安装到 App Engine 运行时的步骤有所不同。
为 Python 2 应用安装库
要安装应用在 Python 2 运行时中运行时要使用的库,请执行以下操作:
创建一个用于存储第三方库的目录,如
lib/
。在
app.yaml
文件所在的文件夹中创建requirements.txt
文件,并添加客户端库的名称。例如,以下文件可用于为 Pub/Sub 和 Cloud Tasks 安装库:
google-cloud-pubsub google-cloud-tasks
使用
pip install
将库安装到您创建的文件夹中。 例如:pip install -t lib -r requirements.txt
在应用的
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 错误。
如果您还没有
appengine_config.py
文件,请在app.yaml
文件所在的文件夹中创建此文件。将以下内容添加到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)
请务必使用
pkg_resources
模块,该模块确保您的应用会使用正确的客户端库发布版本。上例中的
appengine_config.py
文件假定lib
文件夹位于当前工作目录中。如果您无法保证lib
始终位于当前工作目录中,请指定lib
文件夹的完整路径。例如:import os path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'lib')
在您部署应用时,App Engine 会将您在 appengine_config.py
文件中指定的目录中的所有库上传到 Python 2。
为 Python 3 应用安装库
要安装应用在 Python 3 运行时中运行时要使用的库,请执行以下操作:
将库名称添加到应用的
requirements.txt
文件中。例如:google-cloud-ndb
部署应用。
App Engine 会自动将 requirements.txt
文件中列出的所有库上传到 Python 3 运行时。
App Engine 捆绑式服务的迁移路径
Blobstore
如需存储和检索数据,请通过 Google Cloud 客户端库使用 Cloud Storage。要开始使用,请参阅迁移至 Cloud 客户端库以进行存储。
数据存储区
如果 Python 2 应用使用 NDB 与 Datastore 进行交互,请迁移到 Cloud NDB 库。Cloud NDB 主要用作迁移 Python 2 应用的转换工具。我们建议 Python 3 应用使用 Datastore 模式客户端库。有关详情,请参阅:
图片
您可以从 Cloud Storage 传送图片,直接传送图片或使用第三方内容分发网络 (CDN)。
要调整图片大小、转换和处理图片,请使用图片处理库(如 Pillow)或 ImageMapick 的 Python 接口)。 要使用其中一个第三方库,请将库添加为依赖项并更新代码以调用该库的 API。
App Engine Images 服务还通过使用传送网址处理图片大小调整来避免向应用发出动态请求。如果您想实现类似功能,可以提前重新调整图片大小,并将其上传到 Cloud Storage 以供传送。或者,您也可以使用具有调整图片大小功能的第三方内容分发网络 (CDN) 服务。
日志记录
我们建议您更新应用以使用 Cloud Logging,它支持以下功能,例如在日志浏览器中查看日志、下载日志、按严重程度过滤消息以及将应用消息与特定请求相关联。或者,您可以通过编写包含 JSON 对象结构形式的特定数据的日志消息,来启用这些功能。
如需了解详情,请参阅迁移到 Cloud Logging。如需发送电子邮件,请使用第三方邮件提供程序,例如 SendGrid、Mailgun 或 Mailjet。所有这些服务都提供用于从应用发送电子邮件的 API。
Memcache
如果您的 Python 2 应用明确使用 Memcache,则我们建议使用 Memorystore for Redis 作为缓存服务。有关详情,请参阅将 Memcache 迁移到 Memorystore。模块
要获取信息并修改应用正在运行的服务,请结合使用环境变量和 App Engine Admin API:
服务信息 | 访问方式 |
---|---|
当前应用 ID | GAE_APPLICATION 环境变量 |
当前项目 ID | GOOGLE_CLOUD_PROJECT 环境变量 |
当前服务名称 | GAE_SERVICE 环境变量 |
当前服务版本 | GAE_VERSION 环境变量 |
当前实例 ID | GAE_INSTANCE 环境变量 |
默认主机名 | Admin API apps.get 方法 |
服务列表 | Admin API apps.services.list 方法 |
服务版本的列表 | Admin API apps.services.versions.list 方法 |
默认的服务版本,包括流量拆分设置(如果有) | Admin API apps.services.get 方法 |
正在运行的某版本实例的列表 | Admin API apps.services.versions.instances.list 方法 |
命名空间
借助 Namespaces API,多租户应用只需为每个租户指定唯一的命名空间字符串,即可跨租户划分数据。
Datastore 直接支持多租户,但其他 Google Cloud 服务不支持。如果您的多租户应用使用其他 Google Cloud 服务,则需要手动处理多租户。要实现完全隔离的服务实例,您可以使用 Cloud Resource Manager API 以编程方式创建新项目,并访问不同项目的资源。
OAuth
请使用 OAuth 2.0 API 的 oauth2.tokeninfo
方法,而不是使用 App Engine OAuth 服务来验证 OAuth 2.0 令牌。
搜索
您可以托管任何全文搜索数据库,例如 Compute Engine 上的 Elasticsearch,并通过您的服务访问该数据库。
任务队列
将拉取队列迁移到 Pub/Sub 并将推送队列迁移到 Cloud 任务。 如果应用同时使用拉取和推送队列,请先迁移拉取队列,以防止 Cloud Tasks 出现意外行为。有关执行这些迁移的详细信息,请参阅:
URL Fetch
默认情况下,Python 2.7 运行时使用 URL Fetch 服务处理出站 HTTP(S) 请求,即使您使用标准 Python 库发出这些请求也是如此。
如果应用直接使用 URL Fetch API(例如,发出异步请求),我们建议您迁移到 Requests 库等标准 Python 库。
如需了解详情,请参阅迁移出站请求。
用户身份验证
如需替代 Users API,请使用任何基于 HTTP 的身份验证机制,例如:
- OAuth 2.0 和 OpenID Connect,用于提供您所选提供商的联合身份服务。Google 是 OpenID Connect 身份提供商之一。您还可以在若干其他提供商之中进行选择。
- Firebase 身份验证,使用用户名/密码以及 Google、Facebook、Twitter 等联合身份服务进行身份验证。
- Google Identity Platform,提供诸多 Google 用户帐号身份验证和授权选项。
- Auth0,使用多个身份提供商和单点登录功能进行身份验证。