ワークフローで外部プロセスを待機する必要がある場合があります。HTTP コールバックを使用して、別のサービスがコールバック エンドポイントにリクエストを行うことを待ち、そのリクエストによってワークフローの実行を再開できます。ポーリングを使用して待機することもできます。
このチュートリアルでは、ポーリングを使用する代わりに、HTTP コールバックと Eventarc トリガーを使用してイベントまたは Pub/Sub メッセージを待機する方法について説明します。イベントまたは Pub/Sub メッセージでワークフローをトリガーすることもできますが、続行する前にその実行を停止して別のイベントを待つことをおすすめします。たとえば、イベントによってワークフローがトリガーされてプロセスが開始されますが、ワークフローはプロセスの完了を通知する別のイベントを待機する必要があります。これは、1 つのワークフローが別のワークフローをコールバックすることで実装できます。
目標
このチュートリアルでは、次のことを行います。
イベントを待機する必要があるプライマリ ワークフローがデプロイされ、実行されます。イベントが発生するまで待機する必要があるため、コールバックの詳細を Firestore データベースに保存し、セカンダリ ワークフローが詳細を取得できるようにします。その後、プライマリ ワークフローは HTTP 呼び出しを待機します。
セカンダリ ワークフローがイベントによってトリガーされ、イベントが生成されたときに Firestore データベースからコールバックの詳細を取得します。その後、セカンダリ ワークフローは、実行を再開するプライマリ ワークフローにコールバックします。
プロセス全体の概要は次のとおりです。
プライマリ ワークフロー:
callback-event-sample
ワークフローは、Pub/Sub トピックと Cloud Storage バケットの 2 つのイベントソースのコールバック エンドポイントを作成します。- このワークフローは、両方のコールバック エンドポイントを Firestore ドキュメントに保存します。
- このワークフローは実行を停止し、HTTP リクエストがコールバック エンドポイントに到達するまで待機します。
イベント:
- イベントが発生します。メッセージが Pub/Sub トピックにパブリッシュされ、ファイルが Cloud Storage バケットにアップロードされます。
セカンダリ ワークフロー:
- Eventarc はイベントを
callback-event-listener
ワークフローにルーティングし、その実行をトリガーします。 - このワークフローは、Firestore ドキュメントから適切なコールバック エンドポイント URL を取得します。
- このワークフローは、サンプル ワークフローの適切なエンドポイントに対するコールバックを実行します。
プライマリ ワークフロー:
callback-event-sample
ワークフローは、コールバック エンドポイントでイベントを受け取り、実行を再開します。- このワークフローは、Firestore ドキュメントからコールバック URL を削除し、実行を完了します。
費用
このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
始める前に
Google Cloud コンソールで次のコマンドを実行するか、ターミナルまたは Cloud Shell で Google Cloud CLI を使用できます。
組織で定義されているセキュリティの制約により、次の手順を完了できない場合があります。トラブルシューティング情報については、制約のある Google Cloud 環境でアプリケーションを開発するをご覧ください。
コンソール
Google Cloud コンソールのプロジェクト セレクタ ページで、Google Cloud プロジェクトを選択または作成します。
Google Cloud プロジェクトに対して課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。
App Engine、Eventarc、Firestore、Pub/Sub、Workflows API を有効にします。
他の Google Cloud サービスでの認証に使用するワークフローのサービス アカウントを作成し、適切なロールを付与します。
Google Cloud コンソールで、[サービス アカウント] ページに移動します。
[サービス アカウントの作成] ページに移動するには、プロジェクトを選択します。
[サービス アカウント名] フィールドに名前を入力します。Google Cloud コンソールでは、この名前に基づいて [サービス アカウント ID] フィールドの値が設定されます。
[サービス アカウントの説明] フィールドに説明を入力します。例:
Service account for tutorial
[作成して続行] をクリックします。
[ロールを選択] リストで、次のロールをフィルタして、前の手順で作成したユーザー管理のサービス アカウントに付与します。
- Cloud Datastore ユーザー: Datastore モード(Datastore)のデータで Firestore にアクセスします。
- Eventarc イベント受信者: イベント プロバイダからイベントを受信します。
- ログ書き込み: ログを書き込みます。
- ワークフロー起動元: ワークフローを実行し、実行内容を管理します。
ロールを追加するには、[
別のロールを追加] をクリックして各ロールを追加します。[続行] をクリックします。
アカウントの作成を完了するには、[完了] をクリックします。
Cloud Storage からイベントをルーティングする Eventarc トリガーを作成するには、Pub/Sub パブリッシャーのロールを Cloud Storage サービス エージェントに付与します。通常、これは
service-PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com
です。これにより、Cloud Storage サービス エージェントのメールアドレスを取得できます。Google Cloud コンソールの [IAM] ページに移動します。
Cloud Storage サービス エージェントの行で、
「プリンシパルを編集します」をクリックします(サービス エージェントがリストにない場合は、次のステップに進みます)。権限の編集ペインが開きます。- [add別のロールを追加] をクリックして、Pub/Sub パブリッシャーのロールを検索します。
- ロールを選択します。
- [保存] をクリックします。
サービス エージェントがリストにない場合は、[
アクセス権を付与] をクリックします。アクセス権の付与ペインが開きます。- [新しいプリンシパル] フィールドに、サービス エージェントのメールアドレスを入力します。
- [ロールを選択] リストで、Pub/Sub パブリッシャー ロールを検索します。
- ロールを選択します。
- [保存] をクリックします。
gcloud
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
Google Cloud プロジェクトの課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。
App Engine、Eventarc、Firestore、Pub/Sub、Workflows API を有効にします。
gcloud services enable \ appengine.googleapis.com \ eventarc.googleapis.com \ firestore.googleapis.com \ pubsub.googleapis.com \ workflows.googleapis.com
他の Google Cloud サービスでの認証に使用するワークフローのサービス アカウントを作成し、適切なロールを付与します。
サービス アカウントを作成します。
gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
SERVICE_ACCOUNT_NAME
をサービス アカウントの名前に置き換えます。前のステップで作成したユーザー管理のサービス アカウントにロールを付与します。次の IAM ロールごとに次のコマンドを 1 回実行します。
roles/datastore.user
: Datastore モード(Datastore)のデータで Firestore にアクセスします。roles/eventarc.eventReceiver
: イベント プロバイダからイベントを受信します。roles/logging.logWriter
: ログを書き込みます。roles/workflows.invoker
: ワークフローを実行し、実行内容を管理します。
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \ --role=ROLE
以下を置き換えます。
PROJECT_ID
: サービス アカウントを作成したプロジェクト IDROLE
: 付与するロール
Cloud Storage からイベントをルーティングする Eventarc トリガーを作成するには、Pub/Sub パブリッシャーのロールを Cloud Storage サービス エージェントに付与します。通常、これは
service-PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com
です。 まず、gcloud storage service-agent
を使用して Cloud Storage サービス エージェントを取得します。SERVICE_ACCOUNT_STORAGE="$(gcloud storage service-agent --project=PROJECT_ID)" gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$SERVICE_ACCOUNT_STORAGE \ --role=roles/pubsub.publisher
Firestore データベースを作成する
Firestore は、値に対応するフィールドを含むドキュメントにデータを保存します。これらのドキュメントはコレクションに格納されます。コレクションは、データの編成とクエリの作成に使用できるドキュメントのコンテナです。Firestore の詳細を確認する。
各 Google Cloud プロジェクトは 1 つの Firestore データベースに制限されています。新しいデータベースを作成する必要がある場合は、次の手順を完了します。
コンソール
Google Cloud コンソールで、Firestore の [スタートガイド] ページに移動します。
[ネイティブ モードを選択] をクリックします。
データベースの選択に関するガイドと各機能の比較については、ネイティブ モードと Datastore モードからの選択をご覧ください。
[ロケーションを選択] リストで、[nam5(United States)] を選択します。
このロケーションは、Google Cloud プロジェクトの Firestore データベースと App Engine アプリケーションの両方に適用されます。 データベースを作成した後で、ロケーションを変更することはできません。
[データベースを作成] をクリックします。
gcloud
Firestore データベースを作成するには、まず App Engine アプリケーションを作成し、gcloud firestore databases create
コマンドを実行する必要があります。
gcloud app create --region=us-central gcloud firestore databases create --region=us-central
us-central is not a valid Firestore location
警告は無視してかまいません。
App Engine と Firestore は同じロケーションをサポートしていますが、App Engine us-central
(アイオワ)リージョンは Firestore nam5
(米国)マルチリージョンにマッピングされます。
Pub/Sub トピックの作成
このチュートリアルでは、イベントソースとして Pub/Sub を使用します。メッセージをパブリッシュできるように、Pub/Sub トピックを作成します。詳細については、トピックの作成と管理をご覧ください。
コンソール
Google Cloud コンソールで、Pub/Sub の [トピック] ページに移動します。
[
トピックを作成] をクリックします。[トピック ID] フィールドに「
topic-callback
」と入力します。他の値はデフォルトを使用します。
[トピックを作成] をクリックします。
gcloud
トピックを作成するには、gcloud pubsub topics create
コマンドを実行します。
gcloud pubsub topics create topic-callback
Cloud Storage バケットを作成する
このチュートリアルでは、イベントソースとして Cloud Storage を使用します。Cloud Storage バケットを作成して、ファイルをアップロードできるようにします。 ストレージ バケットの作成の詳細
コンソール
Google Cloud コンソールで、Cloud Storage の [バケット] ページに移動します。
[
作成] をクリックします。バケットの名前に「
PROJECT_ID-bucket-callback
」と入力します。プロジェクト ID は、
callback-event-sample
ワークフローでバケットの識別に使用されます。[続行] をクリックします。
[ロケーション タイプ] で [リージョン] を選択し、[us-central1(アイオワ)] を選択します。
他の値はデフォルトを使用します。
[作成] をクリックします。
gcloud
トピックを作成するには、gcloud storage buckets create
コマンドを実行します。
gcloud storage buckets create gs://PROJECT_ID-bucket-callback \ --location=us-central1
プロジェクト ID は、callback-event-sample
ワークフローでバケットの識別に使用されます。
イベントソースの作成後、イベント レシーバ ワークフローをデプロイできます。
イベントをリッスンするワークフローをデプロイする
callback-event-listener
ワークフローは、メッセージが Pub/Sub トピックにパブリッシュされたとき、またはファイルが Cloud Storage バケットにアップロードされたときにトリガーされます。ワークフローはイベントを受信し、Firestore データベースから適切なコールバックの詳細を取得してから、コールバック エンドポイントに HTTP リクエストを送信します。
Console
Google Cloud コンソールの [ワークフロー] ページに移動します。
[
作成] をクリックします。新しいフィールドの名前を入力します:
callback-event-listener
。[リージョン] リストで [us-central1] を選択します。
先ほど作成した [サービス アカウント] を選択します。
[次へ] をクリックします。
ワークフロー エディタで、次のワークフローの定義を入力します。
[デプロイ] をクリックします。
gcloud
ワークフローのソースコード ファイルを作成します。
touch callback-event-listener.yaml
テキスト エディタで、次のワークフローをソースコード ファイルにコピーします。
次のコマンドを入力してワークフローをデプロイします。
gcloud workflows deploy callback-event-listener \ --source=callback-event-listener.yaml \ --location=us-central1 \ --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
SERVICE_ACCOUNT_NAME
は、先ほど作成したサービス アカウントの名前に置き換えます。
イベントを待機するワークフローをデプロイする
callback-event-sample
ワークフローは、コールバックの詳細を Firestore データベースに保存し、実行を停止して、特定のイベントが発生するのを待ちます。
Console
Google Cloud コンソールの [ワークフロー] ページに移動します。
[
作成] をクリックします。新しいフィールドの名前を入力します:
callback-event-sample
。[リージョン] リストで [us-central1] を選択します。
先ほど作成した [サービス アカウント] を選択します。
[次へ] をクリックします。
ワークフロー エディタで、次のワークフローの定義を入力します。
[デプロイ] をクリックします。
gcloud
ワークフローのソースコード ファイルを作成します。
touch callback-event-sample.yaml
テキスト エディタで、次のワークフローをソースコード ファイルにコピーします。
次のコマンドを入力してワークフローをデプロイします。
gcloud workflows deploy callback-event-sample \ --source=callback-event-sample.yaml \ --location=us-central1 \ --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
SERVICE_ACCOUNT_NAME
は、先ほど作成したサービス アカウントの名前に置き換えます。
Pub/Sub イベントをルーティングする Eventarc トリガーを作成する
Eventarc トリガーを使用すると、イベントソースとターゲット ワークフローを含むトリガーのフィルタを指定して、イベントをルーティングできます。
Pub/Sub トピックにメッセージをパブリッシュした結果として callback-event-listener
ワークフローを実行する Eventarc トリガーを作成します。
ワークフローのトリガーの詳細を確認する。
コンソール
Google Cloud コンソールで、[Eventarc] ページに移動します。
[
トリガーを作成] をクリックします。トリガー名を入力します。
例:
trigger-pubsub-events-listener
。[イベント プロバイダ] リストで、[Cloud Pub/Sub] を選択します。
[イベント] リストの [カスタム] で、[google.cloud.pubsub.topic.v1.messagePublished] を選択します。
[Cloud Pub/Sub トピックを選択] リストで、前に作成したトピックを選択します。
[リージョン] リストで [us-central1 (Iowa)] を選択します。
プロンプトが表示されたら、Pub/Sub サービス アカウントに
iam.serviceAccountTokenCreator
ロールを付与します。先ほど作成した [サービス アカウント] を選択します。
[イベントの宛先] リストで、[ワークフロー] を選択します。
[ワークフローを選択] リストで、callback-event-listener ワークフローを選択します。
[作成] をクリックします。
gcloud
トリガーを作成するには、gcloud eventarc triggers create
コマンドを実行します。
gcloud eventarc triggers create trigger-pubsub-events-listener \ --location=us-central1 \ --destination-workflow=callback-event-listener \ --destination-workflow-location=us-central1 \ --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \ --transport-topic=topic-callback \ --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
イベントは変換され、ランタイム引数としてワークフロー実行に渡されます。 新しいトリガーが有効になるまで 2 分ほどかかることがあります。
Cloud Storage イベントをルーティングする Eventarc トリガーを作成する
Eventarc トリガーを使用すると、イベントソースとターゲット ワークフローを含むトリガーのフィルタを指定して、イベントをルーティングできます。
Cloud Storage バケットにファイルをアップロードした結果として callback-event-listener
ワークフローを実行する Eventarc トリガーを作成します。ワークフローのトリガーの詳細を確認する。
コンソール
Google Cloud コンソールで、[Eventarc] ページに移動します。
[
トリガーを作成] をクリックします。トリガー名を入力します。
例:
trigger-storage-events-listener
。[イベント プロバイダ] リストで、[Cloud Storage] を選択します。
[イベント] リストの [直接] で、google.cloud.storage.object.v1.finald を選択します。
[バケット] リストで、前に作成したバケットを参照して選択します。
[リージョン] リストで、Cloud Storage バケットに基づいて、デフォルトの us-central1(アイオワ) をそのまま使用します。
プロンプトが表示されたら、Pub/Sub サービス アカウントに
iam.serviceAccountTokenCreator
ロールを付与します。先ほど作成した [サービス アカウント] を選択します。
[イベントの宛先] リストで、[ワークフロー] を選択します。
[ワークフローを選択] リストで、callback-event-listener ワークフローを選択します。
[作成] をクリックします。
gcloud
トリガーを作成するには、gcloud eventarc triggers create
コマンドを実行します。
gcloud eventarc triggers create trigger-storage-events-listener \ --location=us-central1 \ --destination-workflow=callback-event-listener \ --destination-workflow-location=us-central1 \ --event-filters="type=google.cloud.storage.object.v1.finalized" \ --event-filters="bucket=PROJECT_ID-bucket-callback" \ --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
イベントは変換され、ランタイム引数としてワークフロー実行に渡されます。 新しいトリガーが有効になるまで 2 分ほどかかることがあります。
プライマリ ワークフローを実行する
ワークフローを実行すると、そのワークフローに関連付けられた現在のワークフロー定義が実行されます。 callback-event-sample
ワークフローを実行します。これはプライマリ ワークフローであり、特定のイベントが発生するまで待機し、セカンダリ ワークフローが適切なコールバック リクエストを行った場合にのみ実行を再開します。
コンソール
Google Cloud コンソールの [ワークフロー] ページに移動します。
[ワークフロー] ページで、[callback-event-sample] ワークフローをクリックして詳細ページに移動します。
[ワークフローの詳細] ページで [play_arrow 実行] を選択します。
もう一度 [Execute] をクリックします。
ワークフローの実行が開始されます。実行中は、
Running
の実行状態と、次のようなログエントリが表示されます:Started waiting 1hr for an event from source topic-callback
。
gcloud
ワークフローを実行するには、gcloud workflows run
コマンドを実行します。
gcloud workflows run callback-event-sample \ --location=us-central1
ワークフローの実行が開始されます。実行中は、次のような実行状態が表示されます。
Waiting for execution [a848a164-268a-449c-b2fe-396f32f2ed66] to complete...working...
イベントを生成し、実行ステータスを確認する
イベントを生成し、ログエントリを表示して、ワークフローの実行ステータスを確認することで、結果が想定どおりであることを確認できます。
メッセージの公開
前に作成した Pub/Sub トピックにメッセージをパブリッシュします。
コンソール
Google Cloud コンソールで、Pub/Sub の [トピック] ページに移動します。
[topic-callback] をクリックします。
[メッセージ] タブをクリックします。
[メッセージをパブリッシュ] をクリックします。
[メッセージ本文] フィールドに「
Hello World
」と入力します。[公開] をクリックします。
gcloud
メッセージをパブリッシュするには、gcloud pubsub topics publish コマンドを使用します。
gcloud pubsub topics publish topic-callback \ --message="Hello World"
オブジェクトのアップロード
前に作成した Cloud Storage バケットにファイルをアップロードします。
コンソール
- Google Cloud コンソールで、Cloud Storage の [バケット] ページに移動します。
以前に作成したバケットの名前をクリックします。
[オブジェクト] タブで、次のいずれかを行います。
デスクトップまたはファイル マネージャーから目的のファイルを Google Cloud コンソールのメインペインにドラッグ&ドロップします。
[ファイルをアップロード] をクリックし、アップロードするファイルを選択してから、[開く] をクリックします。
gcloud
ファイルをアップロードするには、gcloud storage cp
コマンドを実行します。
gcloud storage cp OBJECT_LOCATION gs://PROJECT_ID-bucket-callback/
OBJECT_LOCATION
は、オブジェクトへのローカルパスに置き換えます。例: random.txt
。
ログエントリと実行ステータスを表示する
callback-event-sample
ワークフローが正常に完了したことを確認します。
コンソール
Google Cloud コンソールの [ワークフロー] ページに移動します。
[ワークフロー] ページで、[callback-event-sample] ワークフローをクリックして詳細ページに移動します。
[ワークフローの詳細] ページで、特定の実行の詳細を取得するには、該当する実行 ID をクリックします。
[実行状態] は [成功] になり、出力ペインに受信した Pub/Sub イベントと Cloud Storage イベントが表示されます。
gcloud
ログエントリをフィルタして、JSON 形式で出力を返します。
gcloud logging read "resource.type=workflows.googleapis.com/Workflow AND textPayload:calling OR textPayload:waiting" \ --format=json
次のようなログエントリを探します。
"textPayload": "Stopped waiting for an event from source..." "textPayload": "Calling back url https://workflowexecutions.googleapis.com/v1/projects/..." "textPayload": "Started waiting 1hr for an event from source..."
前回の実行の試行のステータスを確認します。
gcloud workflows executions wait-last
結果の例を以下に示します。
Using cached execution name: projects/1085953646031/locations/us-central1/workflows/callback-event-sample/executions/79929e4e-82c1-4da1-b068-f828034c01b7 Waiting for execution [79929e4e-82c1-4da1-b068-f828034c01b7] to complete...done. [...] state: SUCCEEDED
クリーンアップ
このチュートリアル用に新規プロジェクトを作成した場合は、そのプロジェクトを削除します。既存のプロジェクトを使用し、このチュートリアルで変更を加えずに残す場合は、チュートリアル用に作成したリソースを削除します。
プロジェクトを削除する
課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。
プロジェクトを削除するには:
- 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.
このチュートリアルで作成したリソースを削除する
次のステップ
- コールバックを使用した人間参加型ワークフローを作成するチュートリアルを試す。