Cloud Audit Logs を使用してワークフローをトリガーする(gcloud CLI)

このクイックスタートでは、BigQuery から Cloud Audit Logs イベントを受信する Eventarc トリガーを使用してワークフローを実行する方法について説明します。BigQuery は、アクセスしてアプリケーションに統合できる一般公開データセットをホストしています。トリガーは、一般公開データセットに対してクエリを実行する BigQuery ジョブをリッスンしてワークフローを実行します。次に、イベントをランタイム引数として宛先ワークフローに渡します。

このクイックスタートでは Google Cloud CLI を使用します。

  1. Workflows を使用して、イベントからデータを抽出して返すワークフローを作成してデプロイします。
  2. BigQuery ジョブを Workflows イベント レシーバに接続する Eventarc トリガーを作成します。
  3. bq コマンドライン ツールを使用して BigQuery ジョブを実行し、イベントを生成します。このイベントは、ランタイム引数として宛先ワークフローに渡されます。
  4. ワークフロー実行出力でイベントデータを確認します。

始める前に

組織で定義されているセキュリティの制約により、次の手順を完了できない場合があります。トラブルシューティング情報については、制約のある Google Cloud 環境でアプリケーションを開発するをご覧ください。

  1. Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  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. アカウントを使用してログインします。
    gcloud auth login
    
  12. 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
  13. このクイックスタートで使用する構成変数を設定します。
    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}
    
  14. プロジェクト作成者には、オーナーロールroles/owner)が付与されます。デフォルトでは、この Identity and Access Management(IAM)ロールには、ほとんどの Google Cloud リソースへの完全アクセス権に必要な権限が含まれており、この手順は省略できます。

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

    必要な権限

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

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

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

  15. 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)が自動的に付与されます。ただし、自動ロール付与が無効になっている場合は、該当するロールと権限の手順に沿って新しいサービス アカウントを作成し、必要なロールを付与してください。

  16. プロジェクトの Eventarc イベント レシーバのロールroles/eventarc.eventReceiver)を Compute Engine のデフォルト サービス アカウントに付与して、Eventarc トリガーがイベント プロバイダからイベントを受信できるようにします。
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
        --role=roles/eventarc.eventReceiver
  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. ワークフローが Cloud Logging にログを送信できるように、プロジェクトの Logging ログ書き込みロールroles/logging.logWriter)を Compute Engine のデフォルト サービス アカウントに付与します。
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
        --role=roles/logging.logWriter
  19. 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

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

BigQuery ジョブの完了時に実行され、HTTP リクエストでワークフローをトリガーするワークフローを作成してデプロイします。

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

    YAML

    main:
      params: [event]
      steps:
          - log_event:
              call: sys.log
              args:
                  text: ${event}
                  severity: INFO
          - extract_data:
              assign:
              - data: ${event.data.protoPayload}
          - return_data:
                  return:
                      data: ${data}

    JSON

    {
      "main": {
        "params": [
          "event"
        ],
        "steps": [
          {
            "log_event": {
              "call": "sys.log",
              "args": {
                "text": "${event}",
                "severity": "INFO"
              }
            }
          },
          {
            "extract_data": {
              "assign": [
                {
                  "data": "${event.data.protoPayload}"
                }
              ]
            }
          },
          {
            "return_data": {
              "return": {
                "data": "${data}"
              }
            }
          }
        ]
      }
    }
  4. ワークフローをデプロイします。
    export MY_WORKFLOW=myFirstWorkflow
    gcloud workflows deploy ${MY_WORKFLOW} --source=myFirstWorkflow.yaml
    

    JSON バージョンのサンプル ワークフローをコピーした場合は、.yaml.json に置き換えます。

Eventarc トリガーを作成する

BigQuery から Workflows の宛先にイベントを転送する Eventarc トリガーを作成するには、gcloud eventarc triggers create コマンドを実行します。

  1. BigQuery イベントをフィルタするトリガーを作成します。

    gcloud eventarc triggers create events-cal-trigger \
        --destination-workflow=${MY_WORKFLOW} \
        --destination-workflow-location=${WORKFLOW_LOCATION} \
        --event-filters="type=google.cloud.audit.log.v1.written" \
        --event-filters="serviceName=bigquery.googleapis.com" \
        --event-filters="methodName=google.cloud.bigquery.v2.JobService.InsertJob" \
        --service-account="PROJECT_NUMBER-compute@developer.gserviceaccount.com"
    

    これにより、events-cal-trigger というトリガーが作成されます。

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

  2. events-cal-trigger が正常に作成されたことを確認するには、次のコマンドを実行します。

    gcloud eventarc triggers describe events-cal-trigger --location=${TRIGGER_LOCATION}

    出力には、トリガーの作成時刻とロケーションが次のように表示されます。

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

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

bq コマンドライン ツールから BigQuery ジョブを実行し、イベントを生成してワークフローをトリガーします。

  1. ワークフローをトリガーするには、一般公開データセットにアクセスして情報を取得する BigQuery ジョブを実行します。

    bq query --nouse_legacy_sql \
    'SELECT
    COUNT(*)
    FROM
    `bigquery-public-data`.samples.shakespeare'
    

    生成されたイベントは、ランタイム引数としてワークフローに渡されます。ワークフローは、ワークフローの実行の結果としてペイロード データを返します。

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

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

    BigQuery ジョブによって 2 つのワークフロー実行がトリガーされます(イベントの 1 つはジョブの変更、もう 1 つはジョブ挿入そのものを示すものです)。出力には、実行ごとに SUCCEEDED に等しい NAMESTATE がリストされ、次のようになります。

    NAME: projects/218898424763/locations/us-central1/workflows/myFirstWorkflow/executions/a073ad6a-c76b-4437-8d39-2ab3ade289d2
    STATE: SUCCEEDED
    START_TIME: 2024-02-06T14:16:14.390549813Z
    END_TIME: 2024-02-06T14:16:14.870102511Z
    NAME: projects/218898424763/locations/us-central1/workflows/myFirstWorkflow/executions/35d7c730-7ba5-4055-afee-c04ed706b179
    STATE: SUCCEEDED
    START_TIME: 2024-02-06T14:16:14.389882601Z
    END_TIME: 2024-02-06T14:16:14.829942525Z

    出力で、NAME フィールドの a073ad6a-c76b-4437-8d39-2ab3ade289d2 がワークフロー実行の ID です。実行 ID をコピーして、次の手順で使用します。

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

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

    WORKFLOW_EXECUTION_ID は、BigQuery ジョブの完了時刻に対応するワークフロー実行の ID に置き換えます。

    出力例を以下に示します。

    argument: [...]
    duration: 0.277917625s
    endTime: '2024-02-06T14:16:14.870102511Z'
    name: projects/218898424763/locations/us-central1/workflows/myFirstWorkflow/executions/a073ad6a-c76b-4437-8d39-2ab3ade289d2
    result: '{"data": [...]}'
    startTime: '2024-02-06T14:16:14.390549813Z'
    state: SUCCEEDED
  4. BigQuery ジョブが完了した startTime とワークフロー実行の START_TIME が互いに対応していることを確認します。

これで、Eventarc を使用して Workflows イベント レシーバーをトリガーする BigQuery イベントが正常に生成されました。

クリーンアップ

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

    Google Cloud プロジェクトを削除します。

    gcloud projects delete PROJECT_ID

次のステップ