Workflows コールバックの概要
Google Cloud Japan Team
※この投稿は米国時間 2021 年 10 月 2 日に、Google Cloud blog に投稿されたものの抄訳です。
Workflows を使用すると、デベロッパーは Google Cloud や サードパーティ API でさまざまなサービスを簡単にオーケストレートできます。Workflows のコネクタは、Google Cloud サービスの長時間実行オペレーションを完了まで処理します。また、Workflows は組み込みの sys.sleep 関数を使用して、計算が終了するかイベントが発生するまで実行を待機することもできます。
しかし、自動テキスト翻訳の検証など、ワークフローの実行中にユーザー入力や承認が必要な場合はどうすればよいでしょうか。または、商品の在庫が補充されたことを納品センターや在庫システムなどの外部システムが通知する場合はどうでしょうか。「スリープ」命令と API ポーリングを組み合わせる代わりに、今後はWorkflows コールバックを使用できるようになりました。
コールバックを使用すると、特定のコールバック エンドポイントへの呼び出しを受信するまでワークフローの実行が待機されます。具体的な例で見てみましょう。
ケーススタディ: 自動翻訳の人間による検証
それでは具体例を見ていきましょう。機械学習ベースの翻訳の品質は驚くべきレベルに達してはいるものの、時には生成された訳文を人間に検証させたい場合もあるでしょう。Workflows コールバックにより、人または自律システムをループに追加できます。
このケーススタディを説明するために、プロセス全体の可能な実装を示す図をご紹介します。
まず、ユーザーは翻訳ウェブページにアクセスします。翻訳するテキストをテキストエリアに入力し、翻訳ボタンをクリックします。
ボタンをクリックすると、Cloud Functions の関数が呼び出され、ワークフローの実行が開始されます。翻訳するテキストは、関数のパラメータとして渡され、ワークフローのパラメータとしても渡されます。
テキストは Cloud Firestore に保存され、Translation API が入力テキストとともに呼び出され、訳文が返されます。訳文も Firestore に保存されます。Firebase SDK により、訳文はウェブページにリアルタイムで表示されます。
ワークフローのステップでコールバック エンドポイント(Firestore に保存されます)が作成され、デベロッパーは自動翻訳を認証または拒否するために呼び出すことができるようになります。コールバック エンドポイントが Firestore に保存されると、ウェブページに認証ボタンと拒否ボタンが表示されます。
ワークフローは、コールバック エンドポイントが呼び出されるまで明示的に待機します。これにより、ワークフローの実行が一時停止します。
ユーザーは訳文を認証するか拒否するかを決定します。この 2 つのボタンのいずれかをクリックすると、承認ステータスをパラメータとして Cloud Functions の関数が呼び出されます。これにより、ワークフローによって作成されたコールバック エンドポイントが呼び出され、承認ステータスも渡されます。ワークフローで実行が再開され、承認が Firestore に保存されます。これでワークフローは終了です。
コールバックを作成し、着信を待機する
次の 2 つの新しい組み込み関数が標準の Workflows ライブラリに導入されました。
events.create_callback_endpoint - コールバック エンドポイントを作成、設定
events.await_callback - コールバック エンドポイントが呼び出されるまで待機
events.create_callback_endpoint では、コールバック エンドポイントの呼び出しに使う HTTP メソッドを指定すると、そのエンドポイントの URL を含むディクショナリを取得し、他のシステムに渡すことができます。また、events.await_callback では、待機するコールバック エンドポイントを渡し、待機時間を定義するタイムアウトを渡します。エンドポイントが呼び出されると、エンドポイントに送信された本文にアクセスできます。
この 2 つの新しい関数を適用するワークフローの YAML 定義を見てみましょう。まず、コールバックを作成します。
- create_callback:
call: events.create_callback_endpoint
args:
http_callback_method: "POST"
result: callback_details
これで、コールバック エンドポイントは POST HTTP メソッドを介して受信リクエストを受信できるようになりました。そのエンドポイントの詳細は callback_details ディクショナリに保存されます(特に、url キーはエンドポイントの URL に関連付けられます)。
次に、ワークフローを一時停止し、コールバックを待機します。
- await_callback:
call: events.await_callback
args:
callback: ${callback_details}
timeout: 3600
result: callback_request
callback_details は引数として渡され、コールバックが行われるまで待機する秒単位のタイムアウトも渡されます。呼び出しが受信されると、リクエストのすべての詳細が callback_request ディクショナリに保存されます。これで、ヘッダーや本文を含む完全な HTTP リクエストにアクセスできます。タイムアウトに達した場合、TimeoutError が発生し、try / except ブロックでキャッチできます。
さらなる掘り下げとコールバック
上記の例を詳しく調べる場合、このワークフローの全コードを Workflows サンプルの GitHub リポジトリで確認できます。また、このチュートリアルの詳細に従い、このワークフローを独自のプロジェクトに複製できます。これは今のところプレビュー版機能ですので、お試しになりたい方は、この機能へのアクセスをリクエストしてください。
コールバックについて詳しくは、こちらのドキュメントをご覧ください。上記の例をさらに掘り下げて詳しく確認したい場合は、この翻訳検証サンプルの GitHub リポジトリをチェックしてみてください。この機能についてのご意見や、ご自身のワークフローでの実際の活用方法などを、ぜひ Twitter で @glaforge までお聞かせください。
- デベロッパー アドボケイト Guillaume Laforge