部署基本的“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 Buildpack 使用 Python 3)

此 Codelab 重点介绍如何将此应用部署到上述加粗的平台。

您将了解如何

所需条件

调查问卷

您打算如何使用本教程?

阅读并完成练习 仅阅读

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

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

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

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

2. 设置和要求

自定进度的环境设置

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

96a9c957bc475304.png

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,都必须先启用相应 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.png

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

2556f923b628e31.png

费用

虽然许多 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.png

现在,您已准备好一切,请创建该文件夹的完整副本以完成本教程,因为本教程可能涉及删除或更改文件。如果您想进行其他部署,可以复制原始部署,这样就无需再次克隆或下载。

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 应用、云项目 ID、Translation API 客户端、Translation API 调用的父“位置路径”,以及源语言和目标语言。在本例中,这些值是英语 (en) 和西班牙语 (es),但您可以随意将这些值更改为 Cloud Translation API 支持的其他语言代码。
  3. 底部的 if 大块代码用于本教程中的在本地运行此应用,它利用 Flask 开发服务器来提供我们的应用。此部分还用于 Cloud Run 部署教程,以防 Web 服务器未捆绑到容器中。系统会要求您启用将服务器捆绑到容器中,但如果您忽略了这一点,应用代码会回退到使用 Flask 开发服务器。(App Engine 或 Cloud Functions 不存在此问题,因为它们是基于源代码的平台,这意味着 Google Cloud 提供并运行默认的网络服务器。)

最后,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 Request 对象,而所有其他对象(在本地运行或部署到 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.png

翻译一些内容,看看效果如何!

31554e71cb80f1b4.png

7. 总结

恭喜!您已了解如何启用 Cloud Translation API、获取必要的凭据,以及将简单的 Web 应用部署到 Python 2 Cloud Run!您可以点击代码库中的此表格,详细了解此部署。

清理

借助 Cloud Translation API,您可以每月免费翻译一定数量的字符。App Engine 也有免费配额Cloud FunctionsCloud Run 也是如此。如果超出任一限制,您都需要付费。如果您打算继续学习下一个 Codelab,则无需关闭应用。

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

此外,部署到 Google Cloud 无服务器计算平台会产生少量构建和存储费用Cloud BuildCloud Storage 都有各自的免费配额。为了提高透明度,Cloud Build 会构建您的应用映像,然后将其存储在 Cloud Container Registry 或其后继产品 Artifact Registry 中。存储该映像会占用部分配额,将该映像传输到服务时产生的网络出站流量也会占用部分配额。不过,您居住的地区可能没有此类免费层级,因此请注意存储空间用量,以尽可能减少潜在费用。

8. 其他资源

在以下部分中,您可以找到其他读物以及推荐的练习,以巩固您通过完成本教程获得的知识。

其他研究

现在,您已经积累了一些 Translation API 使用经验,接下来让我们做一些额外的练习,进一步提升您的技能。如需继续学习路线,请修改我们的示例应用,以实现以下功能:

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

了解详情

Google App Engine

Google Cloud Functions

Google Cloud Run

Google Cloud Buildpacks、Container Registry、Artifact Registry

Google Cloud Translation 和 Google 机器学习套件

其他 Google Cloud 产品/网页

Python 和 Flask

许可

本教程已获得知识共享署名 2.0 通用许可授权,而相应代码库中的源代码已获得 Apache 2 许可授权。