Open6

Cloud Storageトリガー

tomoyukiktomoyukik

GCSの更新をトリガーにCloud Run Jobsを起動 (Workflowを使う)

有効化が必要なAPI

  • Cloud Build
  • Cloud Run
  • Cloud Storage
  • Eventarc
  • Workflows API

手順

  1. Cloud Run Jobsをデプロイ
    • SAは必要に応じて作成。またはデフォルトのエージェント
  2. Workflowをデプロイ
    • ワークフローのソースにCloud Runを呼び出すコードを記載
  3. Triggerをデプロイ
    • デプロイしたワークフローの詳細画面かEventarcのコンソールからTriggerを定義

上記を実施するとTriggerで指定したバケット上にファイルを作成・更新することでトリガーが起動される。

※ サービスエージェント service-PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.comroles/pubsub.publisher を付与する

Tutorialで作成されているSAについて

TutorialではEventarcとWorkflowの両方に同じSAをアタッチしている。
付与されているロールは下記。

  • Cloud Run Admin
  • Eventarc Event Receiver
  • Logs Writer
  • Workflows Invoker
tomoyukiktomoyukik

workflows syntax

https://cloud.google.com/workflows/docs/reference/syntax/syntax-cheat-sheet

  • main メインワークフローの指定。サブワークフローの定義もある。
  • params: [event] 実行時引数。[]内に引数名を指定。[event]の場合、eventの名前で引数を参照できる
  • steps
    • 処理のステップを記載。ネストも可。
    • 各要素にはステップ名を記載し、処理内容をマップのvalueとして定義する。
    • 以下の場合、initという名前のステップにてproject_id という変数へのアサインを行うことになる。
      - init:
          assign: 
            - project_id: プロジェクトID
      
main:
    params: [event]
    steps:
        - init:
            assign:
                - project_id: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
                - event_bucket: ${event.data.bucket}
                - event_file: ${event.data.name}
                - target_bucket: personal-data-august-gantry-325007-us-central1
                - job_name: parallel-job
                - job_location: us-central1
        - check_input_file:
            switch:
                - condition: ${event_bucket == target_bucket}
                  next: run_job
                - condition: true
                  next: end
        - run_job:
            call: googleapis.run.v1.namespaces.jobs.run
            args:
                name: ${"namespaces/" + project_id + "/jobs/" + job_name}
                location: ${job_location}
                body:
                    overrides:
                        containerOverrides:
                            env:
                                - name: INPUT_BUCKET
                                  value: ${event_bucket}
                                - name: INPUT_FILE
                                  value: ${event_file}
            result: job_execution
        - finish:
            return: ${job_execution}