本稿は、dbt Cloudにおけるジョブのスケジュール実行と通知を、現場で迷いがちな設計ポイントに絞って整理します。UIの具体的な挙動やAPIの使いどころ、通知の設計原則を一通り把握できます。
dbt Analytics Engineer Certificationで問われやすい概念(ジョブ構成要素、スケジュール設計、失敗時の通知・再実行方針)を、実務のベストプラクティスと合わせて解説します。
dbt Cloudのジョブは、特定のEnvironmentで一連のコマンド(例: dbt build, dbt test)を定義し、トリガー(スケジュール、手動、API、PR/CI)で起動する単位です。通知はジョブ単位で設定でき、成功・失敗などの状態変化に応じてSlackやメール、(プランに応じて)汎用Webhookに送信できます。
スケジュールはUIでの時刻指定やcron式で設定でき、ジョブ内のステップは定義順に実行されます。モデルの並列度は各コマンドのスレッド数(--threads)で調整します。API経由では任意タイミングで安全に起動でき、Gitブランチの上書き実行や原因メッセージ(cause)の付与も可能です。
| トリガー種別 | 主な用途 | 起動遅延の特徴 | 通知の適用 |
|---|---|---|---|
| スケジュール | 定時バッチ、日次・時次・週次 | 安定(基準時刻に従う) | 成功/失敗/完了に応じて配信 |
| 手動/ボタン | 緊急再実行、検証 | 即時(ユーザー依存) | ジョブ設定に従う |
| API | 上位オーケストレータからの呼び出し | 即時〜数秒程度 | ジョブ設定に従う |
| PR/CI | 変更検証(ブランチ/PR単位) | イベント依存(Git webhook) | 通常は失敗時重視 |
ジョブ実行と通知の概念フロー
APIでジョブを起動する(POST /api/v2/accounts/{account_id}/jobs/{job_id}/run/)
curl -X POST \
-H "Authorization: Token <DBT_CLOUD_API_TOKEN>" \
-H "Content-Type: application/json" \
https://cloud.getdbt.com/api/v2/accounts/<ACCOUNT_ID>/jobs/<JOB_ID>/run/ \
-d '{
"cause": "Triggered from orchestrator",
"git_branch": "main"
}'まずはデータ到着と下流SLAから逆算して粒度(毎時/日次/週次など)を決めます。増分モデル中心なら毎時または30分間隔、スナップショットや集計締め処理は日次が定石です。重複起動を避けるため、1回の実行時間より十分に長い間隔を確保します。
ジョブ内のステップ順は依存関係に合わせて定義します。例として、dbt deps → seed → build → test → docs generate。seedやtestは必要最小限にし、遅いテストは夜間に分離するなど、複数ジョブに分ける判断も有効です。UIのスケジュールは簡易指定とcron式の両方をサポートするため、営業日だけの実行や特定曜日の除外なども表現可能です。
通知は「誰が」「いつ」「何を」行動するかを基準に設計します。本番ジョブは失敗時の即時通知、成功時は集約やサマリのみとするのが一般的です。Slackはチャンネル連携による可視性、メールは監査や長文メッセージの強みがあります。Webhook(利用可能なプラン)を使えば外部アラート管理と連携できます。
ジョブごとに通知を分けるとノイズを抑制できます。夜間の失敗はオンコール向け、検証用ジョブは開発チャンネルへ。メッセージにはジョブ名、環境、実行ID、原因(cause)を含めると一次切り分けが迅速になります。
1) Environmentを確認し、接続先・権限・変数(環境変数やdbt_project.ymlのtarget等)を確定。2) Jobを作成し、Stepsにdbtコマンド列を登録。3) Scheduleで実行間隔(UI選択またはcron式)を設定。4) NotificationsでSlack/メール/Webhookを紐付け、イベント(成功/失敗/完了)を選択。5) テスト実行してRun結果とアーティファクト(Run results、logs)の到達を確認します。
ジョブ名には環境と粒度を含めると運用が明快になります(例: prod-hourly-build)。コマンドの--threadsや--select/--excludeでスコープを厳密化し、遅いモデルや不安定な外部依存は別ジョブに切り出します。
ジョブの代表的なステップ例
dbt deps
# 重要なシードのみ投入(タグで制御)
dbt seed --select tag:seed_core --threads 4
# 差分重視。上流変更影響を含めて実行
dbt build --select state:modified+ --threads 8
# 重要テストだけ本番バッチに残す
dbt test --select tag:critical増分モデルは冪等性を重視し、再実行しても同じ結果になるよう設計します。上流遅延でデータ未着のときは空実行でも壊れないことが重要です。失敗時は原則として原因を切り分け、再実行は手動またはAPIから行い、原因(cause)を必ず記録します。
重複起動のリスクを避けるため、実行時間に対して十分なスケジュール間隔を取り、長時間化が続く場合はモデル分割やスレッド調整、対象スコープの見直しを行います。ログとアーティファクトを体系的に保管し、メトリクス(成功率、実行時間、失敗理由)を継続的に可視化します。
ジョブはEnvironment・Steps・Triggers・Notificationsの組み合わせであること、スケジュールはUIとcron式の両方で指定できること、通知はジョブ単位で制御しやすいことを押さえてください。PR/CIは本番スケジュールとは独立に設計し、通知チャンネルも分離するのが望ましいです。
落とし穴は、実行時間とスケジュール間隔の不整合、成功通知の出し過ぎによるノイズ、原因メモ未入力での追跡困難です。試験では「どのトリガーを使うべきか」「どの通知先に送るべきか」をユースケースから選び分ける問題がよく出ます。
Analytics Engineer
問題 1
毎時実行の本番ジョブで、増分モデルがまれに40分以上かかり次のスケジュールと重なります。通知はオンコール向けSlackに送っています。最も適切な対応はどれか。
正解: A
重複起動を避けるには実行時間に見合う間隔へ調整するのが基本です。通知ノイズを抑えるため、本番は失敗時のみ即時通知が妥当です。Bは過剰通知、CはSLAを満たせない、Dは競合と二重書き込みのリスクがあります。
スケジュールはUI指定とcron式のどちらを使うべきですか?
要件が単純(毎時、毎日など)ならUI指定で十分です。営業日や特定曜日除外など柔軟性が必要な場合はcron式が向きます。いずれもジョブの安定運用に影響するため、実行時間のばらつきと依存関係を踏まえて設計してください。
通知はジョブ全体の成功・失敗以外にも細かく設定できますか?
基本はRunの状態変化(成功、失敗、完了)に連動します。細粒度の条件分岐が必要な場合は、Webhookで外部の通知・アラート基盤に連携し、ルールをそちらで管理するアプローチが実務では有効です。
ジョブがスケジュール時刻にまだ実行中だった場合はどうなりますか?
重複実行を避ける設計が推奨で、実行時間より十分に長い間隔を取るのが安全です。長時間化が常態化している場合は、モデルの分割、対象スコープの見直し、スレッド数やクエリ最適化を検討してください。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
dbt Model の基礎: SQL で定義する変換の最小単位
Analytics Engineer 向けに、dbt Model の定義、マテリアライゼーション、依存関係、インクリメン...
dbt Analytics Engineer 試験ガイド: 出題範囲・配点・申込の実務視点
dbt Analytics Engineer 認定の出題範囲、配点の考え方、申込から受験までの流れを、公式ドキュメントの...
dbt Cloud と dbt Core の違いと選び方:Analytics Engineer 試験に効く要点
dbt Cloud と dbt Core の機能差を、実務と資格対策の両面から整理。スケジューリング、IDE、RBAC、...
dbt プロジェクト構造ガイド: models / seeds / macros の実務レイアウト
Analytics Engineer 向けに、dbt プロジェクトのディレクトリ構造と命名規約、dbt_project....
dbt_project.yml の読み方:主要設定と命名を最短で掴む
dbt_project.yml の必須キー、命名解決(database.schema.identifier)、設定優先度...