profiles.yml は dbt の実行時接続を定義する中核ファイルです。環境ごとに安全かつ再現性高く切り替えられる設計にしておくことは、開発効率と事故防止の両方に直結します。
この記事では、Analytics Engineer 試験で問われやすいポイント(プロファイル探索順序、ターゲット解決の優先度、アダプタ別の主要キー、env_var の使い方)を、実務に落ちる具体例とともに解説します。
dbt は dbt_project.yml の profile 名と一致するエントリを profiles.yml から読み込み、選択された target の outputs を用いて接続します。profiles.yml の標準パスはユーザディレクトリ配下で、DBT_PROFILES_DIR を指定すると別の場所を参照できます。これは CI でリポジトリ直下に置きたい場合などに有効です。
構造は profile 名の下に target(既定の実行環境名)と outputs(環境ごとの接続定義)が並びます。outputs にはアダプタ固有のキー(例: Snowflake の account, warehouse、Databricks の host, http_path など)を記述します。安定仕様として profiles.yml では Jinja と env_var が利用でき、秘密情報の直接記載は避けます。
最小の profiles.yml スケルトン(Snowflake 例)
ja_lab:
target: dev
outputs:
dev:
type: snowflake
account: {{ env_var('SF_ACCOUNT') }}
user: {{ env_var('SF_USER') }}
password: {{ env_var('SF_PASSWORD') }}
role: ANALYST
database: ANALYTICS
warehouse: WH_XS
schema: dev
threads: 4
stg:
type: snowflake
account: {{ env_var('SF_ACCOUNT') }}
user: {{ env_var('SF_USER') }}
password: {{ env_var('SF_PASSWORD') }}
role: ANALYST
database: ANALYTICS
warehouse: WH_S
schema: stg
threads: 6
prod:
type: snowflake
account: {{ env_var('SF_ACCOUNT') }}
user: {{ env_var('SF_USER') }}
password: {{ env_var('SF_PASSWORD') }}
role: PROD_ROLE
database: ANALYTICS
warehouse: WH_M
schema: prod
threads: 8ターゲットの解決は優先度があり、CLI の --target が最も強く、その次に環境変数 DBT_TARGET、最後に profiles.yml の target が使われます。CI では明示的に --target を指定し、ローカルの開発では DBT_TARGET を一時的に設定する運用が扱いやすいです。
環境名は dev/stg/prod など短く衝突しない命名を推奨します。--profiles-dir と組み合わせることで、モノレポでもプロジェクト単位の profiles.yml を安全に参照できます。
ターゲット解決の流れ
切替コマンド例
# 一時的に stg で実行
export DBT_TARGET=stg
dbt run
# CI では明示的に指定
dbt build --target prod --profiles-dir .
# 確認(接続検証)
dbt debug --target devprofiles.yml はバージョン管理に含める前提で設計し、秘密情報はすべて env_var で参照します。dbt は Jinja を解釈し、env_var('KEY') の値を実行時に埋め込みます。これによりパスワードやトークンをコードに残さず、安全に環境差分を表現できます。
CI/CD では各ランナーのシークレット機能で環境変数を注入します。Databricks は個人アクセストークン、Snowflake はパスワードに加えキーペア認証や OAuth なども利用可能です。運用要件に応じて選択し、最低権限ロールを環境別に割り当てます。
env_var を使った安全なプロファイル記述(抜粋)と環境変数設定例
# profiles.yml(抜粋)
ja_lab:
target: dev
outputs:
dev:
type: snowflake
account: {{ env_var('SF_ACCOUNT') }}
user: {{ env_var('SF_USER') }}
password: {{ env_var('SF_PASSWORD') }}
role: {{ env_var('SF_ROLE', 'ANALYST') }}
database: ANALYTICS
warehouse: {{ env_var('SF_WAREHOUSE', 'WH_XS') }}
schema: dev
# Databricks 例(token 認証)
dev_dw:
type: databricks
catalog: hive_metastore
schema: dev
host: {{ env_var('DB_HOST') }}
http_path: {{ env_var('DB_HTTP_PATH') }}
token: {{ env_var('DB_TOKEN') }}
threads: 4
# ローカル環境変数設定(例)
export SF_ACCOUNT="xy12345.ap-southeast-1"
export SF_USER="analyst"
export SF_PASSWORD="..."
export DB_HOST="adb-123456789.11.azuredatabricks.net"
export DB_HTTP_PATH="/sql/1.0/warehouses/xxxx"
export DB_TOKEN="dapi..."アダプタごとに必須キーや推奨の認証方式が異なります。環境差分をどこで持つべきか(例: Snowflake は warehouse/role、Databricks は http_path や catalog/schema、Postgres はホストやデータベース)を決めておくと、profiles.yml が簡潔になります。
試験では、各アダプタの type 名、代表的な必須キー、そして環境切替のポイントを把握しているかが問われやすいです。
| アダプタ | 主な必須キー | 認証の要点 | 環境差分の典型 |
|---|---|---|---|
| Snowflake | account, user/password または key/oauth, role, database, warehouse, schema | パスワード/キーペア/OAuth を選択可。role と warehouse は明示推奨 | warehouse のサイズ/名称、role、schema(dev/stg/prod) |
| Databricks(SQL Warehouse) | host, http_path, token, catalog(任意), schema | 個人アクセストークンまたは PAT を利用。http_path は Warehouse/Cluster で異なる | http_path(接続先の切替)、catalog/schema、threads |
| Postgres | host, port, dbname, user, password, schema | シンプルなユーザ/パス認証。接続プールや SSL 設定は環境ごとに差分化 | host/port/dbname、schema、sslmode |
Databricks SQL Warehouse の最小設定例
ja_lab:
target: dev_dw
outputs:
dev_dw:
type: databricks
schema: dev
host: {{ env_var('DB_HOST') }}
http_path: {{ env_var('DB_HTTP_PATH') }}
token: {{ env_var('DB_TOKEN') }}
threads: 4YAML アンカーと Jinja を併用すると、環境差分を最小限に保てます。ベース定義を &base でまとめ、dev/stg/prod では差分のみ上書きします。schema や role、warehouse は target.name や環境変数で動的に決めると管理が容易です。
threads やリトライ設定などの実行系パラメータも環境変数で制御すると、CI とローカルで同一の profiles.yml を共有しやすくなります。
アンカーと Jinja で環境差分を最小化
ja_lab:
target: dev
outputs:
base: &base
type: snowflake
account: {{ env_var('SF_ACCOUNT') }}
user: {{ env_var('SF_USER') }}
password: {{ env_var('SF_PASSWORD') }}
database: ANALYTICS
role: {{ env_var('SF_ROLE', 'ANALYST') }}
warehouse: {{ env_var('SF_WH', 'WH_S') }}
schema: analytics_{{ target.name }}
threads: {{ env_var('DBT_THREADS', 4) | int }}
dev:
<<: *base
stg:
<<: *base
warehouse: {{ env_var('SF_WH_STG', 'WH_M') }}
prod:
<<: *base
role: PROD_ROLE
warehouse: {{ env_var('SF_WH_PROD', 'WH_L') }}
threads: {{ env_var('DBT_THREADS_PROD', 8) | int }}profiles.yml 周りのエラーは原因が特定しやすい反面、設定ミスが多発します。dbt debug をまず実行し、プロファイル検出、資格情報、権限の順に切り分けます。試験では、プロファイル探索、ターゲット解決、権限設計の知識が問われやすいです。
代表的な症状と対処は次の通りです。
チェックリスト用コマンド
# プロファイル探索と接続検証
dbt debug --profiles-dir . --target dev
# 実行ターゲットの明示
dbt run --target stg
# テストまで一括
dbt build --target prodAnalytics Engineer
問題 1
ローカルで DBT_TARGET=prod を設定した状態で、CI が dbt build --profiles-dir . --target stg を実行し、profiles.yml の target は dev に設定されています。最終的に使用されるターゲットはどれか。
正解: A
ターゲット解決は --target > DBT_TARGET > profiles.yml の順で評価されるため、--target stg が最終的に採用される。
profiles.yml はどこに置くべきですか?DBT_PROFILES_DIR はいつ使いますか?
既定はユーザディレクトリ配下の ~/.dbt/profiles.yml(Windows は %USERPROFILE%\.dbt\profiles.yml)です。リポジトリ直下に置いて CI と共有したい場合や複数プロファイルを使い分けたい場合は、DBT_PROFILES_DIR でディレクトリ(例: プロジェクトルート)を指定します。
Snowflake で環境ごとに warehouse と role を切り替えるベストプラクティスは?
profiles.yml の outputs を dev/stg/prod に分け、role と warehouse を環境ごとに明示します。env_var と YAML アンカーを併用すると差分だけを管理でき、運用が簡潔になります。例: dev/stg は ANALYST ロール、prod は PROD_ROLE とする。
dbt Core の CI/CD で秘密情報はどう管理しますか?
profiles.yml では env_var を参照し、値は CI のシークレット管理(GitHub Actions の secrets、GitLab CI の masked variables など)で注入します。.env を使う場合は必ずリポジトリから除外し、ローカル開発のみに限定します。
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)、設定優先度...