業界・業務から探す
導入目的・課題から探す
データ・AIについて学ぶ
News
Hakkyについて
ウェビナーコラム
◆トップ【データ基盤】
データハブとは
Ajust
データの保守運用
AI

執筆者:Handbook編集部

Cloud Run Jobsでdbtを定期実行する方法

はじめに

この記事では、dbt を Cloud Run Jobs で定期実行する方法について紹介します。 dbt の実行をスケジュール化することで、データパイプライン処理を自動化することができます。

Google Cloud 上で dbt をスケジュール実行する方法

まず、Google Cloud 上で dbt をスケジュール実行する際に利用するサービスとしては以下が挙げられます。
それぞれのサービスのメリットとデメリットをまとめてみました。

Cloud Composer

  • メリット
    • dbt を定期実行させるだけなら DAG を airflow にデプロイしてスケジュールするだけで済む
  • デメリット
    • Cloud Composer のアーキテクチャは様々なリソースを使用しているためコストが高い
    • 起動のオーバーヘッドが大きい
    • composer と airflow のバージョン管理が面倒

Batch

  • メリット
    • GPU を使用できる
    • コンテナだけでなくスクリプトを使用してジョブを定義できる
  • デメリット
    • 実行環境として GCE が使用されているため軽量なジョブにはオーバースペック

Cloud Run Jobs

  • メリット
    • Cloud Run 単体でジョブを完結させられるため学習コストが低い
    • 低コスト
  • デメリット
    • ジョブの最大実行時間が 1 時間

Cloud Run Jobs を使って dbt をスケジュール実行する

今回は dbt の定期実行が目的であり複雑な処理は行わないので、Cloud Run Jobs を使って実装していきます。

構成図

今回作成する環境の構成図です。 処理の流れとしては以下の通りです。

  1. Github Actions で Docker イメージを GCR へ push
  2. Github Actions で Cloud Run Jobs をデプロイ
  3. Cloud Scheduler で Cloud Run Jobs を定期実行
  4. Cloud Run Jobs がサービスアカウントの権限を使用して BigQuery へ dbt 実行

コード

ここでは実装に使用するコードを紹介します。

Dockerfile

Cloud Run Jobs では Docker イメージを使用する必要があります。 以下はサンプルの Dockerfile です。requirements.txt に dbt 実行に必要なライブラリを記載します。

FROM ghcr.io/dbt-labs/dbt-core:1.4.1

WORKDIR /app

COPY ./requirements.txt  .

RUN pip install --upgrade pip && \
    pip install -r requirements.txt

COPY . /app

RUN dbt deps

Github Actions

Github Actions から Cloud Run Jobs をデプロイするため、Github Actions と Google Cloud を連携する必要があります。
Github Actions と Google Cloud の連携方法については、Workload Identity を使った GitHub Actions と Google Cloud の連携方法を参照してください。

上記リンクで紹介している yaml ファイルのcloud auth login by workload identityより後の処理を、以下の様に書き換えます。 これで Docker イメージを GCR へ push し、Coud Run Jobs を更新する Actions が作成できます。

- id: image-url
  name: Create docker image url
  run: |
    echo "name=${{ env.REGISTRY_HOSTNAME }}/${{ env.GCP_PROJECT_ID }}/dbt:latest" >> $GITHUB_OUTPUT

- name: Build a docker image
  run: |
    docker build -f ./Dockerfile -t ${{ steps.image-url.outputs.name }} .

- name: Push the docker image to Container Registry
  run: docker push ${{ steps.image-url.outputs.name }}

- name: Update Cloud Run Jobs
  run: |
    gcloud components install beta --quiet
    gcloud beta run jobs deploy dbt \
    --quiet \
    --project=${{ env.GCP_PROJECT_ID }} \
    --command="dbt run" \
    --region asia-northeast1 \
    --cpu=1 \
    --memory=2Gi \
    --service-account="dbt-cloud-run-jobs-service-account@${{ env.GCP_PROJECT_ID }}.iam.gserviceaccount.com" \
    --task-timeout=3600 \
    --image=${{ steps.image-url.outputs.name }} \
    --max-retries=1
info
備考

実装時のポイント

  • Github Actions で Cloud Run Jobs を更新する際は、create や update ではなく deploy(create or update)を使うことで新規作成と更新の両方に対応できます。
  • Dockerfile 側にdbt runを定義せず、gcloud beta run jobs deploy--commandオプションでdbt runを定義することで、他の処理を行う job が必要になった際も共通の Dockerfile で対応できます。

Terraform

Terraform では以下のリソースを作成します。

  • Cloud Run Jobs にアタッチするサービスアカウント
  • Cloud Run Jobs を定期実行するための Cloud Scheduler
variable "dbt_roles" {
  type = set(string)
  default = [
    "roles/bigquery.admin",
    "roles/run.admin",
  ]
}

resource "google_service_account" "dbt" {
  project      = var.project
  account_id   = "dbt-cloud-run-jobs-service-account"
  display_name = "dbt-cloud-run-jobs-service-account"
}

resource "google_project_iam_member" "dbt" {
  for_each = var.dbt_roles

  project = var.project
  role    = each.value
  member  = "serviceAccount:${google_service_account.dbt.email}"

resource "google_project_service" "scheduler" {
  service            = "cloudscheduler.googleapis.com"
  disable_on_destroy = false
}

resource "google_cloud_scheduler_job" "dbt" {
  name             = "schedule-dbt-job"
  description      = "Schedule dbt job"
  schedule         = "0 0 * * *"
  attempt_deadline = "320s"
  region           = var.region

  retry_config {
    retry_count = 3
  }

  http_target {
    http_method = "POST"
    uri         = "https://${var.region}-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/${var.project_number}/jobs/${var.cloud_run_dbt_job_name}:run"

    oauth_token {
      service_account_email = google_service_account.dbt.email
    }
  }
}

まとめ

この記事では、dbt を Cloud Run Jobs で定期実行する方法について紹介しました。 これにより、dbt のジョブを自動的にスケジュールし、管理コストを抑えつつ、データパイプライン処理を自動化することが可能になります。

参考

info
備考

Hakky ではエンジニアを募集中です!まずは話してみたいなどでも構いませんので、ぜひお気軽に採用ページからお問い合わせくださいませ。

2025年06月29日に最終更新
読み込み中...