部署基本 ";Google 翻譯"Python 2 Cloud Run 上的應用程式 (Docker)

1. 總覽

這個系列的程式碼研究室 (循序漸進的實作教學課程) 旨在協助開發人員瞭解部署應用程式時有哪些不同的選項。在本程式碼研究室中,您將瞭解如何使用 Python 搭配 Google Cloud Translation API,並在本機執行或部署至 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)

本程式碼研究室著重於將應用程式部署至上述粗體的平台。

你將瞭解如何

軟硬體需求

問卷調查

您會如何使用這個教學課程?

閱讀並完成練習 唯讀

您對 Python 的使用體驗有何評價?

新手 中級 還算容易

針對使用 Google Cloud 服務的經驗,您會給予什麼評價?

新手 中級 還算容易

2. 設定和需求

自修環境設定

  1. 登入 Google Cloud 控制台,建立新專案或重複使用現有專案。如果您還沒有 Gmail 或 Google Workspace 帳戶,請先建立帳戶

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

  • 「專案名稱」是這項專案參與者的顯示名稱。這是 Google API 不使用的字元字串,您可以隨時更新。
  • 所有 Google Cloud 專案的專案 ID 均不得重複,且設定後即無法變更。Cloud 控制台會自動產生一個不重複的字串。但通常是在乎它何在在大部分的程式碼研究室中,您必須參照專案 ID (通常稱為 PROJECT_ID),因此如果您不喜歡的話,請隨機產生一個,或者,您也可以自行嘗試看看是否可用。是「凍結」建立專案後
  • 還有第三個值,也就是部分 API 使用的專案編號。如要進一步瞭解這三個值,請參閱說明文件
  1. 接下來,您需要在 Cloud 控制台中啟用計費功能,才能使用 Cloud 資源/API。執行這個程式碼研究室並不會產生任何費用,如果有的話。如要關閉資源,以免產生本教學課程結束後產生的費用,請按照任「清除所用資源」操作請參閱本程式碼研究室結尾處的操作說明。Google Cloud 的新使用者符合 $300 美元免費試用計畫的資格。

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 的定價資訊,特別是是否提供免費方案,以及 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 指令),或從綠色的「Code」按鈕下載 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 應用程式、Cloud 專案 ID、Translation API 用戶端、父項「位置路徑」,以及原文和譯文語言。在本例中為英文 (en) 和西班牙文 (es),但您可以將這些值變更為 Cloud Translation API 支援的其他語言
  3. 底部的大型 if 區塊用於在本機執行這個應用程式的教學課程中,會運用 Flask 開發伺服器來提供應用程式。本節內容也包含 Cloud Run 部署作業教學課程,以免網路伺服器未併入容器中。系統會要求您啟用容器中的伺服器組合功能,但如果您忽略這種情況,應用程式程式碼會改回使用 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 要求物件傳送,而其他所有 (在本機執行或部署至 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、取得必要憑證,以及將簡單的網頁應用程式部署至 Python 2 Cloud Run!如要進一步瞭解這個部署作業,請參閱存放區中的這個表格

清除所用資源

Cloud Translation API 可讓您每月免費處理固定數量的翻譯字元。App Engine 也提供免費配額Cloud FunctionsCloud Run 也是如此。超過上述任一額度時,就必須支付費用。如果您打算繼續下一個程式碼研究室,則不必關閉應用程式。

但是,如果您還沒準備好進行下一個教學課程,或擔心網際網路發現您剛剛部署的應用程式,請停用 App Engine 應用程式刪除 Cloud 函式停用 Cloud Run 服務,以免產生費用。當您準備好前往下一個程式碼研究室時,即可重新啟用。另一方面,如果您不打算繼續使用這個應用程式或其他程式碼研究室,且想要徹底刪除所有內容,可以關閉專案

此外,部署至 Google Cloud 無伺服器運算平台會產生少許建構和儲存空間費用Cloud Build 提供的免費配額與 Cloud Storage 相同。為提升資訊透明度,Cloud Build 會建構應用程式映像檔,並將映像檔儲存在其後續的 Cloud Container RegistryArtifact Registry 中。這個映像檔的儲存空間會佔用部分配額,如同網路輸出圖片傳輸至服務一般。不過,您可能居住的區域沒有這類免費方案,因此請留意儲存空間用量,盡可能降低潛在費用。

8. 其他資源

以下各節提供其他閱讀素材和推薦練習,有助您增強完成本教學課程後獲得的知識。

其他研究

您已經瞭解過 Translation API 的經驗,現在讓我們進行一些額外的練習,進一步培養您的技能。如要繼續學習路徑,請修改範例應用程式,執行下列操作:

  1. 完成本程式碼研究室的所有其他版本,以便在本機執行或部署至 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 ML 套件

其他 Google Cloud 產品/頁面

Python 和 Flask

授權

本教學課程採用的是創用 CC 姓名標示 2.0 通用授權,而存放區中的原始碼是依據 Apache 2 授權。