Pub/Sub メッセージを使用してワークフローをトリガーする(gcloud CLI)

このクイックスタートでは、Pub/Sub を使用してイベントを受信する Eventarc トリガーを使用してワークフローを実行する方法について説明します。トリガーは、Pub/Sub を介して配信されたイベントをランタイム引数として宛先ワークフローに渡すことにより、ワークフローを実行します。

このクイックスタートでは、以下のことを行います。

  1. Workflows を使用して、Pub/Sub メッセージをデコードして返すワークフローを作成し、デプロイします。
  2. Pub/Sub トピックを Workflows イベント レシーバに接続する Eventarc トリガーを作成します。
  3. Pub/Sub トピックにメッセージをパブリッシュしてイベントを生成します。このイベントは、ランタイム引数として宛先ワークフローに渡されます。
  4. ワークフローの実行結果として Pub/Sub メッセージを確認します。

始める前に

Google Cloud Workflows の非公開プレビューにプロジェクトを追加するようにリクエストして、この機能にアクセスできることを確認します。

  1. 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.
  2. Google Cloud CLI をインストールします。
  3. gcloud CLI を初期化するには:

    gcloud init
  4. Google Cloud プロジェクトを作成または選択します

    • Google Cloud プロジェクトを作成します。

      gcloud projects create PROJECT_ID

      PROJECT_ID は、作成する Google Cloud プロジェクトの名前に置き換えます。

    • 作成した Google Cloud プロジェクトを選択します。

      gcloud config set project PROJECT_ID

      PROJECT_ID は、実際の Google Cloud プロジェクト名に置き換えます。

  5. Google Cloud プロジェクトで課金が有効になっていることを確認します

  6. Google Cloud CLI をインストールします。
  7. gcloud CLI を初期化するには:

    gcloud init
  8. Google Cloud プロジェクトを作成または選択します

    • Google Cloud プロジェクトを作成します。

      gcloud projects create PROJECT_ID

      PROJECT_ID は、作成する Google Cloud プロジェクトの名前に置き換えます。

    • 作成した Google Cloud プロジェクトを選択します。

      gcloud config set project PROJECT_ID

      PROJECT_ID は、実際の Google Cloud プロジェクト名に置き換えます。

  9. Google Cloud プロジェクトで課金が有効になっていることを確認します

  10. gcloud コンポーネントを更新します。
    gcloud components update
  11. Compute Engine、Eventarc、Pub/Sub、Workflows API を有効にします。
    gcloud services enable \
    compute.googleapis.com \
    eventarc.googleapis.com \
    pubsub.googleapis.com \
    workflows.googleapis.com \
    workflowexecutions.googleapis.com
  12. このチュートリアルで使用する構成変数を設定します。
    export WORKFLOW_LOCATION=us-central1
    export TRIGGER_LOCATION=us-central1
    export PROJECT_ID=PROJECT_ID
    gcloud config set project ${PROJECT_ID}
    gcloud config set workflows/location ${WORKFLOW_LOCATION}
    gcloud config set eventarc/location ${TRIGGER_LOCATION}
    
  13. プロジェクト作成者には、オーナーロールroles/owner)が付与されます。デフォルトでは、この Identity and Access Management(IAM)ロールには、ほとんどの Google Cloud リソースへの完全アクセス権に必要な権限が含まれており、この手順は省略できます。

    プロジェクト作成者でない場合は、プロジェクトで適切なプリンシパルに必要な権限を付与する必要があります。プリンシパルは Google アカウント(エンドユーザーの場合)やサービス アカウント(アプリケーションとコンピューティング ワークロードの場合)になることもあります。詳細については、イベントの宛先のロールと権限のページをご覧ください。

    必要な権限

    このクイックスタートを完了するために必要な権限を取得するには、プロジェクトに対して次の IAM ロールを付与するよう管理者に依頼してください。

    ロールの付与の詳細については、アクセスの管理をご覧ください。

    必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

  14. Compute Engine を使用する Google Cloud サービスを有効にするか、使用すると、Compute Engine のデフォルトのサービス アカウントが自動的に作成されます。

    テスト目的で、このサービス アカウントを Eventarc トリガーに関連付けて、トリガーの ID を示すこともできます。トリガーの作成時に使用するメールの形式に注意してください。

    PROJECT_NUMBER-compute@developer.gserviceaccount.com
    

    PROJECT_NUMBER は、実際の Google Cloud プロジェクトの番号に置き換えます。プロジェクト番号は、Google Cloud コンソールの [ようこそ] ページで確認できます。また、次のコマンドで確認することもできます。

    gcloud projects describe PROJECT_ID --format='value(projectNumber)'

    Compute Engine サービス アカウントには、プロジェクトの編集者ロールroles/editor)が自動的に付与されます。ただし、自動ロール付与が無効になっている場合は、該当するロールと権限の手順に沿って新しいサービス アカウントを作成し、必要なロールを付与してください。

  15. プロジェクトのワークフロー起動元ロールroles/workflows.invoker)を Compute Engine のデフォルト サービス アカウントに付与し、ワークフローをトリガーする権限を付与します。
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
        --role=roles/workflows.invoker
  16. 2021 年 4 月 8 日以前に、認証済みの Pub/Sub push リクエストをサポートするために Cloud Pub/Sub サービス エージェントを有効にした場合は、サービス アカウント トークン作成者のロールroles/iam.serviceAccountTokenCreator)を Google マネージド サービス アカウントに付与します。それ以外の場合、このロールはデフォルトで付与されます。
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
        --role=roles/iam.serviceAccountTokenCreator

ワークフローを作成してデプロイする

Pub/Sub トピックに公開されたメッセージが HTTP リクエストでワークフローをトリガーするときに実行されるワークフローを作成してデプロイします。

  1. ターミナルまたは Cloud Shell を開きます。
  2. ホーム ディレクトリで、myFirstWorkflow.yaml または myFirstWorkflow.json という名前の新しいファイルを作成します。
  3. 次の内容をコピーして新しいファイルに貼り付け、保存します。

    YAML

    main:
      params: [event]
      steps:
        - decode_pubsub_message:
            assign:
               - base64: ${base64.decode(event.data.message.data)}
               - message: ${text.decode(base64)}
        - return_pubsub_message:
            return: ${message}

    JSON

    {
      "main": {
        "params": [
          "event"
        ],
        "steps": [
          {
            "decode_pubsub_message": {
              "assign": [
                {
                  "base64": "${base64.decode(event.data.message.data)}"
                },
                {
                  "message": "${text.decode(base64)}"
                }
              ]
            }
          },
          {
            "return_pubsub_message": {
              "return": "${message}"
            }
          }
        ]
      }
    }
  4. ワークフローをデプロイします。
    export MY_WORKFLOW=myFirstWorkflow
    gcloud workflows deploy ${MY_WORKFLOW} --source=myFirstWorkflow.yaml
    
    JSON バージョンのサンプル ワークフローをコピーした場合は、.yaml.json に置き換えます。

Eventarc トリガーを作成する

Pub/Sub トピックにメッセージが公開されると、イベントによってワークフローがトリガーされます。

  1. Pub/Sub メッセージをリッスンするトリガーを作成します。

    新しい Pub/Sub トピック

    gcloud eventarc triggers create events-pubsub-trigger \
        --destination-workflow=${MY_WORKFLOW} \
        --destination-workflow-location=${WORKFLOW_LOCATION} \
        --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
        --service-account="PROJECT_NUMBER-compute@developer.gserviceaccount.com"

    これにより、新しい Pub/Sub トピックと events-pubsub-trigger というトリガーが作成されます。

    既存の Pub/Sub トピック

    gcloud eventarc triggers create events-pubsub-trigger \
        --destination-workflow=${MY_WORKFLOW} \
        --destination-workflow-location=${WORKFLOW_LOCATION} \
        --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
        --service-account="PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
        --transport-topic=TOPIC_ID

    TOPIC_ID は、既存の Pub/Sub トピックの ID に置き換えます。

    これにより、既存の Pub/Sub トピックに events-pubsub-trigger というトリガーが作成されます。

    Google Cloud プロジェクトで初めて Eventarc トリガーを作成する場合、Eventarc サービス エージェントのプロビジョニングに遅延が発生することがあります。この問題は通常、トリガーを再度作成することで解決できます。詳細については、権限拒否エラーをご覧ください。

  2. トリガーが正常に作成されたことを確認します。
    gcloud eventarc triggers describe events-pubsub-trigger --location=${TRIGGER_LOCATION}

    作成時刻とトリガーのロケーションを含む出力は次のようになります。

    createTime: '2021-10-14T15:15:43.872360951Z'
    [...]
    name: projects/PROJECT_ID/locations/us-central1/triggers/events-pubsub-trigger

イベントを生成して表示する

Pub/Sub トピックにメッセージを公開してイベントを生成し、ワークフローをトリガーします。生成されたイベントは、ランタイム引数としてワークフローに渡されます。ワークフローは、ワークフローの実行の結果として Pub/Sub メッセージを返します。ワークフローに渡すイベントのサイズが 512 KB を超えないようにしてください。

  1. 新しい Pub/Sub トピックのトリガーを作成した場合は、作成した Pub/Sub トピックを検索して、環境変数として設定します。

    export TOPIC_ID=$(basename $(gcloud eventarc triggers describe events-pubsub-trigger --format='value(transport.pubsub.topic)'))
    
  2. ワークフローをトリガーするには、Pub/Sub トピックにメッセージを送信します。

    gcloud pubsub topics publish $TOPIC_ID --message "Hello there"
    

    生成されたイベントはランタイム引数としてワークフローに渡され、ワークフローから「Hello where」というメッセージが返されます。

  3. ワークフローの実行がトリガーされたことを確認するには、直近の 5 つの実行を一覧表示します。

    gcloud workflows executions list ${MY_WORKFLOW} --limit=5
    

    出力は次のようになります。ワークフローを実行するたびに SUCCEEDED と等しい NAME と STATE が表示されます。

    NAME: projects/606789101455/locations/us-central1/workflows/myFirstWorkflow/executions/8c02b8f1-8836-4a6d-99d9-fc321eb9668f
    STATE: SUCCEEDED
    START_TIME: 2021-09-13T19:15:10.275677049Z
    END_TIME: 2021-09-13T19:15:10.963136883Z
    NAME: projects/606789101455/locations/us-central1/workflows/myFirstWorkflow/executions/a6319d9d-36a6-4117-904e-3d1118bdc90a
    STATE: SUCCEEDED
    START_TIME: 2021-09-13T17:28:51.492864252Z
    END_TIME: 2021-09-13T17:28:52.227212414Z
    

    上記の例の NAME フィールドで、a6319d9d-36a6-4117-904e-3d1118bdc90a はワークフロー実行の ID です。実行 ID をコピーして、次の手順で使用します。

  4. 実行ステータスを表示するには、次のコマンドを実行します。

    gcloud workflows executions describe WORKFLOW_EXECUTION_ID --workflow=${MY_WORKFLOW}
    

    WORKFLOW_EXECUTION_ID は、Pub/Sub トピックの公開時間に対応するワークフロー実行の ID に置き換えます。出力は次のようになります。

    argument: [...]
    endTime: '2021-09-13T17:28:47.301012152Z'
    name: projects/1234567/locations/us-central1/workflows/myFirstWorkflow/executions/f72bc6d4-5ea0-4dfb-bb14-2dae82303120
    result: 'Hello there'
    startTime: '2021-09-13T17:28:51.492864252Z'
    state: SUCCEEDED
  5. Pub/Sub メッセージが公開される publish_time とワークフロー実行の startTime が互いに対応していることを確認します。

これで、Eventarc を使用して Workflows イベント レシーバをトリガーする Pub/Sub トピックにより、イベントが正常に生成されました。

クリーンアップ

  1. 作成したワークフローを削除します。
    gcloud workflows delete ${MY_WORKFLOW}
    続行を確認するメッセージが表示されたら、「y」と入力します。
  2. 作成したトリガーを削除します。
    gcloud eventarc triggers delete events-pubsub-trigger
  3. また、Google Cloud プロジェクトを削除して、料金が発生しないようにすることもできます。Google Cloud プロジェクトを削除すると、そのプロジェクト内で使用されているすべてのリソースに対する課金が停止します。

    Delete a Google Cloud project:

    gcloud projects delete PROJECT_ID

次のステップ