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

1. 概要

この一連の Codelab(セルフペース型のハンズオン チュートリアル)は、デベロッパーがアプリケーションをデプロイする際のさまざまなオプションを理解できるようにすることを目的としています。この Codelab では、Google Cloud Translation API を Python で使用し、ローカルで実行する方法と、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、またはクラウドベースのデプロイ向けに有効なクラウド サーバーレス コンピューティング プラットフォーム
  • 基本的な Python スキル
  • 基本的なオペレーティング システム コマンドに関する実用的な知識がある

アンケート

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

<ph type="x-smartling-placeholder"></ph> 内容を読んで演習を済ませる 読み取り専用 をご覧ください。

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

初心者 中級者 上級者

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

<ph type="x-smartling-placeholder"></ph> 初心者 中級 上達 をご覧ください。

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 にかかわらず、それらを有効にする必要があります。次の例は、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 コンソールで [API Manager] に移動し、[ライブラリ] を選択します。

fb0f1d315f122d4a.png

Cloud Vision API を有効にするには、「vision」と入力しますと入力すると、これまでに入力した内容に一致するすべてのものが表示されます。

2275786a24f8f204.png

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

2556f923b628e31.png

費用

多くの Google API は料金なしで使用できますが、Google Cloud プロダクトとAPI は無料ではありません。Cloud APIs を有効にするときに、有効な請求先アカウントを求められることがあります。ただし、一部の Google Cloud プロダクトには「無料枠」ティア(日単位/月単位)で、請求料金が発生するためには超過する必要がある同意していない場合、クレジット カード(または指定したお支払い方法)への請求は行われません。

有効にする前に、API の料金情報を参照する必要があります。特に、無料枠があるかどうかと、ある場合はその内容を確認してください。Cloud Vision API を有効にする場合は、料金情報ページを確認します。Cloud Vision には無料割り当てがあり、合計(1 か月以内)の上限を超えない限り、料金は発生しません。

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

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

概要

Google API の一般的な有効化方法を理解したところで、API Manager に移動して Cloud Translation API、Cloud Run、Cloud Artifact Registry を有効にします(まだ有効にしていない場合)。前者は、このアプリケーションで使用するため、有効にします。後者を有効にするのは、Cloud Run サービスを起動するためにデプロイされる前にコンテナ イメージが保存される場所であるためです。Cloud Run サービスを有効にする必要があるのはこのためです。gcloud ツールでこれらをすべて有効にする場合は、ターミナルから次のコマンドを実行します。

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

毎月の割り当ては、「Always Free」全体のティアの概要ページ: 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 アプリ、Cloud プロジェクト ID、Translation API クライアント、親の「ロケーション パス」を表すTranslation API 呼び出しの 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 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 を含む URL からアプリにアクセスできるようになります。

169f6edf5f7d2068.png

翻訳して確認してみましょう。

31554e71cb80f1b4.png

7. まとめ

これで、ここでは、Cloud Translation API を有効にして必要な認証情報を取得し、シンプルなウェブアプリを Python 2 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 に保存されます。そのイメージのストレージと、そのイメージをサービスに転送する際の下り(外向き)ネットワークは、割り当ての一部を使用します。ただし、このような無料枠がない地域に住んでいる可能性もあるため、潜在的な費用を最小限に抑えるためにストレージの使用量に注意してください。

8. 参考情報

以下のセクションでは、このチュートリアルを完了することで得た知識を補強するためのその他の参考資料やおすすめの演習を提供しています。

その他の学習

Translation API の操作に慣れてきたところで、さらに演習を行い、スキルをさらに磨きましょう。学習プログラムを続行するには、サンプルアプリを次のように変更してください。

  1. ローカルで実行する場合、または Google Cloud サーバーレス コンピューティング プラットフォームにデプロイする場合に、この Codelab の他のすべてのエディションを完了します(リポジトリの README をご覧ください)。
  2. 別のプログラミング言語を使用して、このチュートリアルを完了します。
  3. 別のソース言語またはターゲット言語をサポートするようにこのアプリケーションを変更します。
  4. このアプリケーションをアップグレードすると、テキストを複数の言語に翻訳できます。テンプレート ファイルを変更して、サポートされているターゲット言語のプルダウンを含めます。

詳細

Google Apps Engine

Google Cloud Functions

Google Cloud Run

Google Cloud Buildpack、Container Registry、Artifact Registry

Google Cloud Translation と Google ML Kit

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

Python と Flask

ライセンス

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