1. 概览
本系列 Codelab(自定进度的实操教程)旨在帮助开发者了解在部署应用时可以选择的各种方案。在此 Codelab 中,您将学习如何将 Google Cloud Translation API 与 Python 搭配使用,以及如何在本地运行或部署到 Cloud 无服务器计算平台(App Engine、Cloud Functions 或 Cloud Run)。只需对配置稍做更改,本教程的代码库中的示例应用就可以(至少)通过八种不同方式进行部署:
- 本地 Flask 服务器 (Python 2)
- 本地 Flask 服务器 (Python 3)
- App Engine (Python 2)
- App Engine (Python 3)
- Cloud Functions (Python 3)
- Cloud Run(通过 Docker 安装 Python 2)
- Cloud Run(通过 Docker 使用 Python 3)
- Cloud Run(通过 Cloud Buildpacks 使用 Python 3)
此 Codelab 将重点介绍如何将该应用部署到上述以粗体显示的平台。
您将了解如何
- 使用 Google Cloud API,特别是 Cloud Translation API(高级/v3)
- 在本地运行基本 Web 应用或部署到云无服务器计算平台
所需条件
- 具有有效的 Cloud Billing 账号的 Google Cloud 项目
- 安装 Flask 以在本地运行,或安装支持云端部署的云无服务器计算平台
- 基本 Python 技能
- 具备基本操作系统命令的应用知识
调查问卷
您打算如何使用本教程?
<ph type="x-smartling-placeholder">您如何评价使用 Python 的体验?
您如何评价自己在使用 Google Cloud 服务方面的经验水平?
<ph type="x-smartling-placeholder">2. 设置和要求
自定进度的环境设置
- 登录 Google Cloud 控制台,然后创建一个新项目或重复使用现有项目。如果您还没有 Gmail 或 Google Workspace 账号,则必须创建一个。
- 项目名称是此项目参与者的显示名称。它是 Google API 尚未使用的字符串,您可以随时对其进行更新。
- 项目 ID 在所有 Google Cloud 项目中必须是唯一的,并且不可变(一经设置便无法更改)。Cloud Console 会自动生成一个唯一字符串;通常情况下,您无需关注该字符串。在大多数 Codelab 中,您都需要引用项目 ID(它通常标识为
PROJECT_ID
),因此如果您不喜欢某个 ID,请再生成一个随机 ID,还可以尝试自己创建一个,并确认是否可用。然后,项目创建后,ID 会处于“冻结”状态。 - 第三个值是一些 API 使用的项目编号。如需详细了解所有这三个值,请参阅文档。
- 接下来,您需要在 Cloud Console 中启用结算功能,才能使用 Cloud 资源/API。运行此 Codelab 应该不会产生太多的费用(如果有费用的话)。要关闭资源以避免产生超出本教程范围的费用,请按照此 Codelab 末尾提供的任何“清理”说明操作。Google Cloud 的新用户符合参与 $300 USD 免费试用计划的条件。
3. 启用 Translation API
启用 Cloud API
在本部分,您将总体了解如何启用 Google API。对于我们的示例应用,您将启用 Cloud Translation API、Cloud Run 和 Cloud Artifact Registry。
简介
无论您要在应用中使用哪个 Google API,都必须启用它们。以下示例展示了启用 Cloud Vision API 的两种方法。在学习如何启用一个 Cloud API 之后,您将能够启用其他 API,因为过程是类似的。
方法 1:通过 Cloud Shell 或命令行界面
虽然通过 Cloud 控制台启用 API 更为常见,但有些开发者更喜欢通过命令行完成所有操作。为此,您需要查询 API 的“服务名称”。它看起来像一个网址:SERVICE_NAME
.googleapis.com
。您可以在“支持的产品”图表中找到相关信息,也可以使用 Google Discovery API 以编程方式进行查询。
有了这些信息,您就可以使用 Cloud Shell(或安装了 gcloud
命令行工具的本地开发环境)启用 API,如下所示:
gcloud services enable SERVICE_NAME.googleapis.com
例如,以下命令会启用 Cloud Vision API:
gcloud services enable vision.googleapis.com
此命令可启用 App Engine:
gcloud services enable appengine.googleapis.com
您还可以通过一个请求启用多个 API。例如,以下命令行启用了 Cloud Run、Cloud Artifact Registry 和 Cloud Translation API:
gcloud services enable artifactregistry.googleapis.com run.googleapis.com translate.googleapis.com
方法 2:通过 Cloud 控制台
您还可以在 API 管理器中启用 Vision API。在 Cloud 控制台中,前往 API 管理器,然后选择库。
如果您要启用 Cloud Vision API,请开始输入“vision”,系统就会显示与您输入的内容相匹配的内容:
选择您要启用的 API,然后点击启用:
费用
虽然许多 Google API 可以免费使用,但使用 Google Cloud 产品和API 并非免费的。启用 Cloud API 时,系统可能会要求您提供有效的结算账号。但请务必注意,某些 Google Cloud 产品提供“始终免费”层级(每日/每月),您必须超出此层级才能产生结算费用;否则,您的信用卡(或指定付款方式)就不会被扣款。
在启用之前,用户应参考任何 API 的价格信息,尤其要注意该 API 是否提供免费层级以及免费层级(如果有)。如果您要启用 Cloud Vision API,请查看其价格信息页面。Cloud Vision 有免费配额,只要您不超出其总配额(每个月),就不会产生任何费用。
定价和免费层级因 Google API 而异。示例:
- Google Cloud/GCP - 每种产品的结算方式都不同,通常按 vCPU 周期、存储使用方、内存用量或按用量付费;请参阅上文的免费层级信息。
- Google 地图 - 提供一整套 API,并向用户提供 $200 的每月免费赠金。
- Google Workspace(原 G Suite)API:提供由 Workspace 每月订阅费用支付的免费用量(不超过特定限额),因此我们不会直接对 Gmail、Google 云端硬盘、Google 日历、Google 文档、Google 表格和 Google 幻灯片 API 的使用进行结算。
不同的 Google 产品采用不同的结算方式,因此请务必参阅 API 的相关文档,以了解相关信息。
摘要
现在,您已大致了解如何启用 Google API,请转到 API 管理器并启用 Cloud Translation API、Cloud Run 和 Cloud Artifact Registry(如果您尚未启用)。您可以启用前者,因为我们的应用使用了它。您可以启用后者,因为在部署以启动 Cloud Run 服务之前,我们的容器映像将存储在那里,因此您必须启用该功能。如果您希望使用 gcloud
工具将其全部启用,请改为从终端发出以下命令:
gcloud services enable artifactregistry.googleapis.com run.googleapis.com translate.googleapis.com
虽然其每月配额并未列在总体“始终免费”中层级摘要页面中,Translation API 的价格页面显示所有用户都能获得固定数量的翻译后字符。如果您的 API 费用低于该阈值,则应该不会产生任何费用。如有任何其他 Google Cloud 相关费用,这些费用将在最后的“清理”部分讨论部分。
4. 获取示例应用代码
在本地代码库或 Cloud Shell 中克隆代码(使用 git clone
命令),或通过其绿色的代码按钮下载 ZIP 文件,如以下屏幕截图所示:
现在您已具备所有条件,请创建该文件夹的完整副本以执行此特定教程,因为这可能涉及删除或更改文件。如果您想执行其他部署,可以复制原始部署以重新开始,这样就不必重新克隆或下载它。
5. 示例应用导览
示例应用是一个简单的 Google 翻译衍生产品,可提示用户输入英文文本,然后收到该文本的西班牙语对应译文。现在,打开 main.py
文件,查看其工作原理。忽略有关许可的注释行,顶部和底部如下所示:
from flask import Flask, render_template, request
import google.auth
from google.cloud import translate
app = Flask(__name__)
_, PROJECT_ID = google.auth.default()
TRANSLATE = translate.TranslationServiceClient()
PARENT = 'projects/{}'.format(PROJECT_ID)
SOURCE, TARGET = ('en', 'English'), ('es', 'Spanish')
# . . . [translate() function definition] . . .
if __name__ == '__main__':
import os
app.run(debug=True, threaded=True, host='0.0.0.0',
port=int(os.environ.get('PORT', 8080)))
- 导入引入了 Flask 功能、
google.auth
模块和 Cloud Translation API 客户端库。 - 全局变量表示 Flask 应用、Cloud 项目 ID、Translation API 客户端和父级“位置路径”翻译 API 调用,以及源语言和目标语言。在本示例中,语言为英语 (
en
) 和西班牙语 (es
),但您可以随时将这些值更改为 Cloud Translation API 支持的其他语言代码。 - 在本地运行此应用的教程中使用底部的大
if
代码块,它利用 Flask 开发服务器为我们的应用提供支持。如果 Web 服务器未捆绑到容器中,则本部分也适用于 Cloud Run 部署教程。系统会要求您启用将服务器捆绑到容器中,但如果您忽略这一点,应用代码将回退到使用 Flask 开发服务器。(App Engine 或 Cloud Functions 没有问题,因为这些平台基于源代码,这意味着 Google Cloud 会提供并运行默认的 Web 服务器。)
最后,main.py
中间是应用的核心,即 translate()
函数:
@app.route('/', methods=['GET', 'POST'])
def translate(gcf_request=None):
"""
main handler - show form and possibly previous translation
"""
# Flask Request object passed in for Cloud Functions
# (use gcf_request for GCF but flask.request otherwise)
local_request = gcf_request if gcf_request else request
# reset all variables (GET)
text = translated = None
# if there is data to process (POST)
if local_request.method == 'POST':
text = local_request.form['text']
data = {
'contents': [text],
'parent': PARENT,
'target_language_code': TARGET[0],
}
# handle older call for backwards-compatibility
try:
rsp = TRANSLATE.translate_text(request=data)
except TypeError:
rsp = TRANSLATE.translate_text(**data)
translated = rsp.translations[0].translated_text
# create context & render template
context = {
'orig': {'text': text, 'lc': SOURCE},
'trans': {'text': translated, 'lc': TARGET},
}
return render_template('index.html', **context)
主要函数负责获取用户输入并调用 Translation API 来完成繁重的工作。我们来对其进行详细介绍:
- 使用
local_request
变量检查请求是否来自 Cloud Functions。Cloud Functions 函数在其自己的 Flask 请求对象中发送,而所有其他对象(在本地运行或者部署到 App Engine 或 Cloud Run)将直接从 Flask 获取请求对象。 - 重置表单的基本变量。这主要用于 GET 请求,因为 POST 请求将包含替代这些请求的数据。
- 如果是 POST,获取要翻译的文本,然后创建表示 API 元数据要求的 JSON 结构。然后调用 API,如果用户使用的是较旧的库,则回退到之前的 API 版本。
- 无论如何,将实际结果的格式 (POST) 或无数据 (GET) 的格式设置为模板上下文并呈现。
应用的可视部分位于模板 index.html
文件中。它会显示之前翻译过的所有结果(否则为空白),后跟要求翻译内容的表单:
<!doctype html>
<html><head><title>My Google Translate 1990s</title><body>
<h2>My Google Translate (1990s edition)</h2>
{% if trans['text'] %}
<h4>Previous translation</h4>
<li><b>Original</b>: {{ orig['text'] }} (<i>{{ orig['lc'][0] }}</i>)</li>
<li><b>Translated</b>: {{ trans['text'] }} (<i>{{ trans['lc'][0] }}</i>)</li>
{% endif %}
<h4>Enter <i>{{ orig['lc'][1] }}</i> text to translate to <i>{{ trans['lc'][1] }}</i>:</h4>
<form method="POST"><input name="text"><input type="submit"></form>
</body></html>
6. 部署服务
现在,您可以通过运行以下命令将翻译服务部署到 Cloud Run:
gcloud run deploy translate --source . --allow-unauthenticated --platform managed
输出应如下所示,并提供一些后续步骤提示:
$ gcloud run deploy translate --source . --allow-unauthenticated --platform managed Please specify a region: [1] asia-east1 [2] asia-east2 . . . (other regions) . . . [28] us-west4 [29] cancel Please enter your numeric choice: REGION_CHOICE To make this the default region, run `gcloud config set run/region REGION`. Deploying from source requires an Artifact Registry repository to store build artifacts. A repository named [cloud-run-source-deploy] in region [REGION] will be created. Do you want to continue (Y/n)? This command is equivalent to running "gcloud builds submit --pack image=[IMAGE] ." and "gcloud run deploy translate --image [IMAGE]" Building . . . and deploying container to Cloud Run service [translate] in project [PROJECT_ID] region [REGION] ✓ Building and deploying... Done. ✓ Creating Container Repository... ✓ Uploading sources... ✓ Building Container... Logs are available at [https://console.cloud.google.com/cloud-build/builds/60e1b 9bb-b991-4b4e-8d8a-HASH?project=PROJECT_NUMBER]. ✓ Creating Revision... ✓ Routing traffic... ✓ Setting IAM Policy... Done. Service [translate] revision [translate-00001-xyz] has been deployed and is serving 100 percent of traffic. Service URL: https://SVC_NAME-HASH-REG_ABBR.a.run.app
现在,您的应用已在全球范围内可用,您应该能够通过包含项目 ID 的网址访问该应用,如部署输出中所示:
翻译内容,看看它能否发挥作用!
7. 总结
恭喜!您学习了如何启用 Cloud Translation API、获取必要的凭据,以及将一个简单的 Web 应用部署到 Python 2 Cloud Run!如需详细了解此部署,请参阅代码库中的此表。
清理
借助 Cloud Translation API,您每月可以免费翻译固定数量的字符。App Engine 还有免费配额,Cloud Functions 和 Cloud Run 也是如此。如果超出上述任一设置,您将需要支付费用。如果您计划继续学习下一个 Codelab,则无需关闭应用。
不过,如果您尚未准备好学习下一个教程,或者担心互联网会发现您刚部署的应用,请停用 App Engine 应用、删除 Cloud Functions 函数或停用 Cloud Run 服务,以免产生费用。当您准备好继续学习下一个 Codelab 时,可以重新启用它。另一方面,如果您不打算继续学习此应用或其他 Codelab,而是想彻底删除所有内容,则可以关停项目。
此外,部署到 Google Cloud 无服务器计算平台会产生少量构建和存储费用。Cloud Build 和 Cloud Storage 都有自己的免费配额。为了提高透明度,Cloud Build 会构建您的应用映像,该映像随后会存储在 Cloud Container Registry 或 Artifact Registry(其后续版本)中。存储该映像会占用部分配额,以及在将该映像传输到服务时的网络出站流量。但是,如果您居住的区域没有这样的免费层级,请留意您的存储空间用量,以最大限度地降低潜在费用。
8. 其他资源
在以下部分中,您可以找到更多阅读材料和推荐的练习,扩充您完成本教程中学到的知识。
其他研究
现在,您已经掌握了 Translation API 的一些使用经验,接下来让我们做一些额外的练习来进一步培养您的技能。要继续您的学习路线,请修改我们的示例应用以执行以下操作:
- 完成此 Codelab 的所有其他版本,以在本地运行或部署到 Google Cloud 无服务器计算平台(请参阅 Repo 自述文件)。
- 使用其他编程语言完成本教程。
- 更改此应用以支持不同的源语言或目标语言。
- 升级此应用,以便将文本翻译成多种语言;更改模板文件,以提供支持的目标语言下拉列表。
了解详情
Google App Engine
- App Engine 首页
- App Engine 文档
- Python 3 App Engine 快速入门
- App Engine 的默认服务账号
- Python 2 App Engine(标准)运行时
- Python 3 App Engine(标准)运行时
- Python 2 与3 个 App Engine(标准)运行时
- Python 2 到 3 App Engine(标准)迁移指南
Google Cloud Functions
Google Cloud Run
Google Cloud Buildpack、Container Registry、Artifact Registry
- Cloud Buildpacks 公告
- Cloud Buildpack 代码库
- Cloud Artifact Registry 首页
- Cloud Artifact Registry 文档
- Cloud Container Registry 首页
- Cloud Container Registry 文档
Google Cloud Translation 和 Google 机器学习套件
- Cloud Translation 首页
- Cloud Translation 文档
- Translation API 价格页面
- 所有 Cloud AI/机器学习“基础组件”API
- Google 机器学习套件(适用于移动设备的 Cloud AI/机器学习 API 子集)
- Google 机器学习套件 Translation API
其他 Google Cloud 产品/页面
Python 和 Flask
许可
本教程依据知识共享署名 2.0 通用许可授权,而代码库中的源代码则根据 Apache 2 授权用户使用。