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

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

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

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

始める前に

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

  1. アカウントにログインします。 Google Cloud を初めて使用する場合は、 Google Cloud アカウントを作成して、 実際のシナリオで Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  2. Google Cloud CLI をインストールします。

  3. 外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。

  4. gcloud CLI を初期化するには、次のコマンドを実行します:

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

    プロジェクトを選択または作成するために必要なロール

    • プロジェクトを選択する: プロジェクトの選択に特定の IAM ロールは必要ありません。ロールが付与されているプロジェクトを選択できます。
    • プロジェクトを作成する: プロジェクトを作成するには、プロジェクト作成者ロール (roles/resourcemanager.projectCreator)が必要です。これには resourcemanager.projects.create 権限が含まれています。詳しくは、ロールを付与する方法をご覧ください。
    • プロジェクトを作成する Google Cloud :

      gcloud projects create PROJECT_ID

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

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

      gcloud config set project PROJECT_ID

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

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

  7. Google Cloud CLI をインストールします。

  8. 外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。

  9. gcloud CLI を初期化するには、次のコマンドを実行します:

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

    プロジェクトを選択または作成するために必要なロール

    • プロジェクトを選択する: プロジェクトの選択に特定の IAM ロールは必要ありません。ロールが付与されているプロジェクトを選択できます。
    • プロジェクトを作成する: プロジェクトを作成するには、プロジェクト作成者ロール (roles/resourcemanager.projectCreator)が必要です。これには resourcemanager.projects.create 権限が含まれています。詳しくは、ロールを付与する方法をご覧ください。
    • プロジェクトを作成する Google Cloud :

      gcloud projects create PROJECT_ID

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

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

      gcloud config set project PROJECT_ID

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

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

  12. gcloud コンポーネントを更新します。
    gcloud components update
  13. 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
  14. このチュートリアルで使用する構成変数を設定します。
    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}
  15. プロジェクト作成者には、 基本オーナーロールroles/owner)が付与されます。デフォルトでは、この Identity and Access Management(IAM)ロールには、ほとんどの Google Cloud リソースへのフルアクセスに必要な権限が含まれており、この手順は省略できます。

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

    必要な権限

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

    ロールの付与については、プロジェクト、フォルダ、組織へのアクセスを管理するをご覧ください。

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

  16. Compute Engine のデフォルトのサービス アカウントをメモしておいてください。テスト目的で、Eventarc トリガーにこのサービス アカウントをアタッチし、トリガーの ID として使用します。このサービス アカウントは、Compute Engine を使用する Google Cloud サービスを有効にするか使用すると自動的に作成されます。メールアドレスの形式は次のとおりです。

    PROJECT_NUMBER-compute@developer.gserviceaccount.com

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

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

    本番環境では、新しいサービス アカウントを作成して、必要最小限の権限を含む、最小権限の原則に従った 1 つ以上の IAM ロールを付与することを強くおすすめします。

  17. プロジェクトの ワークフロー 起動元ロール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
  18. 2021 年 4 月 8 日以前に、認証済みの Pub/Sub push リクエストをサポートするために Cloud Pub/Sub サービス エージェントを有効にした場合は、サービス アカウント トークン作成者のロールroles/iam.serviceAccountTokenCreator)をサービス エージェントに付与します。それ以外の場合、このロールはデフォルトで付与されます。
    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 というトリガーが作成されます。

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

  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

    プロジェクトを削除する: Google Cloud

    gcloud projects delete PROJECT_ID

次のステップ