【環境構築/dbt core】CLIのdbt(dbt core)をSnowflakeに接続してETLできるようにするための手順

# 今回の課題
dbt coreを使って、SnowflakeのデータをETLできるように環境構築を行う。
環境構築する際に時間がかかったので、進めた手順を記録することにした。


# 進めた手順
進めた手順は以下の通り。

※手順`1)`と`2)`はつまずかなかったので、
　他の方が投稿されている記事を引用する形で、簡単に書きました。
## 1)Hemebrewでdbtをインストール
添付の記事を参考にしながら、以下の通りに進めた。
* `$ brew install dbt-snowflake`コマンドでdbtをインストール
* インストールしたら`$ dbt --version`でdbtがインストールされているか確認
└dbtのバージョンについての情報が返ってくれば、インストールされている。

https://zenn.dev/gak_t12/articles/8b4f5db79a4453#installing-with-homebrew

## 2)dbtを最新バージョンにアップデート
`1)`で`$ dbt --version`でdbtがインストールされているか確認したところ、
古いバージョンがインストールされていることが分かった。

念のため以下の記事の`Installing with Homebrew
`という見出しの手順を参考に、
dbtの最新バージョンをインストールしておいた。

https://zenn.dev/gak_t12/articles/8b4f5db79a4453#installing-with-homebrew

## 3）profiles.ymlを作成する


`profiles.yml`とは、dbtの接続先（データベースやウェアハウス、スキーマ）についての設定を記述しておくファイルのこと。
※下記の公式ドキュメントにテンプレートが用意されている。

https://docs.getdbt.com/reference/warehouse-setups/snowflake-setup

dbtをCLIで使用する場合`profiles.yml`ファイルが必要なようなので、
以下の手順で`profiles.yml`を用意した。
### 3)-1.ホームディレクトリに`/.dbt`ディレクトリを作成する
以下のコマンドを実行して、ローカルのホームディレクトリに`/.dbt`ディレクトリを作成する
```
$ touch ~/.dbt
```
### 3)-2.`/.dbt`ディレクトリ内に`profiles.yml`を作成する。
以下のコマンドを実行して`/.dbt`ディレクトリに`profiles.yml`を作成する。
```
$ touch ~/.dbt/profiles.yml
```

### 3)-3.`profiles.yml`に記述を行う。
接続するDWHの情報を入力する。

* 以下のように複数のoutputs先を設定しておくことも可能。
    * `dbt run`を実行すると、`target`に設定している`dev`の方に記載のDWHに出力される。
    * `dbt run --target dev2`を実行すると、`dev2`の方に記載のDWHに出力される。
```yml
my-project:
  target: dev
  outputs:
    dev:
      account: *******.ap-northeast-1.aws # '[アカウント名].[リージョン名].aws'という形式で記述する。
      database: *******
      password: *******
      role: *******
      schema: *******
      type: snowflake
      user: ******* # Snowflakeにサインインする時に入力する'ユーザー名'と同じ
      warehouse: *******
    dev2:
      account: *******.ap-northeast-1.aws
      database: *******
      password: *******
      role: *******
      schema: *******
      type: snowflake
      user: *******
      warehouse: *******
```



## 4)dbtプロジェクトを作成する
以下のコマンドを打って、`~/.dbt`ディレクトリに`my_project`を作成する。
`dbt init [プロジェクト名]`はprofiles.ymlの接続情報を元に、プロジェクトを作成してくれる。
```
$ dbt init my_project
```

## 5)dbt_project.ymlを作成
`dbt_profiles.yml`ファイルはプロジェクトの設定を記述するファイルのこと。
プロジェクト名やバージョン、モデルの配置先などを記述する。

※以下の記事に`dbt_project.yml`の各タグについて書かれている。

https://zenn.dev/foursue/books/31456a86de5bb4/viewer/7fce02#%E5%90%84%E3%82%BF%E3%82%B0%E3%81%AE%E8%AA%AC%E6%98%8E


手順としてはまず以下のコマンドで、`~/.dbt/my_project`配下に`/dbt_project.yml`を作成し、
```
$ touch ~/.dbt/my_project/dbt_project.yml
```
`dbt_project.yml`に以下の通りに記述をした。

```yml
name: my_project # プロジェクト名をつける。プロジェクト名は小文字とアンダースコアのみ使える。
version: '1.5.0'
profile: my-project # DWの接続設定名を指定する。profiles.ymlファイルに記載しているプロファイル名を指定する。


# モデルやスナップショットのコードのパスを指定しておく項目
source-paths: ["models"] # source-pathsは、models/ディレクトリ
analysis-paths: ["analysis"] # analysis-pathsは、analysis/ディレクトリ
test-paths: ["tests"] # test-pathsは、tests/ディレクトリ
data-paths: ["data"] # data-pathsは、data/ディレクトリ
macro-paths: ["macros"] # macro-pathsは、macros/ディレクトリ
snapshot-paths: ["snapshots"] # snapshot-pathsは、snapshots/ディレクトリにあることを意味している。

target-path: "target"  # コンパイルしたSQLファイルをtarget/ディレクトリに出力することを意味している
clean-targets: [target, dbt_packages] # dbt cleanコマンドを実行したときに削除するディレクトリを指定する項目。

# プロジェクト内のモデルをどういった形式（テーブルなのかビューなのかなど）で出力するのか指定しておく項目
models:
  my_project:
    example:
      materialized: view
```

## 6)`dbt debug`で接続テスト
最後に`$ dbt debug`を実行して、dbtからSnowflakeへの接続が成功するか確認をした。
```terminal
a.yamaguchi@ayamaguchiMacBook-Air .dbt % dbt debug
07:36:42  Running with dbt=1.5.0
07:36:42  dbt version: 1.5.0
07:36:42  python version: 3.9.16
07:36:42  python path: /opt/homebrew/Cellar/dbt-snowflake@1.5.0/1.5.0/libexec/bin/python3.9
07:36:42  os info: macOS-13.3.1-arm64-arm-64bit
07:36:42  Using profiles.yml file at /Users/a.yamaguchi/.dbt/profiles.yml
07:36:42  Using dbt_project.yml file at /Users/a.yamaguchi/.dbt/dbt_project.yml
07:36:42  Configuration:
07:36:42    profiles.yml file [OK found and valid]
07:36:42    dbt_project.yml file [OK found and valid]
07:36:42  Required dependencies:
07:36:42   - git [OK found]

07:36:42  Connection:
07:36:42    account: *******.ap-northeast-1.aws
07:36:42    user: *******
07:36:42    database: *******
07:36:42    schema: *******
07:36:42    warehouse: *******
07:36:42    role: *******
07:36:42    client_session_keep_alive: False
07:36:42    query_tag: None
07:36:43    Connection test: [OK connection ok]

07:36:43  All checks passed!

```

成功しました！


# まとめ
以上のような手順で進めることで、CLIでdbtを操作してSnowflakeのデータをETLすることができるように設定できた。
`profiles.yml`や`dbt_project.yml`ファイルについての理解も深めることができた。