1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-08-27

概要

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

スクリーンショット 2021-08-27 1.03.12.png

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

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

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

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?