基本的な「Google 翻訳」をデプロイするPython 3 Cloud Run 上のアプリ(Docker)

1. 概要

この一連の Codelab(ご自分のペースで進められる実践型のチュートリアル)は、アプリケーションのデプロイ時に利用できるさまざまなオプションをデベロッパーが理解できるよう支援することを目的としています。この Codelab では、Python で Google Cloud Translation API を使用し、ローカルで実行するか、Cloud サーバーレス コンピューティング プラットフォーム(App Engine、Cloud Functions、Cloud Run)にデプロイする方法を学びます。このチュートリアルのリポジトリにあるサンプルアプリは、構成を少し変更するだけで、少なくとも 8 つの異なる方法でデプロイできます。

  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 では、上記の太字のプラットフォームにこのアプリをデプロイする方法について説明します。

方法を学ぶ対象

必要なもの

  • 有効な Cloud 請求先アカウントが設定された Google Cloud プロジェクト
  • ローカルで実行するためにインストールされた Flask、またはクラウドベースのデプロイ用に有効化された Cloud サーバーレス コンピューティング プラットフォーム
  • 基本的な Python スキル
  • 基本的なオペレーティング システム コマンドに関する実務知識

アンケート

このチュートリアルの利用方法をお選びください。

内容を読んで演習をやり遂げる 内容を読むだけ

Python のご利用経験はどの程度ありますか?

初心者 中級者 上級者

Google Cloud サービスの使用経験はどの程度ありますか?

初心者 中級者 上級者

2. 設定と要件

セルフペース型の環境設定

  1. Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

  • プロジェクト名は、このプロジェクトの参加者に表示される名称です。Google API では使用されない文字列で、いつでも更新できます。
  • プロジェクト ID は、すべての Google Cloud プロジェクトにおいて一意でなければならず、不変です(設定後は変更できません)。Cloud Console により一意の文字列が自動生成されます(通常は内容を意識する必要はありません)。ほとんどの Codelab では、プロジェクト ID を参照する必要があります(通常、プロジェクト ID は「PROJECT_ID」の形式です)。好みの文字列でない場合は、別のランダムな ID を生成するか、独自の ID を試用して利用可能であるかどうかを確認することができます。プロジェクトの作成後、ID は「フリーズ」されます。
  • 3 つ目の値として、一部の API が使用するプロジェクト番号があります。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
  1. 次に、Cloud のリソースや API を使用するために、Cloud Console で課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルを終了した後に課金が発生しないようにリソースをシャットダウンするには、Codelab の最後にある「クリーンアップ」の手順を行います。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。

3. Translation API を有効にする

Cloud APIs を有効にする

このセクションでは、Google API を全般的に有効にする方法について説明します。サンプルアプリでは、Cloud Translation APICloud RunCloud Artifact Registry を有効にします。

はじめに

アプリケーションで使用する Google API に関係なく、API は有効にする必要があります。次の例は、Cloud Vision API を有効にする 2 つの方法を示しています。1 つの Cloud API を有効にする方法を理解すれば、他の API も同様の手順で有効にできます。

オプション 1: Cloud Shell またはコマンドライン インターフェースから

Cloud コンソールから API を有効にするのが一般的ですが、コマンドラインからすべてを実行することを好むデベロッパーもいます。これを行うには、API の「サービス名」を調べる必要があります。URL のような形式(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

1 回のリクエストで複数の API を有効にすることもできます。たとえば、次のコマンドラインは、Cloud Run、Cloud Artifact Registry、Cloud Translation API を有効にします。

gcloud services enable artifactregistry.googleapis.com run.googleapis.com translate.googleapis.com

オプション 2: Cloud コンソールから

API Manager で Vision API を有効にすることもできます。Cloud Console から API Manager に移動し、[ライブラリ] を選択します。

fb0f1d315f122d4a.png

Cloud Vision API を有効にする場合は、検索バーに「vision」と入力します。入力した内容に一致するものが表示されます。

2275786a24f8f204.png

有効にする API を選択し、[有効にする] をクリックします。

2556f923b628e31.png

費用

多くの Google API は無料でご利用いただけますが、Google Cloud のプロダクトと API の使用は無料ではありません。Cloud APIs を有効にすると、有効な請求先アカウントの入力を求められる場合があります。ただし、一部の Google Cloud プロダクトには、超過した場合のみに料金が発生する Always Free 枠(日単位/月単位)が用意されています。この枠を超えない限り、クレジット カード(または指定されたお支払い方法)に請求されることはありません。

API を有効にする前に、料金情報を確認してください。特に、無料枠があるかどうか、ある場合はどのようなものかを確認してください。Cloud Vision API を有効にする場合は、料金情報ページを確認します。Cloud Vision には無料の割り当てがあり、使用量の合計が上限(月ごと)を超えない限り、料金は発生しません。

料金と無料枠は Google API によって異なります。例:

  • Google Cloud/GCP - 各プロダクトの課金方法は異なり、通常は vCPU サイクル、ストレージ コンシューマー、メモリ使用量、従量課金制で課金されます。上記の無料枠の情報をご覧ください。
  • Google マップ - 一連の API を備え、ユーザーに $200 USD の無料枠を毎月提供します。
  • Google Workspace(旧称 G Suite)API - Workspace の月額サブスクリプション料金でカバーされる無料の使用(一定の上限まで)を提供します。そのため、Gmail、Google ドライブ、カレンダー、ドキュメント、スプレッドシート、スライドの API の使用に伴う直接的な料金が発生することはありません。

Google プロダクトごとに課金方法が異なるため、API ドキュメントで該当する情報を確認してください

概要

Google API を有効にする方法を理解したら、API Manager に移動して、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 クライアント、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. Python 3 イメージをビルドするように Docker を設定します。

Dockerfile ファイルを開きます。ライセンス情報がないため、次のようになっています。

#FROM python:3-slim
FROM python:2-slim
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
ENTRYPOINT ["python", "main.py"]

ご覧のとおり、デフォルトでは Python 2 用に設定されているため、FROM 行を python:2-slim から python:3-slim に編集するか、先頭行のコメントを解除して古い FROM 行を削除して、これを変更しましょう。完了すると、Dockerfile は次のようになります。

FROM python:3-slim
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
ENTRYPOINT ["python", "main.py"]

7. サービスをデプロイする

これで、次のコマンドを実行して、翻訳サービスを 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 を含む URL でアプリにアクセスできるようになります。

169f6edf5f7d2068.png

何かを翻訳して、動作を確認してみましょう。

31554e71cb80f1b4.png

8. まとめ

おめでとうございます!Cloud Translation API を有効にする方法、必要な認証情報を取得する方法、シンプルなウェブアプリを Python 3 Cloud Run にデプロイする方法を学びました。

クリーンアップ

Cloud Translation API を使用すると、毎月一定量の翻訳文字を無料で実行できます。App Engine には無料割り当てがあり、Cloud FunctionsCloud Run にも同様の割り当てがあります。いずれかを超えると、料金が発生します。次の Codelab に進む予定がある場合は、アプリをシャットダウンする必要はありません。

ただし、次のチュートリアルに進む準備がまだ完了していない場合や、デプロイしたばかりのアプリがインターネットに公開されることを懸念している場合は、App Engine アプリを無効にするCloud Functions を削除する、または Cloud Run サービスを無効にすることで、課金されないようにできます。次の Codelab に進む準備ができた時点で、再度有効にできます。ただし、このアプリケーションや他の Codelab を続行せず、すべてを完全に削除する場合は、プロジェクトをシャットダウンしてください。

また、Google Cloud サーバーレス コンピューティング プラットフォームにデプロイすると、ビルドとストレージの費用がわずかに発生しますCloud Build には独自の無料割り当てがあり、Cloud Storage にも独自の無料割り当てがあります。透明性を高めるため、Cloud Build はアプリケーション イメージをビルドし、そのイメージは Cloud Container Registry または後継の Artifact Registry に保存されます。そのイメージの保存には、その割り当ての一部が使用されます。また、そのイメージをサービスに転送する際の下りネットワークにも、その割り当ての一部が使用されます。ただし、お住まいの地域でこのような無料枠が提供されていない可能性もあります。そのため、保存容量の使用状況を把握して、費用を最小限に抑えるようにしてください。

9. 参考情報

次のセクションでは、このチュートリアルを完了して得た知識を補完するための追加の資料と推奨される演習を紹介します。

追加の学習

Translation API の経験を積んだので、スキルをさらに高めるための追加の演習を行いましょう。学習を続けるには、サンプルアプリを変更して次のことを行います。

  1. ローカルで実行するか、Google Cloud サーバーレス コンピューティング プラットフォームにデプロイするには、この Codelab の他のエディションをすべて完了してください(リポジトリの 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 Kit

その他の Google Cloud プロダクト/ページ

Python と Flask

ライセンス

このチュートリアルはクリエイティブ・コモンズの表示 2.0 汎用ライセンスにより使用許諾されていますが、リポジトリ内のソースコードは Apache 2 により使用許諾されています。