Eventarc を使用したワークフローのトリガー

このチュートリアルでは、Pub/Sub を使用してイベントを受信する認証済みの Cloud Run サービスを使用してワークフローを実行する方法について説明します。Pub/Sub はフルマネージドのリアルタイム メッセージング サービスで、個別のアプリケーション間でメッセージを送受信できます。

Eventarc とワークフローの統合により、次のようなシナリオが可能になります。

  • 組織が Pub/Sub トピックにメッセージを送信して、従業員の雇用を通知します。これにより、Cloud Run サービスがトリガーされ、その従業員に適切なアクセス権と権限を割り当てるワークフローが実行されます。

  • サービスが、正常に動作していないというメッセージを Pub/Sub トピックに送信します。このイベントにより Cloud Run サービスがトリガーされ、自動トラブルシューティング メカニズムを含むワークフローが実行されます。

目標

このチュートリアルの内容は次のとおりです。

  1. Workflows を使用して、Pub/Sub メッセージを受信するワークフローをデプロイします。

  2. 認証された呼び出しが必要なイベント レシーバ サービスを Cloud Run にデプロイします。

  3. Pub/Sub トピックを Cloud Run サービスに接続する Eventarc トリガーを作成します。

  4. Pub/Sub トピックにメッセージをパブリッシュしてイベントを生成します。これにより、ワークフローが実行され、メッセージが Workflows のログに記録されます。

次の図は、アーキテクチャの概要を示しています。

Eventarc とワークフローの統合

費用

このチュートリアルでは、Google Cloud の課金対象となる以下のコンポーネントを使用します。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを出すことができます。

新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

始める前に

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

    プロジェクト セレクタに移動

  3. Cloud プロジェクトに対して課金が有効になっていることを確認します。プロジェクトに対して課金が有効になっていることを確認する方法を学習する

  4. Cloud SDK をインストールして初期化します。
  5. gcloud コンポーネントを更新します。
    gcloud components update
  6. 自分のアカウントでログインします。
    gcloud auth login
  7. Cloud Run、Eventarc、Pub/Sub、Workflows、Cloud Build API を有効にします。
    gcloud services enable run.googleapis.com eventarc.googleapis.com pubsub.googleapis.com workflows.googleapis.com cloudbuild.googleapis.com
  8. このチュートリアルで使用する構成変数を設定します。
    export REGION=us-central1
    gcloud config set project PROJECT_ID
    gcloud config set run/region ${REGION}
    gcloud config set run/platform managed
    gcloud config set eventarc/location ${REGION}
    
    ここで、PROJECT_ID は Google Cloud プロジェクト ID です。
  9. プロジェクトのサービス アカウントを作成します。
    gcloud iam service-accounts create sample-service-account \
      --description="A sample service account" \
      --display-name="Sample service account"
    サービス アカウントを作成した後、サービス アカウントを使用できるようになるまで最大で 7 分かかることがあります。サービス アカウントを作成した直後に使用しようとしてエラーが表示された場合は、60 秒以上待ってからもう一度お試しください。
  10. sample-service-account が作成されたことを確認するには、次のコマンドを実行します。
    gcloud iam service-accounts list
    出力は次のようになります。
    DISPLAY NAME                     EMAIL                                                               DISABLED
    Default compute service account  PROJECT_NUMBER-compute@developer.gserviceaccount.com                False
    Sample service account           sample-service-account@PROJECT_ID.iam.gserviceaccount.com           False
  11. サービス アカウントに run.invoker ロールを付与します。
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:SERVICE_ACCOUNT_ID@PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/run.invoker"

    次の値を置き換えます。

    • PROJECT_ID: プロジェクト ID。
    • SERVICE_ACCOUNT_ID: サービス アカウント ID。
  12. ユーザーに次の IAM ロールを付与します。
    • eventarc.admin

      gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="user:USER_EMAIL" \
        --role='roles/eventarc.admin'

      次の値を置き換えます。

      • PROJECT_ID: Google Cloud プロジェクト ID。
      • USER_EMAIL: ユーザーのメールアドレス。

        例: user:test-user@gmail.comgroup:admins@example.comserviceAccount:test123@example.domain.com、または domain:example.domain.com

      iam.serviceAccountUser

      gcloud iam service-accounts add-iam-policy-binding \
        SERVICE_ACCOUNT_ID@PROJECT_ID.iam.gserviceaccount.com \
        --member="user:USER_EMAIL" \
        --role="roles/iam.serviceAccountUser"

      次の値を置き換えます。

      • PROJECT_ID: Google Cloud プロジェクト ID。
      • SERVICE_ACCOUNT_ID: サービス アカウント ID。
      • USER_EMAIL: ユーザーのメールアドレス。

        例: user:test-user@gmail.comgroup:admins@example.comserviceAccount:test123@example.domain.com、または domain:example.domain.com

ワークフローをデプロイする

トピックへの Cloud Pub/Sub メッセージが HTTP リクエストで Cloud Run サービスをトリガーするときに実行されるワークフローをデプロイします。

  1. リポジトリのクローンを作成します。

    git clone https://github.com/GoogleCloudPlatform/eventarc-samples.git
    
  2. Workflows のサンプルコードが含まれているディレクトリに移動します。

    cd eventarc-samples/eventarc-workflows-integration/eventarc-pubsub
  3. eventarc-pubsub/workflow.yaml ファイルで定義されているワークフローをデプロイします。

    export WORKFLOW_NAME=workflow-pubsub
    gcloud workflows deploy ${WORKFLOW_NAME} --source=workflow.yaml --location=${REGION}
    

    このワークフローは、受信した Pub/Sub メッセージをデコードし、ログに記録します。

    main:
      params: [args]
      steps:
        - init:
            assign:
              - headers: ${args.headers}
              - body: ${args.body}
        - log1:
            call: sys.log
            args:
                text: Workflows received request
                severity: INFO
        - log2:
            call: sys.log
            args:
                text: ${args}
                severity: INFO
        - pubSubMessageStep:
            call: sys.log
            args:
                text: ${"Decoded Pub/Sub message data is " + text.decode(base64.decode(args.body.message.data))}
                severity: INFO

イベント レシーバを Cloud Run へデプロイする

ワークフローを実行する Cloud Run サービスをデプロイします。

  1. Cloud Run のサンプルコードが含まれているディレクトリに移動します。

    cd trigger-workflow
  2. ワークフローを実行するサービスのコンテナをビルドします。

    export PROJECT_ID=$(gcloud config get-value project)
    export SERVICE_NAME=trigger-workflow-pubsub
    gcloud builds submit --tag gcr.io/${PROJECT_ID}/${SERVICE_NAME}
    
  3. 「Allow unauthenticated invocations to trigger-workflow-pubsub (y/N)?」というプロンプトに n(いいえ)と応答します。

  4. コンテナ イメージを Cloud Run にデプロイします。

    gcloud run deploy ${SERVICE_NAME} \
      --image gcr.io/${PROJECT_ID}/${SERVICE_NAME} \
      --region=${REGION} \
      --update-env-vars GOOGLE_CLOUD_PROJECT=${PROJECT_ID},WORKFLOW_REGION=${REGION},WORKFLOW_NAME=${WORKFLOW_NAME}
    

    この Cloud Run サービスは HTTP リクエストでワークフローを実行します。

    console.log(`Workflow path: ${GOOGLE_CLOUD_PROJECT}, ${WORKFLOW_REGION}, ${WORKFLOW_NAME}`);
    const execResponse = await client.createExecution({
      parent: client.workflowPath(GOOGLE_CLOUD_PROJECT, WORKFLOW_REGION, WORKFLOW_NAME),
      execution: {
        argument: JSON.stringify({headers: req.headers, body: req.body})
      }
    });
    console.log(`Execution response: ${JSON.stringify(execResponse)}`);
    
    const execName = execResponse[0].name;
    console.log(`Created execution: ${execName}`);
    
    res.status(200).send(`Created execution: ${execName}`);

サービス URL が表示されたら、デプロイは完了しています。

Eventarc トリガーを作成する

Pub/Sub トピックにメッセージがパブリッシュされると、イベントにより認証された Cloud Run サービスがトリガーされます。このイベントは、リソースの使用に必要な IAM のロールと権限が付与されたサービス アカウントを持つ呼び出し元によってトリガーされます。

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

    新しい Pub/Sub トピック

      gcloud eventarc triggers create ${SERVICE_NAME} \
        --destination-run-service=${SERVICE_NAME} \
        --destination-run-region=${REGION} \
        --location=${REGION} \
        --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
        --service-account=SERVICE_ACCOUNT_USER_EMAIL
    

    SERVICE_ACCOUNT_USER_EMAIL は、サービス アカウントのメールアドレスに置き換えます。
    これにより、新しい Pub/Sub トピックと trigger-workflow-pubsub というトリガーが作成されます。

    既存の Pub/Sub トピック

      gcloud eventarc triggers create ${SERVICE_NAME} \
        --destination-run-service=${SERVICE_NAME} \
        --destination-run-region=${REGION} \
        --location=${REGION} \
        --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
        --transport-topic=projects/PROJECT_ID/topics/TOPIC_ID \
        --service-account=SERVICE_ACCOUNT_USER_EMAIL
    

    次のように置き換えます。

    • PROJECT_ID はユーザーの Google Cloud プロジェクト ID です。
    • TOPIC_ID は、既存の Pub/Sub トピックの ID です。
    • SERVICE_ACCOUNT_USER_EMAIL は、サービス アカウントのメールアドレスです。

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

  2. トリガーが正常に作成されたことを確認します。

      gcloud eventarc triggers list --location=us-central1
    

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

Pub/Sub トピックにメッセージをパブリッシュしてイベントを生成し、Cloud Run サービスをトリガーします。Cloud Run サービスが、Workflows サービスログにメッセージを記録するワークフローを実行します。

  1. 作成した Pub/Sub トピックを検索して、環境変数として設定します。

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

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

    生成されたイベントが Workflows サービスログに記録されます。

  3. イベント メッセージを表示するには、Workflows サービスログに移動します。

    1. Google Cloud Console で [ワークフロー] ページを開きます。

      [ワークフロー] に移動

    2. workflow-pubsub ワークフローをクリックします。

    3. [ログ] タブを選択します。

      ログが表示されるまで少し時間がかかることがあります。すぐに表示されない場合は、しばらくしてからもう一度確認してください。

  4. 「Hello there!」というメッセージを見つけます。

クリーンアップ

このチュートリアル用に新規プロジェクトを作成した場合は、そのプロジェクトを削除します。既存のプロジェクトを使用し、このチュートリアルで変更を加えずに残す場合は、チュートリアル用に作成したリソースを削除します。

プロジェクトの削除

課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。

プロジェクトを削除するには:

  1. Cloud Console で [リソースの管理] ページに移動します。

    [リソースの管理] に移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

チュートリアル リソースの削除

  1. このチュートリアルでデプロイした Cloud Run サービスを削除します。

    gcloud run services delete SERVICE-NAME

    SERVICE-NAME は、選択したサービス名です。

    Cloud Run サービスは Google Cloud Console から削除することもできます。

  2. チュートリアルを設定したときに追加した gcloud のデフォルト構成を削除します。

    リージョン設定を削除します。

     gcloud config unset run/region
    
  3. プロジェクト構成を削除します。

     gcloud config unset project
    
  4. このチュートリアルで作成した他の Google Cloud リソースを削除します。

    • トリガーを削除します。
      gcloud eventarc triggers delete TRIGGER_NAME
      
      TRIGGER_NAME は実際のトリガー名に置き換えます。

次のステップ