dbt core + Snowflake を Windows ローカル環境から接続する

dbt core + Snowflake を Windows ローカル環境から接続する

Clock Icon2024.02.27

こんにちは!よしななです。
今回は、dbt core と Snowflake を Windows ローカル環境から接続する機会があったのですが、環境構築で詰まったところがあったので備忘録としてブログに残します。

目次

  • やりたいこと
  • 開発環境
  • 手順
    • 1.dbt core インストール
    • 2.Snowflake リソース作成
    • 3.dbt init の実行
  • dbt debug で接続テスト
  • dbt run の実行

やりたいこと

dbt core と Snowflake を Windows ローカル環境から接続する

開発環境

  • OS
    • Windows 11
  • コンソール
    • VSCode
      • Git Bash インストール済み

手順

1.dbt core のインストール

まずは、dbt core を Windows ローカル環境にインストールします。 以下のコードを PowerShell 上で実行し、インストールが完了するまで待ちます。

python -m pip install dbt-snowflake

2.Snowflake リソース作成

dbt core のインストールが完了したら、以下5つのリソースを Snowflake 上で作成します。

  • ロール / ユーザー
    • Snowflake ― dbt core 接続用ロール / ユーザー の作成
  • データベース
  • スキーマ
    • 作成したデータベース配下に作成
  • ウェアハウス
    • XS Standard サイズのウェアハウスを作成

Snowflake にサインインし、Worksheet 上で以下のコードを実行してください。
Snowflake サインイン手順は Snowflake のサインイン にまとめているので、こちらを参考にサインインしてください。

データベース / スキーマ / ウェアハウス リソース作成

データベース / スキーマ / ウェアハウス リソース作成は以下となります。

-- ロールの付与
USE ROLE ACCOUNTADMIN;
-- ウェアハウスの作成
CREATE OR REPLACE WAREHOUSE <任意のウェアハウス名>;
-- データベースの作成
CREATE OR REPLACE DATABASE <任意のデータベース名>;
USE DATABASE <任意のデータベース名>;
-- スキーマの作成 作成した DB 配下に schema を作成
CREATE OR REPLACE SCHEMA <任意のスキーマ名>;

ロール / ユーザー 作成

ロール / ユーザー 作成は以下となります。

-- ROLEの作成
CREATE ROLE <任意のロール名>;
-- ウェアハウスへのUSAGEアクセス権の付与
GRANT USAGE ON warehouse <任意のウェアハウス名> TO ROLE <任意のロール名>;
-- データベースへのUSAGEアクセス権の付与
GRANT USAGE ON DATABASE <任意のデータベース名> TO ROLE <任意のリソース名>;
-- スキーマへのアクセス権の付与
GRANT ALL PRIVILEGES ON SCHEMA <任意のデータベース名>.<任意のスキーマ名> TO ROLE <任意のリソース名>;
-- ユーザーの作成
CREATE USER <任意のリソース名>
    PASSWORD = <任意のパスワード>
    DEFAULT_ROLE = <任意のロール名>
    MUST_CHANGE_PASSWORD = FALSE;
-- ユーザーへのロールの付与
GRANT ROLE <任意のロール名> TO USER <任意のユーザー名>;
-- SYSADMINでリソースが見られるように親子関係の作成
GRANT ROLE <任意のロール名> TO ROLE SYSADMIN;

3.profile.yml の作成

Snowflake リソース作成が完了したら、次に profile.yml を作成します。

まず、今回作業するためのフォルダを作り、その配下に移動して、以下のコマンドを実行します。
今回の <任意の dbt project 名> は my_project にします。

dbt init <任意の dbt project 名>

dbt init コマンドを実行すると、コンソール上に profile.yml を作成するための質問が出てくるので、順番に入力していきます。

データベースの指定
今回は Snowflake を選択します。

account:

上記画像の通りに、Snowflake コンソール上のサイドバーから account 名をコピーします。
コピーした URL を <locate>.<リージョン名>.aws の形式にして、貼り付けてください。

user:
「2.Snowflake リソース作成」で作成したユーザー名を入れます。

password:
「2.Snowflake リソース作成」でユーザーを作成したときに入力したパスワード名を入れます。コード内の<任意のパスワード>に当たる部分です。

role:
「2.Snowflake リソース作成」で作成したロール名を入れます。

warehouse:
「2.Snowflake リソース作成」で作成したウェアハウス名を入れます。

database:
「2.Snowflake リソース作成」で作成したデータベース名を入れます。

schema:
「2.Snowflake リソース作成」で作成したスキーマ名を入れます。

thread:
1を入力します。

ここまで入力すると、dbt init が走り <任意の dbt project フォルダ> が生成されます。
また、C:\Users\<自分のPC名>.dbt 配下に profile.yml が生成されます。

profile.yml の中身

my_project:
  outputs:
    dev:
      account: <locate>.<リージョン名>.aws
      database: <任意のデータベース名>
      password: <任意のパスワード>
      role: <任意のロール名>
      schema: <任意のスキーマ名>
      threads: 1 ※デフォルトのまま
      type: snowflake ※今回は snowflake と dbt を接続するため snowflake を入力
      user: <任意のユーザー名>
      warehouse: <任意のウェアハウス名>
  target: dev

dbt init 実行後のフォルダ構成が以下の通りになっていれば成功です。

dbt_project.yml ファイルでは、モデルをどこに格納するか、フォルダ名などを指定することが可能です。
今回はデフォルトのままでいいので、 dbt_project.yml が作成されたら dbt debug の準備は完了となります

dbt debug 接続テスト

dbt_project フォルダまで作成できたら dbt debug の準備は完了となります。 以下のコードを実行し、接続テストを行います。

dbt debug

成功すると、以下の画面がターミナル上に出力されます。
以下の画面が出力できたら、接続確認は完了となります。

デバッグの注意点

my_project 内で dbt debug を実行しないと、 dbt_project.yml ファイルが存在しないとエラー文が返ります。

02:59:55  1 check failed:
02:59:55  Project loading failed for the following reason:
 project path <dbt_project.yml が格納されているCドライブのパス> not found

cd コマンドで my_project フォルダ内に移動してから dbt debug を実行してください。

cd my_project 

dbt run 実行

dbt debug の実行が成功したら、dbt init 実行時に登録されたサンプルモデルを動かしてみます。
以下のコードを実行します。

dbt run

成功すると、<任意の dbt project フォルダ名>/models/example 内に格納されている my_first_dbt_models.sql が実行され、「2.Snowflake リソース作成」で構築した Snowflake 上のデータベースにテーブルが作成されます。

dbt run まで実行できたので、こちらで 「dbt core と Snowflake を Windows ローカル環境から接続する」 は完了となります。ここまで読んでいただきありがとうございました!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.