Cloud StorageをトリガーにしてCloud Run jobsを実行する
概要
要約アプリ Brewed Summaryは動画や音声を加工して、文字起こししたり要約を作成したりしています。
その際、メディアの加工にはffmpeg、文字起こしにはOpenAI Whisper、要約にはGPTなどを使っています。これらの処理をCloud Runで並列に実行しようとすると、Cloud Run jobsで実装するのが妥当な選択肢の1つになります。Cloud Run jobsでは、大きく3つの処理をしています。
- メディアの転送
Googleフォームで受け取ったファイルはGoogleドライブに保存されます。そのファイルをCloud Storageに転送します。 - メディアの加工
転送されたファイルをffmpegで加工します。 - 文字起こし・要約作業
Googleフォームのリクエストに応じて文字起こしや要約を作成します。
これらの処理を、Cloud Storageに保存したタスクファイルをトリガーにしてCloud Run jobsを実行しています。(普通のエンジニアだと、Cloud SQLでタスクを管理するような気もしますが。。。)つまり、それぞれの処理が完了したら、タスクファイルを上書き保存→トリガーが発動して、Cloud Run jobsが起動、といった流れです。この処理を実現するために、EventarcとWorkflowsを使う手順について紹介します。
処理の流れ
まずはWorkflowsの「作成」をクリックします。
ワークフロー名はわかりやすく「cloud-run-job-workflow」などにします。利用するサービスアカウントには「ワークフロー起動元」「Eventarc イベント受信者」「Cloud Run 起動元」を付与します。
そして、「新しいトリガーを追加」をクリックして、Eventarc側の設定を行います。
設定はこんな感じです。「google.cloud.storage.object.v1.finalized」はCloud Storageのファイルが作成・上書き保存されたときにトリガーされるイベントです。
「次へ」をクリックすると、workflowの設定を行います。このworkflowの記法がややこしくて苦労しました。ちなみにコードサンプルが用意されていて、以下のリンクにあるCloud Runを実行するサンプルを参考にしました。
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: ${"YOUR TARGET BUCKET"}
- job_name: JOB_NAME
- job_location: asia-northeast1
- check_input_file:
switch:
# バケット名とファイル名の接頭語で判定
- condition: ${event_bucket == target_bucket and text.substring(event_file, 0, 5) == "PREFIX"}
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}
GOOGLE_CLOUD_PROJECT_ID
、YOUR TARGET BUCKET
、PREFIX
には適切な値を設定してください。これで準備完了です。
Discussion