このチュートリアルでは、入力(ループ内の人間)を待機し、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 データベースに保存します。
次の図では、プロセスの概要を示します。
最初の 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 functions のインターフェースを使用して関数をデプロイすることもできます。
関数がデプロイされたら、
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 functions のインターフェースを使用して関数をデプロイすることもできます。
関数がデプロイされたら、
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次のコマンドを実行して
firebasenpm パッケージをインストールし、package.jsonファイルに保存します。npm install 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 コールバックを使用する人間参加型翻訳ワークフローが作成されました。