👻

サクッとairflowでdbt-snowflakeを動かす方法

2023/09/17に公開

嘘です。タイトル通りサクッといきませんでした・・・
かなりの大苦戦をしてしまいました・・・
当初、airflowコンテナと別立てしていたコンテナ内のdbt環境に対してdbt runをやりたかったのですが、ネットワークが分離されていて、アクセスできない状態でした。

なので、とりあえず動かすことを目的に、airflowのコンテナ環境でdbtを動かすことにしました。

airflowのインストール

https://zenn.dev/kyami/articles/983afcac11f7bf

airflowコンテナ内にdbt環境を構築する

airflow-airflow-worker-1にrootでアクセス
docker exec --user root -it e3747a6dd6ac bash
apt update
root@e3747a6dd6ac:/opt/airflow# sudo apt update -y
airflowユーザをsudoできるようにする
root@e3747a6dd6ac:/opt/airflow# cat /etc/sudoers.d/airflow
airflow  ALL=(ALL) NOPASSWD:ALL
airflwoユーザでコンテナに入り直し、gitをインストール
% docker exec -it --user airflow e3747a6dd6ac bash
airflow@e3747a6dd6ac:/opt/airflow# sudo apt install git
sshでgit cloneするので公開鍵の作成
airflow@e3747a6dd6ac:/opt/airflow$ ssh-keygen -t rsa
git cloneを実施
airflow@e3747a6dd6ac:/opt/airflow/dbt# git clone git@github.com:******/******.git
dbt-snowflakeのインストール
airflow@e3747a6dd6ac:/opt/airflow/dbt# sudo apt install python3-pip
airflow@e3747a6dd6ac:/opt/airflow/dbt# pip3 install dbt-snowflake

airflow-dbtはschedulerコンテナにインストールします。ここ注意です。

airflow-airflow-scheduler-1で実施
airflow@d0b9304a50a9:/opt/airflow/dbt# pip3 install airflow-dbt
今回作成したDAG
from pendulum import datetime
import json
from airflow import DAG
from airflow.operators.python_operator import PythonOperator
from airflow.operators.bash_operator import BashOperator
from airflow_dbt.operators.dbt_operator import (
    DbtSeedOperator,
    DbtRunOperator,
    DbtTestOperator,
    DbtDocsGenerateOperator,
)

from airflow.utils.dates import days_ago

default_args = {
    'owner': 'airflow',
    'start_date': days_ago(0),
    'retries': 0,
    'dir': '/opt/airflow/dbt/jaffle_shop_pj/jaffle_shop'
}


with DAG(dag_id='dbt_dag', default_args=default_args, schedule_interval=None) as dag:
    dbt_seed = DbtSeedOperator(
        task_id='dbt_seed',
    )

    dbt_run = DbtRunOperator(
        task_id='dbt_run',
        profiles_dir='/opt/airflow/dbt/jaffle_shop_pj/jaffle_shop',
        dir='/opt/airflow/dbt/jaffle_shop_pj/jaffle_shop',
    )

    dbt_test = DbtTestOperator(
        task_id='dbt_test',
        profiles_dir='/opt/airflow/dbt/jaffle_shop_pj/jaffle_shop',
        dir='/opt/airflow/dbt/jaffle_shop_pj/jaffle_shop',
    )
    dbt_seed >> dbt_run >> dbt_test

苦戦したところ

このままだと永遠に[Errno 13] Permission denied:が出続けて、ジョブが成功しないのでやむなくパーミッションを変更しました。
dbt testの結果をtargetディレクトリに書き込むのに権限が無くて怒られてた・・
あとで適切な権限を再設定するけど、疲れすぎて一旦777で設定して、成功したのでヨシとします〜

airflow@e3747a6dd6ac:/opt/airflow/dbt/jaffle_shop_pj/jaffle_shop$ sudo chmod -R 777 target/*

Discussion