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


概要

データ基盤で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になります。

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になると思います。この項目は英小文字しか許可されていないので注意ください。

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で作成した名前に修正します。

dbt_project.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/