❄️

dbt入門(Tips): SSO認証の煩わしさを解消 - IDトークンキャッシュで快適なdbt開発環境を実現(Snowflake編)

に公開

🚀 はじめに

この記事は dbt入門(第3弾の補足 / SSO認証改善編) です。

前回の第3弾「dbt × Snowflake ローカル開発環境構築ガイド」では、VS Code上でdbtの開発環境を構築しました。
その際、Snowflakeの認証方法として SSO(externalbrowser) を使用しました。

しかし、開発を進めていくと、地味に効いてくる問題があります。

「dbtコマンドを実行するたびに、ブラウザが起動して認証画面が開く…😰」

dbt debug、dbt run、dbt test など、何かコマンドを叩くたびにブラウザが立ち上がり、認証が終わるまで待つ。
操作はほぼ不要でも、この「ブラウザ起動」が思った以上に集中力を削ります。

この記事では、Snowflakeの 接続キャッシュ(IDトークンキャッシュ) を有効化して、
「初回だけブラウザ認証 → 2回目以降はブラウザ無し」 にする方法を解説します。

前回(第3弾)

この記事の対象読者

  • 第3弾でローカルdbt環境を構築した方
  • profiles.yml で authenticator: externalbrowser を使っている方
  • 毎回のブラウザ起動にストレスを感じている方

この記事でわかること

  • externalbrowser 認証の仕組みと「なぜ毎回ブラウザが開くのか」
  • 接続キャッシュ(IDトークンキャッシュ)の仕組み
  • Snowflake側での設定(ALLOW_ID_TOKEN)
  • ローカル環境での設定(snowflake-connector-python[secure-local-storage])
  • 動作確認の手順
  • セキュリティ面の注意点 / トラブルシューティング

📋 前提条件

この記事では以下を前提とします。

  • 第3弾の環境構築が完了している
    • Python仮想環境(例:dbt-env)が作成済み
    • dbt-snowflake がインストール済み
    • profiles.yml で SSO(authenticator: externalbrowser)を設定済み
  • Snowflakeアカウントへのアクセス権限
    • ALLOW_ID_TOKEN を変更できる権限(基本は ACCOUNTADMIN)

😓 課題:コマンドのたびにブラウザが起動する

externalbrowser 認証の動作

profiles.yml に以下のように設定すると、dbtはSSO(ブラウザベース)で認証します。

my_dbt_project:
  target: dev
  outputs:
    dev:
      type: snowflake
      account: <your_account_identifier>
      user: YOUR_SNOWFLAKE_USER
      authenticator: externalbrowser  # SSO(ブラウザベース)
      role: ACCOUNTADMIN
      database: DBT_DEV
      warehouse: COMPUTE_WH
      schema: PUBLIC
      threads: 4

このとき、dbt(正確には内部で使っているSnowflake Python Connector)が、OSのデフォルトブラウザを起動してIdP(SSO)で認証します。

図1: externalbrowser認証が毎回ブラウザを開く流れ
図1: externalbrowser は「新しい接続を張るたびに」ブラウザ認証が走りやすい。開発中は地味にストレス。

何が問題なのか

  • 作業が中断される:コマンド実行→ブラウザ起動→認証完了→ブラウザを閉じる、という流れで集中力が削がれる
  • 開発速度が落ちる:dbt run、dbt test などを何度も実行する開発フローで、毎回数秒〜十数秒待たされる
  • 不要なリソース消費:ブラウザの起動・終了が繰り返される

認証自体は自動で完了するため、「操作が必要」というわけではありませんが、ブラウザが起動すること自体がストレスになります。

💡 解決方法:IDトークンキャッシュの有効化

IDトークンキャッシュとは

Snowflakeは、SSO認証で取得したIDトークン(Identity Token) をローカルマシンにキャッシュする機能を提供しています。

図2: 接続キャッシュあり/なしの比較
図2: 初回だけブラウザ認証、以降はOSキーストアのトークンを再利用して快適に。

参考: Snowflake公式ドキュメント - Using an authenticator with external browser for SSO

仕組み:

  1. 初回:ブラウザを開いてSSO認証を行い、IDトークンを取得
  2. トークンをローカルにキャッシュ:セキュアなストレージ(keyring)に保存
  3. 2回目以降:キャッシュされたトークンを再利用して認証(ブラウザ不要)
  4. トークンが期限切れ:再度ブラウザを開いて認証(その後また再利用)

この機能を有効にすることで、トークンの有効期限内であれば、ブラウザを開かずにdbtコマンドを実行できるようになります。

必要な設定

IDトークンキャッシュを有効にするには、以下の2つの設定が必要です。

1. Snowflake側の設定

Snowflakeのアカウント/ユーザーレベルで、IDトークンキャッシュを有効化します。

2. ローカル環境の設定

Python環境に snowflake-connector-python[secure-local-storage] をインストールし、セキュアなストレージ(keyring)を使えるようにします。

図3: 設定は2ステップ
図3: Snowflake側(ALLOW_ID_TOKEN)+ローカル側(secure-local-storage)の両方が揃って初めて効く。

🔧 設定手順

ステップ1: Snowflake側の設定

Snowflakeで、IDトークンキャッシュを有効化します。

アカウントレベルで有効化する場合(推奨):

-- Snowflakeで実行(ACCOUNTADMIN権限が必要)
ALTER ACCOUNT SET ALLOW_ID_TOKEN = TRUE;

参考: ALLOW_ID_TOKEN パラメータの公式ドキュメント

設定の確認:

-- アカウントレベルの設定確認
SHOW PARAMETERS LIKE 'ALLOW_ID_TOKEN' IN ACCOUNT;

出力例:

key             | value | default | level   | ...
----------------|-------|---------|---------|----
ALLOW_ID_TOKEN  | true  | false   | ACCOUNT | ...

value が true になっていればOKです。

注意(セキュリティ)
接続トークンはOSのキーストアに保存されます。
有効化前に、社内のセキュリティポリシー(端末管理/暗号化/権限)に合っているかは確認しておくのが安全です。

ステップ2: ローカルで secure-local-storage を有効化

dbt-snowflakeは内部で snowflake-connector-python を使います。
接続キャッシュを効かせるには、Python Connector側で keyring(OSキーストア連携) が使える状態にします。

1. 仮想環境をアクティブ化

# dbt_workspace/ に移動
cd ~/dbt_workspace

# 仮想環境をアクティブ化(WSL/Linux/macOS)
source dbt-env/bin/activate

# Windows(WSLを使わない場合)
# dbt-env\Scripts\activate

プロンプトに (dbt-env) が表示されることを確認してください。

2. snowflake-connector-pythonの確認

まず、現在のバージョンを確認します。

pip list | grep snowflake

出力例:

dbt-snowflake              1.10.6
snowflake-connector-python 4.1.1

すでに snowflake-connector-python がインストールされているはずです(dbt-snowflakeの依存関係として自動的にインストールされます)。

3. セキュアストレージオプション付きで再インストール

IDトークンキャッシュに必要な追加パッケージをインストールします。

pip install 'snowflake-connector-python[secure-local-storage]' --upgrade

このコマンドにより、以下がインストールされます:

  • keyring:OSのセキュアなストレージ(macOS Keychain、Windows Credential Manager、Linux Secret Serviceなど)にトークンを保存
  • その他の依存パッケージ

参考:

インストールの確認:

pip list | grep keyring

出力例:

keyring        24.3.0

keyring がインストールされていればOKです。

✅ 動作確認(ブラウザが初回だけになることを確認)

1回目(ブラウザが開く)

# dbtプロジェクトに移動
cd ~/dbt_workspace/my_dbt_project

# 初回のdbt debug実行
dbt debug

期待される動作:

  1. ターミナルに「Initiating login request with your identity provider...」と表示される
  2. ブラウザが自動的に起動する
  3. SnowflakeのSSO認証画面が開く
  4. 認証が完了すると「You can close this browser window now.」と表示される
  5. ターミナルに戻って Connection test: [OK connection ok] と表示される

この時点で、IDトークンがローカルマシンにキャッシュされます。

2回目以降(ブラウザが開かない)

続けて、もう一度 dbt debug を実行します。

dbt debug

期待される動作:

  1. ターミナルに接続情報が表示される
  2. ブラウザは起動しない
  3. 直接 Connection test: [OK connection ok] と表示される

成功!🎉

2回目以降は、キャッシュされたIDトークンが再利用されるため、ブラウザが開かずに認証が完了します。

dbt runでも確認

念のため、dbt run でも同様に動作するか確認してみましょう。

# exampleモデルを実行
dbt run --select models/example

期待される動作:

03:28:56  Running with dbt=1.7.4
03:28:56  Found 2 models, 0 tests, 0 snapshots, 0 analyses, 348 macros, 0 operations, 0 seed files, 1 source, 0 exposures, 0 metrics, 0 groups
03:28:56
03:28:56  Concurrency: 4 threads (target='dev')
03:28:56
03:28:57  1 of 2 START sql view model PUBLIC.my_first_dbt_model ................ [RUN]
03:28:58  1 of 2 OK created sql view model PUBLIC.my_first_dbt_model ........... [SUCCESS 1 in 0.82s]
03:28:58  2 of 2 START sql view model PUBLIC.my_second_dbt_model ............... [RUN]
03:28:59  2 of 2 OK created sql view model PUBLIC.my_second_dbt_model .......... [SUCCESS 1 in 0.67s]
03:28:59
03:28:59  Completed successfully

ブラウザが開かずに、直接実行が完了します。✅

🔒 セキュリティと有効期限

トークンの保存場所

保存先は「OSのキーストア」です(keyring経由)。

OS ストレージ
macOS Keychain
Windows Credential Manager
Linux Secret Service(GNOME Keyring / KWalletなど)

セキュリティ

  • トークンは暗号化されて保存されます
  • OSのユーザー認証で保護されているため、他のユーザーからはアクセスできません

トークンの有効期限

接続トークンには有効期限があり、期限切れ時は再びブラウザSSOが走ります。
(このとき再認証すれば、またしばらくブラウザ無しで動きます。)

補足
有効期限の長さは、IdPやSSO設定側のポリシーに依存します。
「すぐ切れて困る」場合は、Snowflake管理者/IdP管理者に相談するのが現実的です。
参考: SSO認証とトークンの有効期限

📊 設定前後の比較(体感の違い)

設定前(接続キャッシュなし)

# 毎回ブラウザが開く
$ dbt debug
→ ブラウザ起動 → 認証 → 完了(約10秒)

$ dbt run
→ ブラウザ起動 → 認証 → 完了(約10秒)

$ dbt test
→ ブラウザ起動 → 認証 → 完了(約10秒)

1日に10回dbtコマンドを実行すると…

  • ブラウザ起動:10回
  • 待ち時間:約100秒

設定後(接続キャッシュあり)

# 初回のみブラウザが開く
$ dbt debug
→ ブラウザ起動 → 認証 → 完了(約10秒)

# 2回目以降はブラウザ不要(有効期限内)
$ dbt run
→ ブラウザ無しで実行

$ dbt test
→ ブラウザ無しで実行

「地味な待ち」が消えるので、開発のテンポがかなり良くなります。

余談(今回のローカル環境側の設定を全てClaude Codeで設定)

Claude Codeで一発解決

以下のように Claude Code に投げかけて全てClaude Codeにお任せして解決させました。

Claude Code への投げかけ

Snowflake側でIDトークンのキャッシュの有効化の設定がされたので、
snowflake-connector-pythonのインストールをすればいけそうなのですが、対応をお願いできますか。

Claude Codeでの設定例
Claude Code に投げかけることでパッケージのインストールや設定ファイルの更新などの作業を自動で実施してくれます

🛠️ トラブルシューティング

2回目以降もブラウザが開く(チェックリスト)

図4: 2回目以降もブラウザが開くときの確認フロー
図4: よくある原因は「Snowflake側未設定」「keyring未導入」「Linux/WSLでキーストアが使えない」です。

  • Snowflake側の設定確認

    SHOW PARAMETERS LIKE 'ALLOW_ID_TOKEN' IN ACCOUNT;
    

    value=true になっていなければ、ステップ1を見直してください。

  • ローカルでkeyringが入っているか

    python -m pip show keyring
    
  • Linux/WSLでOSキーストアが使えるか

    • GUI無し/DBus無しだと、Secret Serviceが使えずキャッシュできない場合があります
    • Ubuntu系なら gnome-keyring 等が必要になることがあります

keyringのインストールに失敗する(Linux)

ビルド系の依存が足りないことが多いです。

sudo apt update
sudo apt install -y build-essential python3-dev libdbus-1-dev libsecret-1-dev
python -m pip install --upgrade "snowflake-connector-python[secure-local-storage]"

😌 まとめ

  • externalbrowser SSOは便利だが、接続のたびにブラウザが起動しがち
  • Snowflakeの 接続キャッシュ(IDトークンキャッシュ) を有効化すると、2回目以降ブラウザ不要になる
  • 設定は2ステップだけ
    1. Snowflake側:ALTER ACCOUNT SET ALLOW_ID_TOKEN = TRUE;
    2. ローカル:pip install "snowflake-connector-python[secure-local-storage]"
  • トークンはOSのキーストアに保存され、期限切れ時は再認証

開発のテンポが一段上がるので、externalbrowser 勢にはかなりおすすめです。

🔗 参考リンク

Snowflake公式ドキュメント

snowflake-connector-python

keyring

Discussion