概要
データ基盤でETL処理を効率的に行うdbtなんですが、標準ではAmazon Athenaが
サポートされていません。有志によるAthena用のpluginは作成されているので、
それを使ってAtenaに接続する流れをまとめてみました。
前提
動作確認バージョン
python 3.9.5
pythonの環境はpyenv使うなりご自由にどうぞ。
私はpyenvとvenvで構築しました。
手順
1. dbtのインストール
基本的には公式ドキュメントにそって行うだけですが、1点注意があります。
Athena用のモジュールであるdbt-athenaが 0.20.0
までしか対応していないので、
必ず下記のようにバージョン指定でインストールしてください。
指定せずにインストールすると、0.20.1
が入ります。
pip install dbt==0.20.0
終わったらバージョンを確認しておきます。
最新じゃないよ!と言われますが、これでOKです。
> 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にそってインストールします。
# 最新のコマンドはGithub確認のこと
pip install git+https://github.com/Tomme/dbt-athena.git
インストール後、もう一度確認すると、athena用のpluginが入っている事がわかります。
> 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になります。
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になると思います。この項目は英小文字しか許可されていないので注意ください。
aws_profile_nameはdatabaseに接続するためのprofileで、
dbt-athenaでは、credential情報は保持せず、profile指定で接続するようでした。
また、接続に使用するユーザーは athena:StartQueryExecution
の権限が必要なので、
権限付与しておいてください。(もしかすると他にも必要な権限あるかもです)
4.dbtのプロジェクト作成
dbtのプロジェクトを作成します
dbt init test-project
サンプルのモデルやREADMEなどが作成されます。
5. dbt_project.ymlの修正
4で作成したプロジェクトにある dbt_project.yml
がプロジェクトの設定ファイルになっていて、
この中に使用する接続情報を記載するところがあるので、profiles.ymlで作成した名前に修正します。
profile: 'athena-conn'
6. 接続テスト
これでdbtの設定は完了なので、dbt debug
で接続テストします。
> 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
下記のとおり、データベースとテーブルができあがりました。
あとがき
非公式の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/