部署基本的“Google 翻译”。应用,在 Python 2 Cloud Run (Docker) 上运行

1. 概览

本系列 Codelab(自定进度的实操教程)旨在帮助开发者了解在部署应用时可以选择的各种方案。在此 Codelab 中,您将学习如何将 Google Cloud Translation API 与 Python 搭配使用,以及如何在本地运行或部署到 Cloud 无服务器计算平台(App Engine、Cloud Functions 或 Cloud Run)。只需对配置稍做更改,本教程的代码库中的示例应用就可以(至少)通过八种不同方式进行部署:

  1. 本地 Flask 服务器 (Python 2)
  2. 本地 Flask 服务器 (Python 3)
  3. App Engine (Python 2)
  4. App Engine (Python 3)
  5. Cloud Functions (Python 3)
  6. Cloud Run(通过 Docker 安装 Python 2)
  7. Cloud Run(通过 Docker 使用 Python 3)
  8. Cloud Run(通过 Cloud Buildpacks 使用 Python 3)

此 Codelab 将重点介绍如何将该应用部署到上述以粗体显示的平台。

您将了解如何

所需条件

调查问卷

您打算如何使用本教程?

<ph type="x-smartling-placeholder"></ph> 阅读并完成练习 只读

您如何评价使用 Python 的体验?

新手水平 中等水平 熟练水平

您如何评价自己在使用 Google Cloud 服务方面的经验水平?

<ph type="x-smartling-placeholder"></ph> 新手 中级 熟练

2. 设置和要求

自定进度的环境设置

  1. 登录 Google Cloud 控制台,然后创建一个新项目或重复使用现有项目。如果您还没有 Gmail 或 Google Workspace 账号,则必须创建一个

96a9c957bc475304

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

  • 项目名称是此项目参与者的显示名称。它是 Google API 尚未使用的字符串,您可以随时对其进行更新。
  • 项目 ID 在所有 Google Cloud 项目中必须是唯一的,并且不可变(一经设置便无法更改)。Cloud Console 会自动生成一个唯一字符串;通常情况下,您无需关注该字符串。在大多数 Codelab 中,您都需要引用项目 ID(它通常标识为 PROJECT_ID),因此如果您不喜欢某个 ID,请再生成一个随机 ID,还可以尝试自己创建一个,并确认是否可用。然后,项目创建后,ID 会处于“冻结”状态。
  • 第三个值是一些 API 使用的项目编号。如需详细了解所有这三个值,请参阅文档
  1. 接下来,您需要在 Cloud Console 中启用结算功能,才能使用 Cloud 资源/API。运行此 Codelab 应该不会产生太多的费用(如果有费用的话)。要关闭资源以避免产生超出本教程范围的费用,请按照此 Codelab 末尾提供的任何“清理”说明操作。Google Cloud 的新用户符合参与 $300 USD 免费试用计划的条件。

3. 启用 Translation API

启用 Cloud API

在本部分,您将总体了解如何启用 Google API。对于我们的示例应用,您将启用 Cloud Translation APICloud RunCloud 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 管理器,然后选择

fb0f1d315f122d4a.png

如果您要启用 Cloud Vision API,请开始输入“vision”,系统就会显示与您输入的内容相匹配的内容:

2275786a24f8f204

选择您要启用的 API,然后点击启用

2556f923b628e31

费用

虽然许多 Google API 可以免费使用,但使用 Google Cloud 产品和API 并非免费的。启用 Cloud API 时,系统可能会要求您提供有效的结算账号。但请务必注意,某些 Google Cloud 产品提供“始终免费”层级(每日/每月),您必须超出此层级才能产生结算费用;否则,您的信用卡(或指定付款方式)就不会被扣款。

在启用之前,用户应参考任何 API 的价格信息,尤其要注意该 API 是否提供免费层级以及免费层级(如果有)。如果您要启用 Cloud Vision API,请查看其价格信息页面。Cloud Vision 有免费配额,只要您不超出其总配额(每个月),就不会产生任何费用。

定价和免费层级因 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 文件,如以下屏幕截图所示:

5cd6110c4414cf65

现在您已具备所有条件,请创建该文件夹的完整副本以执行此特定教程,因为这可能涉及删除或更改文件。如果您想执行其他部署,可以复制原始部署以重新开始,这样就不必重新克隆或下载它。

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)))
  1. 导入引入了 Flask 功能、google.auth 模块和 Cloud Translation API 客户端库。
  2. 全局变量表示 Flask 应用、Cloud 项目 ID、Translation API 客户端和父级“位置路径”翻译 API 调用,以及源语言和目标语言。在本示例中,语言为英语 (en) 和西班牙语 (es),但您可以随时将这些值更改为 Cloud Translation API 支持的其他语言代码。
  3. 本地运行此应用的教程中使用底部的大 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 来完成繁重的工作。我们来对其进行详细介绍:

  1. 使用 local_request 变量检查请求是否来自 Cloud Functions。Cloud Functions 函数在其自己的 Flask 请求对象中发送,而所有其他对象(在本地运行或者部署到 App Engine 或 Cloud Run)将直接从 Flask 获取请求对象。
  2. 重置表单的基本变量。这主要用于 GET 请求,因为 POST 请求将包含替代这些请求的数据。
  3. 如果是 POST,获取要翻译的文本,然后创建表示 API 元数据要求的 JSON 结构。然后调用 API,如果用户使用的是较旧的库,则回退到之前的 API 版本。
  4. 无论如何,将实际结果的格式 (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 的网址访问该应用,如部署输出中所示:

169f6edf5f7d2068

翻译内容,看看它能否发挥作用!

31554e71cb80f1b4

7. 总结

恭喜!您学习了如何启用 Cloud Translation API、获取必要的凭据,以及将一个简单的 Web 应用部署到 Python 2 Cloud Run!如需详细了解此部署,请参阅代码库中的此表

清理

借助 Cloud Translation API,您每月可以免费翻译固定数量的字符。App Engine 还有免费配额Cloud FunctionsCloud Run 也是如此。如果超出上述任一设置,您将需要支付费用。如果您计划继续学习下一个 Codelab,则无需关闭应用。

不过,如果您尚未准备好学习下一个教程,或者担心互联网会发现您刚部署的应用,请停用 App Engine 应用删除 Cloud Functions 函数停用 Cloud Run 服务,以免产生费用。当您准备好继续学习下一个 Codelab 时,可以重新启用它。另一方面,如果您不打算继续学习此应用或其他 Codelab,而是想彻底删除所有内容,则可以关停项目

此外,部署到 Google Cloud 无服务器计算平台会产生少量构建和存储费用Cloud BuildCloud Storage 都有自己的免费配额。为了提高透明度,Cloud Build 会构建您的应用映像,该映像随后会存储在 Cloud Container RegistryArtifact Registry(其后续版本)中。存储该映像会占用部分配额,以及在将该映像传输到服务时的网络出站流量。但是,如果您居住的区域没有这样的免费层级,请留意您的存储空间用量,以最大限度地降低潜在费用。

8. 其他资源

在以下部分中,您可以找到更多阅读材料和推荐的练习,扩充您完成本教程中学到的知识。

其他研究

现在,您已经掌握了 Translation API 的一些使用经验,接下来让我们做一些额外的练习来进一步培养您的技能。要继续您的学习路线,请修改我们的示例应用以执行以下操作:

  1. 完成此 Codelab 的所有其他版本,以在本地运行或部署到 Google Cloud 无服务器计算平台(请参阅 Repo 自述文件)。
  2. 使用其他编程语言完成本教程。
  3. 更改此应用以支持不同的源语言或目标语言。
  4. 升级此应用,以便将文本翻译成多种语言;更改模板文件,以提供支持的目标语言下拉列表。

了解详情

Google App Engine

Google Cloud Functions

Google Cloud Run

Google Cloud Buildpack、Container Registry、Artifact Registry

Google Cloud Translation 和 Google 机器学习套件

其他 Google Cloud 产品/页面

Python 和 Flask

许可

本教程依据知识共享署名 2.0 通用许可授权,而代码库中的源代码则根据 Apache 2 授权用户使用。