このチュートリアルでは、入力(ループ内の人間)を待機し、Firestore データベース、2 つの Cloud Run 関数、Cloud Translation API、Firebase SDK を使用してリアルタイムに更新するウェブページを接続する翻訳ワークフローを作成する方法について説明します。
ワークフローを使用すると、そのエンドポイントに HTTP リクエストが到達するのを待って、ワークフローの実行を後で再開するコールバック エンドポイント(Webhook)をサポートできます。このチュートリアルでは、ワークフローはテキストの翻訳を拒否または認める入力を待機しますが、外部プロセスを待機することもできます。詳しくは、コールバックを使用して待機するをご覧ください。
アーキテクチャ
このチュートリアルでは、次のことを行えるウェブアプリを作成します。
- 翻訳ウェブページで、英語からフランス語に翻訳するテキストを入力し、[翻訳] をクリックします。
- ウェブページから、ワークフローの実行を開始する Cloud Run 関数が呼び出されます。翻訳対象のテキストは、関数とワークフローの両方にパラメータとして渡されます。
- テキストは Cloud Firestore データベースに保存されます。Cloud Translation API が呼び出されます。返された翻訳がデータベースに保存されます。このウェブアプリは、Firebase Hosting を使用してデプロイされ、翻訳されたテキストを表示するためにリアルタイムで更新されます。
- ワークフローの
create_callback
ステップは、コールバック エンドポイント URL を作成します。この URL も Firestore データベースに保存されます。ウェブページに、[検証] ボタンと [拒否] ボタンの両方が表示されるようになりました。 - ワークフローは一時停止し、コールバック エンドポイント URL に対する明示的な HTTP POST リクエストを待機します。
- 翻訳を認めるか拒否するかを決定できます。ボタンをクリックすると、第二の Cloud Run 関数を呼び出し、これによりワークフローで作成されたコールバック エンドポイントが呼び出され、承認ステータスが渡されます。ワークフローが実行を再開し、承認ステータスの
true
またはfalse
を Firestore データベースに保存します。
次の図では、プロセスの概要を示します。
目標
- ウェブアプリをデプロイする。
- 翻訳リクエストを格納する Firestore データベースを作成する。
- Cloud Run 関数をデプロイしてワークフローを実行する
- ワークフローをデプロイして実行し、プロセス全体をオーケストレートする。
費用
このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
始める前に
組織で定義されているセキュリティの制約により、次の手順を完了できない場合があります。トラブルシューティング情報については、制約のある Google Cloud 環境でアプリケーションを開発するをご覧ください。
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the App Engine, Cloud Build, Cloud Run functions, Firestore, Translation, and Workflows APIs:
gcloud services enable appengine.googleapis.com
cloudbuild.googleapis.com cloudfunctions.googleapis.com firestore.googleapis.com translate.googleapis.com workflows.googleapis.com - Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the App Engine, Cloud Build, Cloud Run functions, Firestore, Translation, and Workflows APIs:
gcloud services enable appengine.googleapis.com
cloudbuild.googleapis.com cloudfunctions.googleapis.com firestore.googleapis.com translate.googleapis.com workflows.googleapis.com - Google Cloud CLI のコンポーネントを更新します。
gcloud components update
- アカウントを使用してログインします。
gcloud auth login
- このチュートリアルで使用するプロジェクト ID とデフォルトのロケーションを設定します。
export GOOGLE_CLOUD_PROJECT=PROJECT_ID export REGION=REGION gcloud config set workflows/location ${REGION}
以下を置き換えます。
最初の Cloud Run 関数をデプロイする
この Cloud Run 関数は、ワークフローの実行を開始します。翻訳対象のテキストは、関数とワークフローの両方にパラメータとして渡されます。
callback-translation
という名前のディレクトリを作成し、さらにinvokeTranslationWorkflow
、translationCallbackCall
、public
という名前のサブディレクトリを作成します。mkdir -p ~/callback-translation/{invokeTranslationWorkflow,translationCallbackCall,public}
invokeTranslationWorkflow
ディレクトリに移動します。cd ~/callback-translation/invokeTranslationWorkflow
次の Node.js コードを含むテキスト ファイルを
index.js
という名前で作成します。次の
npm
メタデータを含むテキスト ファイルをpackage.json
という名前で作成します。HTTP トリガーを含む関数をデプロイし、未認証アクセスを許可します。
gcloud functions deploy invokeTranslationWorkflow \ --region=${REGION} \ --runtime nodejs14 \ --entry-point=invokeTranslationWorkflow \ --set-env-vars PROJECT_ID=${GOOGLE_CLOUD_PROJECT},CLOUD_REGION=${REGION},WORKFLOW_NAME=translation_validation \ --trigger-http \ --allow-unauthenticated
関数のデプロイには数分かかる場合があります。また、Google Cloud コンソールで Cloud Run 関数のインターフェースを使用して関数をデプロイできます。
関数がデプロイされたら、
httpsTrigger.url
プロパティを確認できます。gcloud functions describe invokeTranslationWorkflow
後のステップで使用できるように、この URL をメモします。
第二の Cloud Run 関数をデプロイする
この Cloud Run 関数は、ワークフローによって作成されたコールバック エンドポイントに HTTP POST リクエストを行い、翻訳が検証されたか拒否されたかを示す承認ステータスを渡します。
translationCallbackCall
ディレクトリに移動します。cd ../translationCallbackCall
次の Node.js コードを含むテキスト ファイルを
index.js
という名前で作成します。次の
npm
メタデータを含むテキスト ファイルをpackage.json
という名前で作成します。HTTP トリガーを含む関数をデプロイし、未認証アクセスを許可します。
gcloud functions deploy translationCallbackCall \ --region=${REGION} \ --runtime nodejs14 \ --entry-point=translationCallbackCall \ --trigger-http \ --allow-unauthenticated
関数のデプロイには数分かかる場合があります。また、Google Cloud コンソールで Cloud Run 関数のインターフェースを使用して関数をデプロイできます。
関数がデプロイされたら、
httpsTrigger.url
プロパティを確認できます。gcloud functions describe translationCallbackCall
後のステップで使用できるように、この URL をメモします。
ワークフローをデプロイする
ワークフローは、ワークフロー構文で記述された一連のステップで構成され、YAML 形式または JSON 形式のいずれでも記述できます。これがワークフローの定義です。ワークフローを作成したら、デプロイして実行できるようにします。
callback-translation
ディレクトリに移動します。cd ..
次の内容のテキスト ファイルを
translation-validation.yaml
という名前で作成します。ワークフローを作成したらデプロイできますが、そのワークフローは実行しないでください。
gcloud workflows deploy translation_validation --source=translation-validation.yaml
ウェブアプリを作成する
ワークフローの実行を開始する Cloud Functions の関数を呼び出すウェブアプリを作成します。ウェブページはリアルタイムで更新され、翻訳リクエストの結果が表示されます。
public
ディレクトリに移動します。cd public
次の HTML マークアップを含むテキスト ファイルを
index.html
という名前で作成します。(後のステップで、index.html
ファイルを変更して、Firebase SDK スクリプトを追加します)。次の JavaScript コードを含むテキスト ファイルを
script.js
という名前で作成します。script.js
ファイルを編集して、UPDATE_ME
プレースホルダをメモした Cloud Run 関数の URL に置き換えます。translateBtn.addEventListener
メソッドで、const fnUrl = UPDATE_ME;
を次の内容に置き換えます。const fnUrl = "https://REGION-PROJECT_ID.cloudfunctions.net/invokeTranslationWorkflow";
callCallbackUrl
関数で、const fnUrl = UPDATE_ME;
を次の内容に置き換えます。const fnUrl = "https://REGION-PROJECT_ID.cloudfunctions.net/translationCallbackCall";
次のカスケーディング スタイルを含むテキスト ファイルを、
style.css
という名前で作成します。
ウェブアプリに Firebase を追加
このチュートリアルでは、Firebase Hosting を使用して HTML ページ、JavaScript スクリプト、CSS スタイルシートを静的アセットとしてデプロイしますが、テスト用には任意のマシンでローカルにホストできます。
Firebase プロジェクトを作成する
アプリに Firebase を追加する前に、アプリに接続する Firebase プロジェクトを作成します。
-
Firebase コンソールで [プロジェクトを作成] をクリックし、プルダウン メニューから既存の Google Cloud プロジェクトを選択して、Firebase リソースをそのプロジェクトに追加します。
-
Firebase を追加するオプションが表示されるまで、[続行] をクリックします。
-
プロジェクトに対する Google アナリティクスの設定はスキップします。
-
[Firebase を追加] をクリックします。
Firebase プロジェクトのリソースが自動的にプロビジョニングされます。処理が完了すると、Firebase コンソールにプロジェクトの概要ページが表示されます。
アプリを Firebase に登録する
Firebase プロジェクトを作成したら、プロジェクトにウェブアプリを追加できます。
プロジェクトの概要ページの中央で、[ウェブ] アイコン(</>)をクリックして設定ワークフローを起動します。
アプリのニックネームを入力します。
これは Firebase コンソールにのみ表示されます。
ひとまず、Firebase Hosting の設定はスキップします。
[アプリを登録] をクリックしてコンソールに進みます。
Cloud Firestore の有効化
このウェブアプリは Cloud Firestore を使用してデータを受信して保存します。Cloud Firestore を有効にする必要があります。
Firebase コンソールの [構築] セクションで、[Firestore データベース] をクリックします
(先に左側のナビゲーション ペインを展開して [構築] セクションを表示しなければならない場合があります)。
Cloud Firestore ペインで、[データベースの作成] をクリックします。
次のようなセキュリティ ルールを使用して、[テストモードで開始] を選択します。
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow read, write; } } }
セキュリティ ルールに関する免責条項を確認してから、[次へ] をクリックします。
Cloud Firestore データを保存するロケーションを設定します。 デフォルトをそのまま使用することも、近くのリージョンを選択することもできます。
[有効にする] をクリックして Firestore をプロビジョニングします。
Firebase SDK を追加して Firebase を初期化する
Firebase は、ほとんどの Firebase プロダクトに対応する JavaScript ライブラリを提供しています。Firebase Hosting を使用する前に、Firebase SDK をウェブアプリに追加する必要があります。
- アプリで Firebase を初期化するには、アプリの Firebase プロジェクト構成を提供する必要があります。
- Firebase コンソールで、[プロジェクトの設定]( )に移動します。
- [マイアプリ] ペインでアプリを選択します。
- [SDK の設定と構成] ペインで、CDN から Firebase SDK ライブラリを読み込むために、[CDN] を選択します。
index.html
ファイルの<body>
タグの末尾にこのスニペットをコピーし、XXXX
プレースホルダ値を置き換えます。
Firebase JavaScript SDK をインストールします。
package.json
ファイルがない場合は、callback-translation
ディレクトリから次のコマンドを実行して作成します。npm init
次のコマンドを実行して
firebase
npm パッケージをインストールし、package.json
ファイルに保存します。npm install --save firebase
プロジェクトを初期化してデプロイする
ローカル プロジェクト ファイルを Firebase プロジェクトに接続するには、プロジェクトを初期化する必要があります。その後、ウェブアプリをデプロイできます。
任意の
callback-translation
ディレクトリから次のコマンドを実行します。firebase init
[
Configure files for Firebase Hosting and (optionally) set up GitHub Action deploys
] の設定を選択します。既存のプロジェクトを使用することを選択し、プロジェクト ID を入力します。
デフォルトの公開ルート ディレクトリとして
public
を受け入れます。単一ページのアプリの構成を行います。
GitHub を使用して自動ビルドとデプロイの設定をスキップする。
「
File public/index.html already exists. Overwrite?
」のメッセージには、「No」と入力します。public
ディレクトリに移動します。cd public
public
ディレクトリから、次のコマンドを実行してプロジェクトをサイトにデプロイします。firebase deploy --only hosting
ウェブアプリをローカルでテストする
Firebase Hosting を使用すると、変更をローカルで確認およびテストし、エミュレートされたバックエンド プロジェクトを操作できるようになります。firebase serve
を使用する場合、アプリはホストするコンテンツと構成をエミュレートしたバックエンドとやり取りしますが、他のすべてのプロジェクト リソースについては実際のバックエンドを使用します。このチュートリアルでは、firebase serve
を使用できますが、より広範囲のテストを行う場合はおすすめしません。
任意の
public
ディレクトリから次のコマンドを実行します。firebase serve
返されたローカル URL(通常は
http://localhost:5000
)でウェブアプリを開きます。英語のテキストを入力し、[Translate] をクリックします。
フランス語の翻訳テキストが表示されます。
ここで、[Validate] または [Reject] をクリックします。
Firestore データベースで、コンテンツを確認できます。次のようになります。
approved: true callback: "https://workflowexecutions.googleapis.com/v1/projects/26811016474/locations/us-central1/workflows/translation_validation/executions/68bfce75-5f62-445f-9cd5-eda23e6fa693/callbacks/72851c97-6bb2-45e3-9816-1e3dcc610662_1a16697f-6d90-478d-9736-33190bbe222b" text: "The quick brown fox jumps over the lazy dog." translation: "Le renard brun rapide saute par-dessus le chien paresseux."
approved
ステータスは、翻訳を認めるか拒否するかによって、true
またはfalse
になります。
これで完了です。Workflows コールバックを使用する人間参加型翻訳ワークフローが作成されました。
クリーンアップ
このチュートリアル用に新規プロジェクトを作成した場合は、そのプロジェクトを削除します。既存のプロジェクトを使用し、このチュートリアルで変更を加えずに残す場合は、チュートリアル用に作成したリソースを削除します。
プロジェクトを削除する
課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。
プロジェクトを削除するには:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
チュートリアル リソースの削除
チュートリアルの設定時に追加した gcloud CLI のデフォルト構成を削除します。
gcloud config unset workflows/location
このチュートリアルで作成したワークフローを削除します。
gcloud workflows delete WORKFLOW_NAME
このチュートリアルで作成した Cloud Run 関数を削除します。
gcloud functions delete FUNCTION_NAME
Google Cloud コンソールから Cloud Run 関数を削除することもできます。