dbtからAmazon Athenaにつないで使ってみる

# 概要
データ基盤でETL処理を効率的に行うdbtなんですが、標準ではAmazon Athenaが
サポートされていません。有志によるAthena用のpluginは作成されているので、
それを使ってAtenaに接続する流れをまとめてみました。

# 前提
動作確認バージョン

```
python 3.9.5
```
pythonの環境はpyenv使うなりご自由にどうぞ。
私はpyenvとvenvで構築しました。


# 手順
### 1. dbtのインストール
基本的には公式ドキュメントにそって行うだけですが、１点注意があります。
Athena用のモジュールであるdbt-athenaが `0.20.0` までしか対応していないので、
必ず下記のようにバージョン指定でインストールしてください。
指定せずにインストールすると、`0.20.1` が入ります。

```zsh
pip install dbt==0.20.0
```

終わったらバージョンを確認しておきます。
最新じゃないよ！と言われますが、これでOKです。

```zsh
> dbt --version
installed version: 0.20.0
   latest version: 0.20.1

Your version of dbt is out of date! You can find instructions for upgrading here:
https://docs.getdbt.com/docs/installation

Plugins:
  - bigquery: 0.20.0
  - snowflake: 0.20.0
  - redshift: 0.20.0
  - postgres: 0.20.0
```

### 2. dbt-athenaのインストール
dbt-athenaのREADMEにそってインストールします。

```zsh
# 最新のコマンドはGithub確認のこと
pip install git+https://github.com/Tomme/dbt-athena.git
```

インストール後、もう一度確認すると、athena用のpluginが入っている事がわかります。

```zsh
> dbt --version
installed version: 0.20.0

〜 省略 〜

Plugins:
  - bigquery: 0.20.0
  - snowflake: 0.20.0
  - redshift: 0.20.0
  - postgres: 0.20.0
  - athena: 0.20.0
```

### 3. profiles.ymlの作成
ここからはdbt動作のための設定です。
まず `~/.dbt/profiles.yml` を編集します。
このファイルはdbtインストール時に自動的に作成されるもので、
今回はAthena用の接続設定を作成するので、下記のようなymlになります。

```yaml:profiles.yml
athena-conn:
  target: dev
  outputs:
    dev:
      type: athena
      s3_staging_dir: s3://dbt-sample-result/
      region_name: ap-northeast-1
      schema: dbt
      database: awsdatacatalog
      aws_profile_name: user-profile
```

「athena-conn」のところは、この接続の名前なので任意のもので構いません。
s3_stagion_dirは発行SQLの結果を保存するバケットになります。~~（実際のデータを保存するわけではないです）~~
→間違いでした。dbtから発行されたデータは基本、デフォルトではこのディレクトリに保存されるようです。

databaseは、少し紛らわしいですが、Athenaでいうところの「Datasource」で、標準だと
awscatalogになると思います。この項目は英小文字しか許可されていないので注意ください。

![スクリーンショット 2021-08-27 1.03.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23578/a6c53c51-3f78-7eb0-97bf-3bed9861f9b8.png)

aws_profile_nameはdatabaseに接続するためのprofileで、
dbt-athenaでは、credential情報は保持せず、profile指定で接続するようでした。
また、接続に使用するユーザーは `athena:StartQueryExecution` の権限が必要なので、
権限付与しておいてください。（もしかすると他にも必要な権限あるかもです）

### 4.dbtのプロジェクト作成
dbtのプロジェクトを作成します

```zsh
dbt init test-project
```

サンプルのモデルやREADMEなどが作成されます。

### 5. dbt_project.ymlの修正
4で作成したプロジェクトにある `dbt_project.yml` がプロジェクトの設定ファイルになっていて、
この中に使用する接続情報を記載するところがあるので、profiles.ymlで作成した名前に修正します。

```yml:dbt_project.yml
profile: 'athena-conn'
```

### 6. 接続テスト
これでdbtの設定は完了なので、`dbt debug` で接続テストします。

```zsh
> dbt debug

Running with dbt=0.20.0
dbt version: 0.20.0
python version: 3.9.5
python path: /Users/hoge/dev/dbt-sample/.venv/bin/python
os info: macOS-11.4-x86_64-i386-64bit
Using profiles.yml file at /Users/hoge/.dbt/profiles.yml
Using dbt_project.yml file at /Users/hoge/dev/dbt-sample/test-project/dbt_project.yml

Configuration:
  profiles.yml file [OK found and valid]
  dbt_project.yml file [OK found and valid]

Required dependencies:
 - git [OK found]

Connection:
  s3_staging_dir: s3://dbt-sample-result/
  work_group: None
  region_name: ap-northeast-1
  database: awsdatacatalog
  schema: dbt
  poll_interval: 1.0
  aws_profile_name: user-profile
  Connection test: OK connection ok
```

成功しました！
接続に使用するprofileの権限がおかしかったり、databaseがなかったりするとエラーになるので、
エラーメッセージを見て適宜対応ください。

### 7. サンプルモデルの作成
サンプルのモデルが含まれているので、下記コマンドで発行します。

```
dbt run
```

下記のとおり、データベースとテーブルができあがりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23578/336d09f5-2a17-c930-b3b1-2734dde18522.png)


# あとがき
非公式のpluginなのでもっと詰まるかなーと思いましたが、接続までは意外とすんなりいけました。
まだ深く使い込んでおらず、どんな落とし穴があるかわかりませんが、
Airflowの連携とかも試していきたいところではありますので、
より使い込んで、また知見を共有できればと思います！

それでは！



### 参考リンク
dbtのCLI版をインストールして使ってみた
https://dev.classmethod.jp/articles/dbt-cli-first/

公式ドキュメント
https://docs.getdbt.com/dbt-cli/installation

dbt-athena
https://github.com/Tomme/dbt-athena/