1. 概要
この一連の Codelab(ご自分のペースで進められる実践型のチュートリアル)は、アプリケーションのデプロイ時に利用できるさまざまなオプションをデベロッパーが理解できるよう支援することを目的としています。この Codelab では、Python で Google Cloud Translation API を使用し、ローカルで実行するか、Cloud サーバーレス コンピューティング プラットフォーム(App Engine、Cloud Functions、Cloud Run)にデプロイする方法を学びます。このチュートリアルのリポジトリにあるサンプルアプリは、構成を少し変更するだけで、少なくとも 8 つの異なる方法でデプロイできます。
- ローカル Flask サーバー(Python 2)
- ローカル Flask サーバー(Python 3)
- App Engine(Python 2)
- App Engine(Python 3)
- Cloud Functions(Python 3)
- Cloud Run(Docker 経由の Python 2)
- Cloud Run(Docker 経由の Python 3)
- Cloud Run(Cloud Buildpacks 経由の Python 3)
この Codelab では、上記の太字のプラットフォームにこのアプリをデプロイすることに焦点を当てます。
方法を学ぶ対象
- Google Cloud API(特に Cloud Translation API(高度/v3))を使用する
- 基本的なウェブ アプリケーションをローカルで実行するか、クラウド サーバーレス コンピューティング プラットフォームにデプロイする
必要なもの
- 有効な Cloud 請求先アカウントが設定された Google Cloud プロジェクト
- ローカルで実行するためにインストールされた Flask、またはクラウドベースのデプロイ用に有効化された Cloud サーバーレス コンピューティング プラットフォーム
- 基本的な Python スキル
- 基本的なオペレーティング システム コマンドに関する実務知識
アンケート
このチュートリアルの利用方法をお選びください。
Python のご利用経験はどの程度ありますか?
Google Cloud サービスの使用経験はどの程度ありますか?
2. 設定と要件
セルフペース型の環境設定
- Google Cloud コンソール にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。



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

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

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

費用
多くの 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 Functions サービスの両方を有効にします(まだ有効にしていない場合)。後者はアプリケーションで使用するため、前者は Cloud Functions をデプロイするためです。コマンドラインから実行する場合は、次のコマンドを発行します。
gcloud services enable cloudfunctions.googleapis.com translate.googleapis.com
月間割り当ては 「常時無料」階層の概要ページには記載されていませんが、Translation API の料金ページには、すべてのユーザーに毎月一定量の変換された文字が提供されると記載されています。このしきい値を下回っていれば、API から料金が請求されることはありません。Google Cloud 関連のその他の料金については、最後に「クリーンアップ」セクションで説明します。
4. サンプルアプリのコードを取得する
リポジトリのコードをローカルまたは Cloud Shell にクローンするか(git clone コマンドを使用)、次のスクリーンショットに示すように、緑色の [Code] ボタンから ZIP ファイルをダウンロードします。

すべて揃ったら、このチュートリアル専用のフォルダの完全なコピーを作成します。このチュートリアルでは、ファイルの削除や変更が必要になる可能性が高いためです。別のデプロイを行う場合は、元のコピーを作成して最初からやり直すことができます。これにより、再度クローンを作成したりダウンロードしたりする必要がなくなります。
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)))
- インポートにより、Flask の機能、
google.authモジュール、Cloud Translation API クライアント ライブラリが取り込まれます。 - グローバル変数は、Flask アプリ、クラウド プロジェクト ID、Translation API クライアント、Translation API 呼び出しの親「ロケーション パス」、ソース言語とターゲット言語を表します。この例では、英語(
en)とスペイン語(es)を使用していますが、これらの値は Cloud Translation API でサポートされている他の言語コードに変更できます。 - 下部の大きな
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 を呼び出して重い処理を行う役割を果たします。詳しく見ていきましょう。
local_request変数を使用して、リクエストが Cloud Functions から送信されているかどうかを確認します。Cloud Functions は独自の Flask リクエスト オブジェクトを送信しますが、他のすべて(ローカルで実行するか、App Engine または Cloud Run にデプロイする)は Flask から直接リクエスト オブジェクトを取得します。- フォームの基本変数をリセットします。これは主に GET リクエスト用です。POST リクエストには、これらの値を置き換えるデータが含まれます。
- POST の場合は、翻訳するテキストを取得し、API メタデータの要件を表す JSON 構造を作成します。次に、API を呼び出します。ユーザーが古いライブラリを使用している場合は、API の以前のバージョンにフォールバックします。
- いずれにしても、実際の結果(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)Cloud Functions にデプロイするには、次のコマンドを実行します。
gcloud functions deploy translate --runtime python37 --trigger-http --allow-unauthenticated
出力は次のようになり、次のステップのプロンプトが表示されます。
$ gcloud functions deploy translate --runtime python37 --trigger-http --allow-unauthenticated Deploying function (may take a while - up to 2 minutes)...⠹ For Cloud Build Stackdriver Logs, visit: https://console.cloud.google.com/logs/viewer?project=PROJECT_ID&advancedFilter=resource.type%3Dbuild%0Aresource.labels.build_id%3D7e32429d-ec36-422c-8a8b-43c4d661a15c%0AlogName%3Dprojects%2FPROJECT_ID%2Flogs%2Fcloudbuild Deploying function (may take a while - up to 2 minutes)...done. availableMemoryMb: 256 buildId: 7e32429d-ec36-422c-8a8b-43c4d661a15 entryPoint: translate httpsTrigger: securityLevel: SECURE_OPTIONAL url: https://REGION-PROJECT_ID.cloudfunctions.net/translate ingressSettings: ALLOW_ALL labels: deployment-tool: cli-gcloud name: projects/PROJECT_ID/locations/REGION/functions/translate runtime: python37 serviceAccountEmail: PROJECT_ID@appspot.gserviceaccount.com sourceUploadUrl: https://storage.googleapis.com/gcf-upload-REGION-873f8448-838f-4eb2-beda-3e200a1420d/cb1cbdca-34eb-41d0-88d6-c276d5205fb.zip?GoogleAccessId=service-104690130103@gcf-admin-robot.iam.gserviceaccount.com&Expires=1619139674 status: ACTIVE timeout: 60s updateTime: '2021-04-23T00:32:58.065Z' versionId: '3'
アプリが世界中で利用可能になったので、デプロイ出力に示されているように、プロジェクト ID を含む URL でアプリにアクセスできるようになります。URL は https://REGION-PROJECT_ID.cloudfunctions.net/translate のようになります。これは、選択したリージョンと Cloud プロジェクト ID によって異なります。

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

7. まとめ
おめでとうございます!Cloud Translation API を有効にする方法、必要な認証情報を取得する方法、シンプルなウェブアプリを Cloud Functions にデプロイする方法を学びました。このデプロイの詳細については、リポジトリのこの表をご覧ください。
クリーンアップ
Cloud Translation API を使用すると、毎月一定量の翻訳文字を無料で実行できます。App Engine には無料割り当てがあり、Cloud Functions と Cloud 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 の経験を積んだので、スキルをさらに高めるための追加の演習を行いましょう。学習プログラムを続けるには、サンプルアプリを変更して次のことを行います。
- ローカルで実行するか、Google Cloud サーバーレス コンピューティング プラットフォームにデプロイするには、この Codelab の他のエディションをすべて完了してください(リポジトリの README をご覧ください)。
- 別のプログラミング言語を使用してこのチュートリアルを完了します。
- このアプリケーションを変更して、別のソース言語またはターゲット言語をサポートします。
- このアプリケーションをアップグレードして、テキストを複数の言語に翻訳できるようにします。テンプレート ファイルを変更して、サポートされているターゲット言語のプルダウンを表示します。
詳細
Google Apps Engine
- App Engine のホームページ
- App Engine のドキュメント
- Python 3 App Engine クイックスタート
- App Engine のデフォルトのサービス アカウント
- Python 2 App Engine(スタンダード)ランタイム
- Python 3 App Engine(スタンダード)ランタイム
- Python 2 と 3 の App Engine(スタンダード)ランタイムの違い
- Python 2 から 3 への App Engine(スタンダード)移行ガイド
Google Cloud Functions
- Cloud Functions のホームページ
- Cloud Functions のドキュメント
- Python Cloud Functions クイックスタート
- Cloud Functions のデフォルトのサービス アカウント
Google Cloud Run
Google Cloud Buildpacks、Container Registry、Artifact Registry
- Cloud Buildpacks のお知らせ
- Cloud Buildpacks リポジトリ
- Cloud Artifact Registry のホームページ
- Cloud Artifact Registry のドキュメント
- Cloud Container Registry のホームページ
- Cloud Container Registry のドキュメント
Google Cloud Translation と Google ML Kit
- Cloud Translation のホームページ
- Cloud Translation ドキュメント
- Translation API の料金ページ
- すべての Cloud AI/ML「ビルディング ブロック」API
- Google ML Kit(モバイル向けの Cloud AI/ML API のサブセット)
- Google ML Kit Translation API
その他の Google Cloud プロダクト/ページ
- Google Cloud Python サポート
- Google Cloud クライアント ライブラリ
- Google Cloud の「常時無料」枠
- Google Cloud に関するすべてのドキュメント
Python と Flask
ライセンス
このチュートリアルはクリエイティブ・コモンズの表示 2.0 汎用ライセンスにより使用許諾されています。一方、リポジトリ内のソースコードは Apache 2 により使用許諾されています。