dbt + PostgreSQL on Docker 開発環境セットアップ手順


# 0. この記事は何か
いろいろあって、Dockerとdbtを評価してみたくなりまして。 

ということで、これまでExcelマクロ等で行っていた、担当システムのインシデント分析を、ざっくりdbt on Dockerに移そうとしています。 

本記事は、その開発環境(評価環境)のセットアップ手順で、一般に公開する意味があるのか微妙なのですが、まあ、誰かの参考になればと。 

内部のツールでしかないので、規模は小さく品質も適当ですが、一応、実務で使うことを前提に作っているモノなので、その辺に転がっているサンプルよりは、参考になることもあるんじゃないかな、あればいいな、と思いまして。

構成は、ローカルWindowsのWSL上にDockerの開発コンテナを立てる形で、 DBはPostgreSQLを使用しています。図にすると以下のような感じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/91d5dc5d-2298-40bc-9ac3-fb38a6902c06.png)

詳しくは後述しますが、Visual Studio Codeのリモートウィンドウの機能を利用して、「WSLへの接続」⇒「コンテナーで再度開く」でアプリ用コンテナに接続することで、開発作業が行えるようになります。

あまり詳しくない担当者も想定しているので、まっさらな状態から状態からの手順を、かなり細かく記載しています。識者にとっては冗長だと思うので、そのあたりは適当にすっ飛ばしてください。 

# 1. WSL2の導入
WindowsにWSLでLinux乗っけるために、まずWSL2を導入します。

ホストOS(Windows)のPowershellで以下を実行します。このコマンド一発で、機能の有効化だけでなく、Linux OS(Ubuntu)イメージの展開まで行われます。

```powershell:
wsl --install
```
あと、好みに応じてですが、以下のページの「Ubuntuの配置先を変更」も実施してください。 

https://qiita.com/rabut/items/a522bf6408e3a9b69937

# 2. VPN(GlobalProtect)対応の実施
GlobalProtectのSIG(Secure Internet Gateway)環境内で開発環境を使用する場合、以下の作業を実施してください。

https://qiita.com/rabut/items/1ef5a3c6ddd1dc37e389


# 3. Dockerのセットアップ
## 3.1. Dockerセットアップ 
WSL上のLinux(Ubuntu)にDockerをセットアップします。 
以下の記事の「Dockerエンジン(Linux側)のインストール」を実施してください。 

https://qiita.com/rabut/items/a522bf6408e3a9b69937

## 3.2. ユーザ権限の調整 
WSL上のLinuxのデフォルトユーザにDocker関連の操作の権限を付与します。 
__※以降、WSL上のLinuxのディストリビューション名が「Ubuntu」であることを前提に手順を記載します。__


Ubuntuで以下を実行してください。 
※「rabut」の部分をWSLのデフォルトユーザ名に置き換えて実施してください。
```
sudo usermod -aG docker rabut
```



# 4. Visual Studio Code のセットアップ
## 4.1. Visual Studio Code のインストール
ホストのWindowsに、とりあえず、Visual Studio Codeをインストールします。
やり方がわからなければ、以下のページなどを参考に。

https://www602.math.ryukoku.ac.jp/Prog1/vscode-win.html

## 4.2. Visual Studio Codeへのアドイン追加
Visual Studio Codeにアドインをインストールします。 
ひとつ前の「Japanese Language Pack」のインストールと同じ手順で実行できます。 

WSL
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/1199dd65-e836-47d4-8f58-20c9d77bdd6b.png)

Dev Containers
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/e6cc3254-0091-44d1-af13-2dcfcfe423d5.png)

# 5. 資産の展開とビルド
資産を展開して、開発環境を起動・接続します。

やっていることの全体像は以下の通りです。この図を見ながら手順を追ってもらえると、何をやっているのかが追いやすくなると思います。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/3df0fb2b-5ceb-4133-ac78-858bff9418cc.png)


## 5.1. 資産の展開
まず、Visual Studio Codeを起動して、左下の「リモートウィンドウを開きます」ボタンをクリックし、表示された選択肢から「WSLへの接続」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/f2dd2620-126c-4df7-8f18-05fc324ae790.png)

左下のステータスが「WSL: Ubuntu」に変わったことを確認します。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/e4b2dc0e-45f3-43a6-b899-1f7660d556a7.png)

Ctrl + Shift + P でコマンドパレットを開き、「git clone」を入力します。選択肢が表示されるので「Git Clone」をクリックします。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/8e2481ab-8da3-4f95-904c-cabef5fba5e2.png)

以下のURLを入力し、表示された「リポジトリのURL」をクリックします。
「https://github.com/rabut001/qatools.git」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/9f3024ad-8eeb-44bb-9754-562dc32e2107.png)


リポジトリの展開先の選択画面欄が表示されるので、適当なディレクトリを選択してください。一応、初期値(ユーザのホームディレクトリ)でも大きな問題はないかと思います。 
__※ここで指定したリポジトリの展開先は記憶しておいてください。後に再度環境を起動するとき必要になります。__   
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/99983472-65e5-4c81-9b7e-2e761a720b67.png)

「クローンしたリポジトリを開きますか？」と聞かれるので「開く」をクリックします。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/bc0c79c0-7b21-4f4f-8f31-392be9deed41.png)

作成者を信頼しますか？と表示されるので、「はい。作成者を信頼します」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/dcc88e3e-8161-4168-8890-6cfd4213b357.png)

「コンテナーで開発するフォルダをもう一度開きます」と表示されるので、「コンテナーで再度開く」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/f54f63ca-b165-43ff-8d03-28399c2cceee.png)

開発コンテナーに接続した状態で環境が起動しますので、以下のフォルダに分析対象のシステムに対応した各ファイルを配置してください。とりあえずは直下の「sample」フォルダから全ファイルをコピーしてくる形でよいです。
/workspace/app/conf 
/workspace/app/seeds 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/f3b06bfa-0bad-48df-a81e-88d9c962d5d1.png)


## 5.2. ビルド
まず「Ctrl + @」でターミナルを起動し、以下のコマンドを実行しseedを作成します。 
※このコマンドはインシデント管理システムと接続できる状態でないとエラーになるため、一般の方は実行しなくて大丈夫です。 
```
python /workspace/app/scripts/generate_seeds_from_qaweb.py
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/a77c1fe8-e216-4166-97c5-adeebf9c4c07.png)

同じくターミナルから、以下のコマンドを実行します。
```
cd /workspace/app
dbt build
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/afd8a875-1244-48f0-8844-25439d620b24.png)


処理が実行され「Completed Successfully」が表示されればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/93bf31ab-5add-40a4-888c-9e42692c7df4.png)

dbtの開発環境のセットアップとしては、ここまで実施すれば完了です。  

# 6. Visual Studio Codeの接続先切り替えについて
ここまで手順通りに実施した場合、次回Visual Studio Codeを起動すると、アプリ開発用コンテナに接続した状態で画面が起動します。 

しかし、gitやコンテナ系の作業はUbuntu側で行う必要があり、また、単純にリモートウィンドウを切断したい場合もあると思います。 

ということで、以下、リモートウィンドウの切断／切り替え手順を説明します。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/154351fa-5e14-4d03-88dc-d31a58a7c529.png)

- リモートウィンドウの切断
  画面左下の「リモートホスト」⇒「リモート接続を終了する」
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/3c340ccb-d567-42cf-aceb-ccd16ba0cfa5.png)  
&nbsp;  

- WSL(Ubuntu)への接続
  リモートウィンドウが切断されている状態で、画面左下の「リモートホスト」⇒「WSLへ接続」
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/897e1a51-424b-4f55-9dc9-12ced376eb77.png)  

  「フォルダを開く」⇒ 「5. 資産の展開と起動で指定したリポジトリの展開先 + /qatools」を入力し「OK」
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/5a511a82-bf9f-4275-8b1a-1a46fabc7a36.png)

  ※アプリ開発コンテナに接続した状態であれば、「リモートホスト」⇒ 「WSLでフォルダーをもう一度開く」でも行けます。 
&nbsp;  

- アプリ開発用コンテナ(qatools)への接続
  WSL(Ubuntu)へ接続した状態にした後、「リモートホスト」⇒「コンテナーで再度開く」
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/a8783e4e-6279-496e-81a8-12d92cdd5431.png)




# 7. PostgreSQL クライアント環境の準備
ホストのWindows上にPostgreSQLのクライアントとレポート(Excel)の実行環境を準備します。  

:::note info
本章は、DBの中身を確認したり[^1]、報告用のレポート(Excel)を出力するため手順です。dbtの評価のみが目的なら、実施は不要です。
:::

[^1]:ちなみにDBの中身の確認(単発のSQLの実行など)は、Visual Studio Codeに何かのアドインを入れてやりたかったのですが、dbtのmodelの拡張子が.sqlで、dbt Power Userが干渉してしまうので、pgAdminを外だしでWindows側に導入しています。このやり方は不格好で気に入らないのですが、どう対応するのが一般的なのですかね。調べた範囲では、変化球ですが[このページ](https://zenn.dev/onozaty/articles/postgresql-pgadmin-container "PostgreSQL と PgAdmin4 を Docker Compose で立ち上げる")のpgAdmin用のコンテナを追加する方法はアリかなとは思ったのですが。開発環境をコンテナに閉じ込めるという観点ではイケているので。ただ今回は、端末のリソース的に専用コンテナの追加が微妙だったため、採用できませんでした。

## 7.1. pgAdminとODBCドライバのインストール
以下のページに従って、Windows側にpgAdminとODBCドライバをインストールしてください。

https://qiita.com/rabut/items/1378c6b53decc82eeaf8

## 7.2. pgAdminの構成
pgAdminに接続情報をセットアップします。

:::note info
本章の作業は開発コンテナを起動した状態※で行ってください。
※Visual Studio Codeでアプリ開発用コンテナに接続した状態(画面の左下に「開発コンテナー：qatools」と表示された状態)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/9f6a45fc-6cbb-43a2-b8c3-ef4cd7697366.png)
:::

スタートからpgadmin等で検索し「pgAdmin 4」を起動(クリック)します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/a69ae0f6-3964-43df-88aa-97c40d89ed66.png)

pgAdminが起動するので、「Servers」⇒「Register」⇒「Server」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/4da232dc-a04a-4b75-a979-f4b969f213aa.png)


Register - Server画面が起動するので、以下を入力して「Save」をクリックします。
Generalタブ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/3a595139-8a4f-42b0-9433-c77ab8d7ab9a.png)

Connectionタブ (※Passwordは「6v@lu@t!0n」)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/ba0ec9a4-f631-4506-816c-989811a8269d.png)

Server配下に「qatools」が追加され、中身が見えるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/97039e0a-2120-47cb-85f9-6705326be509.png)

## 7.3. ODBC(DSN)の構成
ODBCの接続情報(DSN)をセットアップします。

スタートから「odbcad32」等で検索し「ODBCデータソース(64ビット)」を起動(クリック)します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/c166f8b4-73bc-477c-91d8-b7f6632f33c4.png)

起動した画面で「システムDSN」タブを選択し「追加」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/234c66ea-3914-4e6e-a43c-df3276939f26.png)

「PostgreSQL Unicode(x64)」を選択し「完了」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/060620fb-66c2-428c-86fa-d2900cb139dd.png)

PosgreSQL Unicode ODBCセットアップ画面が起動するので、以下を入力 (※パスワードは「6v@lu@t!0n」)した後、「データソース」をクリックします。Portも指定する点に注意してください。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/42f87e64-50ea-4f23-a4b9-b7d9249f3704.png)

高度な設定画面が起動するので「Declare～Fetchを使用する」にチェックを入れ「OK」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/2ebb13ab-f73b-461b-af96-d2fe0077727b.png)

元の画面に戻るので「保存」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/27f98771-41ad-43eb-80a6-da751de12806.png)


## 7.4. サンプルレポートの実行
作成したデータをサンプルレポート(Excel)に取り込んでみます。

:::note info
本章の作業は開発コンテナを起動した状態※で行ってください。
※Visual Studio Codeでアプリ開発用コンテナに接続した状態(画面の左下に「開発コンテナー：qatools」と表示された状態)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/9f6a45fc-6cbb-43a2-b8c3-ef4cd7697366.png)
:::

以下のExcelファイルをWindows側にコピーして起動します。
/app/reports/sample/sample_report.xlsx

データ⇒すべて更新 を実行します。データがエラー無く取り込めればOKです。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/5e485dfb-5293-475c-94e9-de6d32073fd0.png)

※初回はID/パスワードの入力を求められるかもしれないので、その場合はqatools/6v@lu@t!0nを入力してください。 

※データの取り込みは完了しても特に通知はありません。少々分かりにくいですが、取込みの実行中、ステータスバーに「データを取得しています」等のメッセージが表示されますので、これが止まればデータの取り込みが完了したと考えていただいてよいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/d5442f79-e9c4-4428-aced-059275f89810.png)


# 8. データの削除設定
諸般の事情により、インシデント管理システムのデータをローカルに残したくない場合、以下の手順を実施することで、PCのシャットダウン(正確にはログオフ)時に、自動でデータが削除されるよう設定できます。

※サンプルデータしか使わない場合、本章は実施不要です。  

## 8.1. 削除バッチの作成
以下の内容を、Windows側の任意のフォルダにバッチファイルとして格納してください。 
例えば、「D:\wsl\wsl001\qatools_data_remove.bat」など。

```bat
@echo off
setlocal

rem set log file name
set FILE_PREFIX=%~n0
set FOLDER_NAME=%~dp0
set LOG_FILE=%FOLDER_NAME%%FILE_PREFIX%.log

rem set base directory
set BASE_DIR=/home/rabut

rem log date time
echo ------------------------------------- >> %LOG_FILE%
echo %DATE% %TIME% >> %LOG_FILE%

rem remove files
echo. >> %LOG_FILE%
echo remove files >> %LOG_FILE%
wsl rm -f %BASE_DIR%/qatools/app/seeds/seed_qaweb__incident_comments.csv  >> %LOG_FILE%  2>>&1
wsl rm -f %BASE_DIR%/qatools/app/seeds/seed_qaweb__incidents.csv >> %LOG_FILE%  2>>&1

rem remove database contents
echo. >> %LOG_FILE%
echo remove database contents >> %LOG_FILE%
wsl docker container stop qatools_postgres >> %LOG_FILE%  2>>&1
wsl docker container rm qatools_postgres >> %LOG_FILE%  2>>&1
wsl docker volume rm devcontainer_qatools_data_volume >> %LOG_FILE%  2>>&1

rem shutdown wsl
echo. >> %LOG_FILE%
echo shudown wsl >> %LOG_FILE%
wsl --shutdown  >> %LOG_FILE%  2>>&1
echo. >> %LOG_FILE%

endlocal
```

その上で、以下の部分を「5. 資産の展開と起動で指定したリポジトリの展開先」で指定したディレクトリに変更してください。 
```bat
rem set base directory
set BASE_DIR=/home/rabut
```

## 8.2. ログオフスクリプトへの登録
作成したバッチをログオフスクリプトに登録します。

コマンドプロンプトから「gpedit.msc」を実行しローカルグループポリシーエディターを起動、「ユーザーの構成」⇒「Windowsの設定」⇒「スクリプト(ログオン/ログオフ)」を選択し、 「ログオフ」をダブルクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/b309022c-07ce-461f-b776-4fb8ef8adf2e.png)

「ログオフのプロパティ」が起動するので、「スクリプト」タブから「追加」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/84fdec97-008f-494a-9a0b-774eedabb85c.png)

「スクリプト名」に作成した削除バッチを入力し、「OK」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/9c90f692-baf2-4def-8833-ad740c2b3f89.png)

戻った画面で「OK」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/537ff215-329c-4dcc-bf54-774d250e2ecc.png)

## 8.3. 動作確認
まず、以下の二点を確認します。
※削除対象ファイルやDBの中身がない場合は、「5.2. ビルド」を実行して作成してください。

- 削除対象ファイルが存在すること
  Visual Studio Codeからアプリ開発用コンテナに接続し、以下のファイルが存在していることを確認。
  
  /workspace/app/seeds/seed_qaweb__incident_comments.csv
  /workspace/app/seeds/seed_qaweb__incidents.csv

  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/f094094a-02a4-4934-86e2-1c17b02f0642.png)
&nbsp;  

- DBの中身が存在すること
  pgAdminからデータベース「dev」の中に、テーブルが作成されていることを確認してください。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/7c6d245e-b2e2-477f-a386-d89feee091c3.png)


次にPCを再起動して、削除対象ファイルやDBの中身が消えていることを確認してください。


- 削除対象ファイルが消えていること
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/65f26635-3f78-411a-bb69-40e722f6e1d6.png)
&nbsp;  

- DBの中身が消えていること
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/0008bd22-589c-43c3-8499-a43319d38fe5.png)


なお、これらのファイルやDBの中身は「5.2. ビルド」を実行することで再作成できます。