Data Engineer Associate — 第 12 章

書いたものを安全に本番へ届ける — Git 連携とデプロイの自動化

読了 20 分確認 9 問更新 2026-08-09

この章で学ぶこと

  • Git フォルダでできる操作とできない操作を区別する
  • sparse checkout と権限レベルの使い分けを説明する
  • databricks.yml の targets と変数の解決順序を書き出す
  • mode: development と production の差を挙げる
  • bundle サブコマンドと CI/CD の標準形を再現する

この章に出てくる用語

Databricks Git Folders
ワークスペース内のフォルダを GitHub などのリポジトリに直結させる機能です。旧称は Repos で、REST API のパスは今も /api/2.0/repos です。clone やブランチ操作を UI から行えます。
sparse checkout
巨大なモノレポの一部だけを取り込む設定です。Git folder の作成時に有効化し、Cone patterns に parent/child のような cone パターンを改行区切りで書きます。! による除外は使えません。
Declarative Automation Bundles
ジョブやパイプラインを YAML で宣言し環境ごとに配布する IaC ツールです。公式の呼び名は Databricks Asset Bundles から変わりましたが、CLI は databricks bundle のままです。
databricks.yml
バンドルの中核となる設定ファイルです。bundle / targets / resources / variables など 14 個のトップレベルマッピングを書け、必須は bundle とその配下の name だけです。
targets
dev や prod のデプロイ先を宣言するマッピングです。workspace.host や variables を環境ごとに上書きし、bundle deploy -t prod で選びます。default: true は 1 つだけです。
mode: production
target に付けると本番用のガードレールが働きます。パイプラインが development: false か、現在の Git ブランチが指定ブランチと一致するかを検証し、クラスタの差し替えを禁じます。
lookup
バンドル変数の定義に書くと、クラスタ名やジョブ名から ID を解決します。cluster / job / pipeline / warehouse / metastore など 12 種類に対応し、ID のハードコードを避けられます。
databricks/setup-cli
GitHub Actions で Databricks CLI を入れる公式アクションです。DATABRICKS_AUTH_TYPE を github-oidc にし、id-token: write を与えれば OIDC で認証できます。

Databricks Git Folders — sparse checkout、権限4種、Pull で出力が消えること、できないこと

ワークスペースの画面でノートブックを直接書き換えていると、昨日まで動いた処理が今日壊れたときに、誰がいつ何を変えたのかを追えません。手でエクスポートして手元の Git に置く運用も、差分が見えず競合も検出できません。Databricks Git Folders は、この「変更履歴がワークスペースの外にしか作れない」という困りごとを、ワークスペース内のフォルダをリモートの Git リポジトリに直結させて解決します。旧称は Databricks Repos で、2024 年に改称されました。変わったのは UI と用語だけで、REST API は改称されておらず /api/2.0/repos が現行の正式パスです。/Repos というワークスペースパスもそのまま機能します。

Git Folders の前段 — ノートブックとローカル IDE

つなぐ前に、ノートブック側の道具立てです。Python / SQL / Scala / R をセル単位で切り替えられ、%sql のような言語マジックはセルの 1 行目に置く必要があり、前に空行やコメントがあるとパースエラーになります。共通処理は %run ./utils で取り込み、呼び出し元と同じ実行コンテキストに展開されるので関数も変数もそのまま使えます。対して dbutils.notebook.run("utils", 60) は子を別コンテキストで起動し、受け取れるのは dbutils.notebook.exit() が返した文字列だけです。Revision history は Git とは別に自動保存され、消したセルを時刻を選んで戻せます。複数人の同時編集も可能で、排他ロックはかかりません。File > Export は .dbc、ソース形式 (セル境界は # COMMAND ----------)、.ipynb、HTML、R Markdown に対応し、上限は IPYNB が 100 MB、他は 10 MB です。ローカルの VS Code から書くときは Databricks Connect と VS Code 拡張を使います。

接続の準備 — 認証情報は個人設定に登録する

連携できるのは GitHub (Cloud / Enterprise Server)、GitLab、Bitbucket Cloud、Azure DevOps Services、AWS CodeCommit です。最初にやるのは、Settings の Linked accounts で個人アクセストークン (PAT) か OAuth を登録することです。ここを飛ばすと clone の時点で認証エラーになります。1 ユーザーが持てる Git 資格情報は最大 10 件で、プロバイダごとに 1 件が既定になります。Azure DevOps は Microsoft Entra ID のトークンに非対応で、Azure DevOps の PAT が必須です。

できること、できないこと

UI からは clone、ブランチの作成と切り替え、Commit & Push、Pull、差分表示、コンフリクト解消ができ、merge / rebase / reset (git reset --hard 相当) も実行できます。Create Branch で名前とベースブランチを選ぶと、作成と同時にチェックアウトされます。ただし試験で問われるのはできないことの側です。プルリクエストの作成は Git プロバイダ側の画面で行います。自動コミットも自動 push もなく、Commit & Push を押すまで何も届きません。%git というマジックも databricks branches create も存在しません。

Pull はノートブックの出力を消す

上流の変更を取り込む Git 操作は、ノートブックの状態をクリアします。Pull の後は、セルに表示されていた実行結果が失われます。残したい表やグラフは先にテーブルへ書き出してください。「Pull しても出力は保持される」は誤りという形で問われます。未コミットの変更が勝手にコミットされることもありません。

未コミットの変更があると、Pull はそもそも拒否されます。UI に stash ボタンはないため、変更を残すか破棄するかを選ぶダイアログ (Keep my changes / Discard my changes) で処理します。細かく残したいときは Git CLI 側で git stash → git pull → git stash pop を踏みます。行単位の競合は、その行を直接編集するか Take all incoming changes で片側を採用します。

覚えておく上限値

項目値
作業ブランチのサイズ1 GB
Git フォルダ内で UI 表示できるファイル10 MB まで
Git 操作 1 回あたりのメモリ2 GB
Git 操作 1 回あたりのディスク書き込み4 GB
ワークスペース資産とファイルの総数20,000 未満を推奨
リモート削除後にローカルブランチが残る期間最大 30 日

この上限のせいで 5 GB のリポジトリは clone に失敗します。10 MB は Git フォルダ内のファイルを UI で開けるかの制限で、ワークスペースファイル全般の話ではありません。

sparse checkout — 巨大なモノレポの一部だけを取り込む

モノレポをまるごと取り込むと、上の上限にすぐ当たります。sparse checkout は必要なディレクトリだけを取り込む機能です。Git folder 作成のダイアログで Sparse checkout mode を有効にし、Cone patterns の欄にパターンを改行区切りで並べます。パターンを書かずに有効化すると、ルート直下のファイルだけが対象になります。parent/child/grandchild と書くと grandchild 配下が再帰的に入り、途中の親ディレクトリとルート直下のファイルも入ります。! による除外指定は cone パターンにありません。作成後は Settings > Advanced > Cone patterns で編集できますが、後から無効化はできません。commit と push は通常どおり動きます。

権限は 5 段階、付与するのは 4 種

権限できること (下位を含む)
NO PERMISSIONSアクセスなし
CAN READファイルの閲覧、clone とエクスポート
CAN RUN閲覧に加えてファイルの実行
CAN EDIT編集と改名、ブランチの作成と切り替え、pull と push
CAN MANAGE作成・削除・移動、共有と権限の変更

公式が列挙するのは NO PERMISSIONS を含む 5 段階で、付与するのは CAN READ 以上の 4 種です。権限は配下のすべてに適用され、個別の上書きもできます。この ACL (権限設定の一覧) は Premium プラン以上です。通常のフォルダの最下位は CAN VIEW、Git フォルダは CAN READ です。

本番ジョブが参照する Git フォルダは、管理者がユーザーフォルダの外に作り、デプロイ用ブランチだけを保持します。自動化を動かすサービスプリンシパル (人ではなく処理に割り当てる ID) には CAN RUN を与えます。個人フォルダ配下に置く構成や、全員への CAN MANAGE は事故の起点です。

確認 — 穴あけ 3 問

0 / 3

空欄を押すと選択肢が出ます。間違えても減点はありません。

Git Folders で Pull を実行すると、ノートブックの はクリアされる。

sparse checkout の cone パターンでは、除外を表す 記号は使えない。

Git フォルダでブランチの作成・切り替え・push ができるのは 以上の権限である。

Asset Bundles の文法 — databricks.yml / targets / variables 解決順序5段 / mode: production / lookup

前節の Git Folders はコードの履歴を残してくれますが、ジョブやパイプラインの設定までは面倒を見てくれません。開発ワークスペースで画面から組み立てたジョブを、本番ワークスペースでもう一度作り直す。ここが実務でいちばん壊れます。タイムゾーンを直し忘れる、リトライ回数だけ違う、参照するカタログが dev のまま残る。こうしたずれは事故が起きるまで誰も気づきません。Declarative Automation Bundles は、ジョブ・パイプライン・クラスタ・ダッシュボードといった資産を YAML に一度だけ書き、環境ごとの差分だけを上書きしてデプロイすることで、このずれを構造的に防ぎます。呼び名は Databricks Asset Bundles から Declarative Automation Bundles へ変わりましたが、CLI は databricks bundle のままで、設定ファイルの書き換えも要りません。試験では両方出ます。

databricks.yml のトップレベルは 14 個

バンドルの中核は、プロジェクトのルートに置く databricks.yml です。書けるトップレベルのマッピングは次の 14 個で、必須は bundle と、その配下の name だけです。bundle は 1 ファイルに 1 つしか書けません。

マッピング役割
bundleバンドル名などのメタデータ (必須)
variablesカスタム変数の宣言と既定値
workspace接続先とデプロイ先パスの設定
artifactsホイールなど成果物のビルド定義
include分割した設定ファイルの読み込み
resourcesジョブ・パイプライン・クラスタなどの定義
sync同期するファイルの include / exclude / paths
targetsデプロイ先の環境ごとの上書き
permissionsデプロイしたリソースに付ける権限
run_asデプロイと実行を行う ID
presetsmode が入れる既定値の個別上書き
scriptsbundle run で呼べる名前付きスクリプト
pythonPython コードからの構成生成
experimental実験的な機能の設定

この一覧は CLI のバージョンで増減します。scripts は CLI 0.259.0 で追加され、python は 0.275.0 で experimental から昇格しました。CLI が古いと書いたキーは無視されます。

bundle:
  name: etl_pipeline

include:
  - resources/*.yml

variables:
  catalog_name:
    default: main

resources:
  jobs:
    daily_ingest:
      name: "${bundle.target}_daily_ingest"
      tasks:
        - task_key: transform
          notebook_task:
            notebook_path: ./src/transform.py

targets:
  dev:
    default: true
    mode: development
    workspace:
      host: https://dev.cloud.databricks.com
  prod:
    mode: production
    workspace:
      host: https://prod.cloud.databricks.com
    variables:
      catalog_name: prod_main

include に resources/*.yml のようなグロブを書くと、ジョブごとにファイルを分けても 1 つのバンドルとして扱われます。分けてよいのはファイルであってバンドルではありません。環境ごとにバンドルを分けた時点で、二重管理に戻ります。リソース名に ${bundle.target} を埋め込んでいるのは、同じワークスペースに dev と prod を並べたときの名前衝突を避けるためです。

デプロイ先のパスには既定値がある

workspace.host を書かなければ CLI のプロファイルの接続先が使われます。パス類は書かなければ次の既定値になります。

設定既定値
root_path/Workspace/Users/${workspace.current_user.userName}/.bundle/${bundle.name}/${bundle.target}
artifact_path${workspace.root}/artifacts
file_path${workspace.root}/files
state_path${workspace.root}/state

既定のままだと、デプロイした人のユーザーフォルダ配下に成果物が置かれます。本番では root_path を個人に依存しない場所へ移し、書き込めるのはサービスプリンシパルだけにします。

targets — 環境差分はここだけに書く

targets の配下に dev staging prod を宣言し、それぞれで workspace.host、mode、variables、リソースの一部を上書きします。デプロイは databricks bundle deploy -t prod のように -t (--target) で 1 つの target を選んで行います。1 コマンドでデプロイされるのは 1 target だけで、同時並列に全環境へ配ることはありません。default: true を付けられる target はちょうど 1 つで、これを付けておくと -t を省略できます。CI では環境変数 DATABRICKS_BUNDLE_ENV でも target を指定できます。

bundle.name はワークスペース上でのリソースの名前空間として働き、ジョブ名やパイプライン名に織り込まれます。開発者や target が複数あっても衝突しないのは、この仕組みのおかげです。実行 ID を固定したいときは run_as に user_name か service_principal_name を書き、配布したリソースに付ける権限は permissions にグループ単位で書きます。

variables — ${var.…} と complex と lookup

変数は variables で宣言し、参照は ${var.catalog_name} の形です。$ENV{...} や %name% や {{variables.name}} はバンドルの構文ではありません。カスタム変数は既定で文字列として扱われるため、クラスタ構成のように入れ子の値をまとめて切り替えたいときは、変数定義に type: complex を指定します。type: complex なのに default が単一の値だと、検証で失敗します。

variables:
  job_cluster:
    type: complex
    default:
      node_type_id: i3.xlarge
      num_workers: 2
  shared_cluster_id:
    lookup:
      cluster: "team-shared-cluster"

既存オブジェクトの ID をハードコードしたくないときは lookup: を使います。名前を書くと ID が解決されます。対応するのは alert / cluster_policy / cluster / dashboard / instance_pool / job / metastore / notification_destination / pipeline / query / service_principal / warehouse の 12 種類です。

変数の解決順序は 5 段

同じ変数に複数の場所で値が指定されているとき、CLI は上から順に探し、最初に見つかった時点で確定します。

順値の場所
1コマンドラインの --var オプション
2BUNDLE_VAR_ で始まる環境変数
3.databricks/bundle/<target>/variable-overrides.json
4targets 配下の variables マッピング
5トップレベル variables の default

書き方は --var="catalog_name=foo"、環境変数なら BUNDLE_VAR_catalog_name=foo です。CI から一時的に値を差し込みたいときに --var が最優先になる、という順序です。「default が最優先」「targets が --var より強い」といった選択肢は誤りです。

mode: development と mode: production

mode は target ごとに書くフラグで、ガードレールの束をまとめて切り替えます。

観点mode: developmentmode: production
リソース名[dev ${workspace.current_user.short_name}] を前置前置しない
タグdev タグを付与付与しない
スケジュールとトリガー既定で一時停止 (pause_status: UNPAUSED で個別解除)そのまま有効
同時実行許可 (max_concurrent_runs: 1 で抑止)定義どおり
パイプラインdevelopment: true として扱うdevelopment: false を検証
デプロイロック既定で無効 (bundle.deployment.lock.enabled で復活)有効
クラスタの差し替え--cluster-id でできるできない

mode: production のデプロイ時に CLI が行う検証は 3 つ覚えます。デプロイされる Lakeflow パイプライン (宣言的にテーブルを作るパイプライン機能) がすべて development: false であること、現在の Git ブランチが target に指定されたブランチと一致すること (--force で上書き可)、そしてサービスプリンシパルを使わない場合は root_path などのパスがユーザー固有になっていないことと run_as と permissions が明示されていることです。通知先メールの有無や、全タスクがサーバーレスかどうかは検証されません。

mode が入れる既定値は presets で個別に上書きできます。キーは name_prefix、tags、pipelines_development、trigger_pause_status、jobs_max_concurrent_runs、source_linked_deployment、artifacts_dynamic_version の 7 つです。

シークレットは YAML に書かない

接続文字列やトークンを databricks.yml に平文で書くと、Git の履歴に永久に残ります。バンドルからは Secret スコープを参照し、値そのものは持ち込みません。参照の構文は {{secrets/<scope-name>/<secret-name>}} で、{{secrets/ で始まり }} で終わります。波かっこの内側に空白を入れるとスコープ名やキー名の一部として扱われるため、詰めて書きます。

確認 — 穴あけ 3 問

0 / 3

空欄を押すと選択肢が出ます。間違えても減点はありません。

バンドル変数の値を探す順序で最優先されるのは である。

mode: development でデプロイすると、リソース名に というプレフィックスが付く。

クラスタ ID を直接書かずクラスタ名から解決させるには、変数定義に を書く。

Databricks CLI と CI/CD パイプライン — bundle サブコマンド、GitHub Actions 連携、アンチパターン集

ここまでの YAML を実際に動かすのが Databricks CLI です。CLI は開発者の手元と CI ランナーの両方で同じコマンドを実行できるため、「自分の環境では動いた」という言い訳が生まれません。

まず認証を通す

手元では databricks auth login --host <workspace-url> を実行すると、設定プロファイルが ~/.databrickscfg に保存されます。以後は -p (--profile) でプロファイルを選びます。CI では対話ログインができないため、環境変数を使います。CLI はバンドルの設定ファイル、DATABRICKS_HOST / DATABRICKS_TOKEN / DATABRICKS_CLIENT_ID / DATABRICKS_CLIENT_SECRET などの環境変数、.databrickscfg のプロファイルの順に資格情報を探し、見つかった時点で止まります。CI で使う ID は個人ではなくサービスプリンシパルにし、デプロイ用と実行用 (run_as) を分けます。

bundle サブコマンド

コマンド用途よく使うフラグ
bundle initテンプレートから新規バンドルを作る—
bundle validate構成ファイルの記述が正しいか検証する-t
bundle planデプロイで何が起きるかを事前に表示する--select
bundle deployワークスペースへ配置する-t --auto-approve --force-lock --fail-on-active-runs
bundle runジョブ・パイプライン・スクリプトを実行する--params --no-wait --validate-only
bundle summaryデプロイ済みリソースの概要を見る--force-pull
bundle destroyデプロイしたリソースと成果物を削除する-t --auto-approve --force-lock
bundle generate既存リソースから構成ファイルを生成する--bind --key
bundle deployment bindバンドル定義を既存リソースに紐づける--auto-approve
bundle syncローカルからワークスペースへ片方向同期する--watch --dry-run

UI で手作りしてしまった既存ジョブをコード化したいときは databricks bundle generate job を使います。generate には app / dashboard / genie-space / job / pipeline のサブコマンドがあり、--bind を付けると生成した定義を既存リソースに紐づけられます。紐づけは後から databricks bundle deployment bind と unbind でも操作できます。実行は databricks bundle run daily_etl -t prod のようにリソースキーを引数に取ります。

選択肢に混ぜられる存在しないコマンドも覚えておくと得点になります。bundle test、bundle check --dry-run、bundle undeploy、bundle clean、bundle import job、databricks jobs export --to-bundle、databricks branches create はいずれも存在しません。--validate-only は deploy ではなく run のフラグである点も引っかけになります。

GitHub Actions に載せる

標準の型は、CLI を入れて、認証を通して、validate してから deploy する、の 4 ステップです。認証はワークロード ID フェデレーション (OIDC。人ではなくワークフローの実行そのものに、短命の身分証を発行してもらう仕組み) が推奨で、この場合はワークスペースのトークンを GitHub 側に保存する必要がなくなります。

permissions:
  id-token: write
  contents: read

jobs:
  deploy:
    runs-on: ubuntu-latest
    env:
      DATABRICKS_AUTH_TYPE: github-oidc
      DATABRICKS_HOST: ${{ vars.DATABRICKS_HOST }}
      DATABRICKS_CLIENT_ID: ${{ vars.DATABRICKS_CLIENT_ID }}
      DATABRICKS_BUNDLE_ENV: prod
    steps:
      - uses: actions/checkout@v4
      - uses: databricks/setup-cli@main
      - run: databricks bundle validate
      - run: databricks bundle deploy

CLI の導入は公式アクション databricks/setup-cli で行い、@main かバージョンを固定した参照を書きます。ブランチと target の対応づけが設計の勘所です。PR では dev target へ validate と deploy を流し、main へのマージで prod target へデプロイします。id-token: write がないと OIDC のトークンを発行できず認証に失敗するので、権限ブロックの書き忘れは典型的な詰まりどころです。

アンチパターン集

やりがちなこと何が壊れるか正しい形
本番ノートブックを curl で直接書き換える履歴もレビューもロールバックも消えるbundle deploy -t prod
cron で毎時 git pull をポーリングする反映が遅れ、部分反映が起きるマージを契機にデプロイ
手元から手動で bundle deploy誰がいつ何を出したか残らないCI から実行する
環境ごとに YAML やリポジトリを分ける差分が蓄積し二重管理になるtargets で上書き
ノートブック先頭で if env == "prod"インフラ設定がコードに紛れる変数と target で表現
PAT を YAML に直書きGit 履歴に資格情報が残るSecret スコープ参照
dev と prod で同じカタログを共用開発作業が本番データを壊すtarget ごとにカタログを切替
リソース名を全環境で固定別環境のリソースを上書きする名前に ${bundle.target}

targets の設定が足りないときの怖さは、デプロイが失敗せずに通ってしまうことです。構文が正しければ deploy 自体は成功し、dev 用のジョブが本番のジョブを上書きしてから気づきます。逆に特定の環境だけ deploy が失敗するなら、その target ブロックで参照しているカタログ名・外部ロケーション名・ワークスペースパスの誤りをまず疑います。

開発から本番までの流れ

ここまでの部品をつなぐと 1 本の線になります。

  1. Git Folders で作業ブランチを切り、ノートブックを書く。共通処理は %run ./utils か Python モジュールの import で共有する。
  2. Commit & Push し、Git プロバイダの画面でプルリクエストを作る。
  3. PR をトリガーに CI が databricks bundle validate と dev target への deploy を実行し、bundle run でテスト用ジョブを回す。
  4. レビューを通してマージすると、main のワークフローが prod target へ deploy する。mode: production の検証がここで効く。
  5. 本番ジョブは、バンドルが配置した成果物か、管理者が用意した本番用 Git フォルダのデプロイ用ブランチを参照して動く。

手作業に戻した瞬間に再現性と監査性が失われます。覚えることは「開発は Git Folders、配布は Bundles、実行は CI から CLI」の 3 点です。

この章は開発から本番までの流れを一本の線として示すところまでです。GitHub Actions と Azure DevOps のワークフロー例、環境差分の具体的な配布設計、Git フォルダの日々の運用は、それぞれ専用の解説記事で扱います。

確認 — 穴あけ 3 問

0 / 3

空欄を押すと選択肢が出ます。間違えても減点はありません。

デプロイ前に構成ファイルの記述が正しいかを確認するコマンドは databricks bundle である。

デプロイ済みのジョブやパイプラインを削除するコマンドは databricks bundle である。

GitHub Actions で Databricks CLI を導入する公式アクションは である。

この章のまとめ

  1. Git Folders の Pull はノートブックの出力を消す。作業ブランチは 1 GB まで
  2. Git フォルダ権限は NO PERMISSIONS を含む 5 段階、付与するのは 4 種
  3. 環境差分は targets に集約し、変数は --var が最優先の 5 段で解決される
  4. mode: production はブランチ一致と development: false を検証する
  5. CI は validate → deploy → run の順で、setup-cli と OIDC で認証する

この端末にだけ保存されます(登録不要)

この章の根拠

最終確認 2026-08-09 / 対応バージョン DEA 2026-05-04 改訂版

コース全体

  1. Databricks とレイクハウスの全体像 — なぜ必要か、何がどこに属し、どの計算資源で動くか
  2. データはどこに、どんな形で保存されるか — テーブルの実体と Delta Lake の内部
  3. 計算資源を作り込み、コードを書く場所を決める — クラスタ設定とノートブック/ローカル IDE
  4. Spark はどう動き、SQL で何をどこまで書けるか
  5. PySpark でデータを加工し、遅いコードを見抜く
  6. 流れ込むデータを受け止める — Structured Streaming と Auto Loader のファイル検出
  7. 取り込み時にスキーマをどう扱うか — Auto Loader のスキーマ進化と COPY INTO
  8. ファイル以外からも取り込む — read_files・Lakeflow Connect・JDBC と API
  9. 生データを使える形に育てる — メダリオン設計と宣言的パイプライン
  10. 処理を1つのジョブに束ねる — タスク種別と依存関係の設計
  11. ジョブを動かし、失敗から立て直す — トリガー・リトライ・パラメータ
  12. 書いたものを安全に本番へ届ける — Git 連携とデプロイの自動化
  13. 誰に何を見せるか — Unity Catalog のアクセス制御とアイデンティティ統制
  14. 誰が何をしたか、いくらかかったか、どこで詰まったかを見る
  15. テーブルを保守して速くする — 運用コマンド・保持期間・レイアウト設計・障害復旧
  16. DEA 直前仕上げ — 方式選定・出題範囲対応表・数値総まとめ・引っかけの型