Cloud Storage からの直接イベントでワークフローをトリガーする(gcloud CLI)

このクイックスタートでは、Cloud Storage からイベントを受け取る Eventarc トリガーを使用してワークフローを実行する方法について説明します。

トリガーは、Cloud Storage バケット内のオブジェクト作成イベントをリッスンしてワークフローを実行し、そのイベントをランタイム引数として宛先ワークフローに渡します。

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

  1. イベントソースとして Cloud Storage バケットを作成します。

  2. Workflows により、ストレージ バケットの名前とアップロードされたファイルの名前を抽出して返すワークフローを作成してデプロイします。

  3. Cloud Storage バケットを Workflows イベント レシーバに接続する Eventarc トリガーを作成します。

  4. テキスト ファイルを Cloud Storage バケットにアップロードしてイベントを生成します。このイベントは、ランタイム引数として宛先ワークフローに渡されます。

  5. ワークフローの実行結果でバケットの名前とテキスト ファイルの名前を確認します。


このタスクを Google Cloud コンソールで直接行う際の順を追ったガイダンスについては、「ガイドを表示」をクリックしてください。

ガイドを表示


始める前に

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

  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. 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

  11. gcloud コンポーネントを更新します。
    gcloud components update
  12. お使いのアカウントを使用してログインします。
    gcloud auth login

環境変数を設定する

このクイックスタートで使用する環境変数を設定します。

export PROJECT_ID=PROJECT_ID
export WORKFLOW_LOCATION=us-central1
export TRIGGER_LOCATION=us-central1
gcloud config set project ${PROJECT_ID}
gcloud config set workflows/location ${WORKFLOW_LOCATION}
gcloud config set eventarc/location ${TRIGGER_LOCATION}

プロジェクト ID は、Google Cloud コンソールの [ようこそ] ページで確認できます。

サービス アカウントを設定する

このクイックスタートで使用するサービス アカウントに必要な権限を付与します。

  1. プロジェクト作成者には、オーナーロールroles/owner)が付与されます。デフォルトでは、この Identity and Access Management(IAM)ロールには、ほとんどの Google Cloud リソースへの完全アクセス権に必要な権限が含まれており、この手順は省略できます。

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

    必要な権限

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

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

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

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

  3. プロジェクトの 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
  4. プロジェクトのワークフロー起動元ロール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
  5. ワークフローが 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
  6. Cloud Storage からの直接イベントのトリガーを作成する前に、Cloud Storage サービス エージェントに Pub/Sub パブリッシャーのロールroles/pubsub.publisher)を付与します。

    SERVICE_ACCOUNT="$(gsutil kms serviceaccount -p PROJECT_ID)"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="serviceAccount:${SERVICE_ACCOUNT}" \
        --role='roles/pubsub.publisher'
    
  7. 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

Cloud Storage バケットを作成する

イベントソースとして使用する Cloud Storage バケットを作成します。

  gsutil mb -l us-central1 gs://${PROJECT_ID}-bucket/

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

Cloud Storage バケットで作成されたオブジェクトが HTTP リクエストでワークフローをトリガーするときに実行されるワークフローを作成してデプロイします。

  1. ホーム ディレクトリで、myEventWorkflow.yaml または myEventWorkflow.json という名前の新しいファイルを作成します。

  2. 次の内容をコピーして新しいファイルに貼り付け、保存します。

    YAML

      main:
        params: [event]
        steps:
            - log_event:
                call: sys.log
                args:
                    text: ${event}
                    severity: INFO
            - extract_bucket_object:
                assign:
                - bucket: ${event.data.bucket}
                - object: ${event.data.name}
            - return_bucket_object:
                    return:
                        bucket: ${bucket}
                        object: ${object}
      

    JSON

    {
    "main": {
    "params": [
      "event"
    ],
    "steps": [
      {
        "log_event": {
          "call": "sys.log",
          "args": {
            "text": "${event}",
            "severity": "INFO"
          }
        }
      },
      {
        "extract_bucket_object": {
          "assign": [
            {
              "bucket": "${event.data.bucket}"
            },
            {
              "object": "${event.data.name}"
            }
          ]
        }
      },
      {
        "return_bucket_object": {
          "return": {
            "bucket": "${bucket}",
            "object": "${object}"
          }
        }
      }
    ]
    }
    }
  3. ワークフローをデプロイします。

    export MY_WORKFLOW=myEventWorkflow
    gcloud workflows deploy ${MY_WORKFLOW} --source=myEventWorkflow.yaml
    

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

Eventarc トリガーを作成する

Eventarc トリガーは、Cloud Storage バケットから Workflows の宛先にイベントを送信します。

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

    gcloud eventarc triggers create storage-events-trigger \
        --destination-workflow=${MY_WORKFLOW} \
        --event-filters="type=google.cloud.storage.object.v1.finalized" \
        --event-filters="bucket=${PROJECT_ID}-bucket" \
        --service-account="PROJECT_NUMBER-compute@developer.gserviceaccount.com"
    

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

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

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

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

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

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

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

  1. イベントを生成するには、Cloud Storage にテキスト ファイルをアップロードします。

    echo "Hello World" > random.txt
    gsutil cp random.txt gs://${PROJECT_ID}-bucket/random.txt
    

    アップロードにより、ランタイム引数としてワークフローに渡されるイベントが生成されます。これにより、ストレージ バケットとアップロードされたファイルの名前が返されます。

  2. ワークフローの実行がトリガーされたことを確認するには、直近の 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-10-13T03:38:03.019148617Z
    END_TIME: 2021-10-13T03:38:03.249705805Z
    NAME: projects/606789101455/locations/us-central1/workflows/myFirstWorkflow/executions/a6319d9d-36a6-4117-904e-3d1118bdc90a
    STATE: SUCCEEDED
    START_TIME: 2021-10-13T17:28:51.492864252Z
    END_TIME: 2021-10-13T17:28:52.227212414Z
    

    上記の例の NAME フィールドで、a6319d9d-36a6-4117-904e-3d1118bdc90a はワークフロー実行の ID です。次のステップで使用するため、実行 ID をコピーします。

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

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

    WORKFLOW_EXECUTION_ID は、ファイルがバケットにアップロードされた時刻に対応するワークフロー実行の ID に置き換えます。

    出力は次のようになります。

    argument: [...]
    name: projects/218898424763/locations/us-central1/workflows/myEventWorkflow/executions/86d2567b-0f1e-49b3-8b10-cdac5d0f6239
    result: '{"bucket":"PROJECT_ID-bucket","object":"random.txt"}'
    startTime: '2021-10-13T03:38:03.019148617Z'
    state: SUCCEEDED
    
  4. Cloud Storage バケットが更新されている時刻 "timeCreated": "2021-10-13T03:38" と、ワークフロー実行の startTime が互いに対応していることを確認します。

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

クリーンアップ

このページで使用したリソースに対して Google Cloud アカウントで課金されないようにするには、Google Cloud プロジェクトとそのリソースを削除します。

  1. 作成したワークフローを削除します。

    gcloud workflows delete ${MY_WORKFLOW}
    

    続行を確認するメッセージが表示されたら、「y」と入力します。

  2. ストレージ バケットを削除します。

    gsutil rm -r gs://${PROJECT_ID}-bucket/
    
  3. このチュートリアルで作成したワークフローを削除します。

    gcloud eventarc triggers delete storage-events-trigger
    
  4. また、Google Cloud プロジェクトを削除して、料金が発生しないようにすることもできます。Google Cloud プロジェクトを削除すると、そのプロジェクト内で使用されているすべてのリソースに対する課金が停止します。

    Delete a Google Cloud project:

    gcloud projects delete PROJECT_ID

次のステップ