概要
TIG の多賀です。
OSS として Airflow へ貢献するにあたり、ローカルでの実行やテストの環境整備が必要になります。また、 Airflow を利用するにあたってもローカルでの動作確認をしたいケースは多いかと思います。
Airflow では、 Airflow Breeze
と呼ばれる環境が整備され、公式より提供されています。当記事では、 Airflow Breeze
について概要を記載し、 Airflow への OSS 貢献の入り口となれば良いと考えています。
Airflow Breeze とは
Airflow Breeze とは、ローカルで Airflow を簡単に実行できるように整備された環境を指します。実態はコンテナベースで構築され、Docker Compose が利用されています。
airflow/AirflowBreeze_logo.png at master · apache/airflow
Airflow Breeze の環境を整備することで、Airflow が依存する外部コンポーネント(MySQL, Redis, etc..) を完全に含んだ環境を作成できます。
一方、リソースを結構使うため注意が必要です。
詳細はドキュメントととしてまとまっています。当記事ではピックアップした情報を記載します。
airflow/BREEZE.rst at master · apache/airflow
環境
以下環境で整備します。
- macOS Mojave 10.14.6
- Docker version 20.10.6, build 370c289
- docker-compose version 1.29.1, build c34c88b2
- Airflow master branch (commit hash: 180df03482b07c18a57d20235ccdd1c3a12d9173)
Breeze Install
getopt
と gstat
が必要なため、インストールします。
brew install gnu-getopt coreutils |
getopt
向けに PATH を通します。
export PATH="/usr/local/opt/gnu-getopt/bin:$PATH |
❯ getopt --version |
つづいて、Airflow のリポジトリを clone します。
git clone https://github.com/apache/airflow.git |
clone した Airflow リポジトリへ移動して、Breeze をインストールして Airflow を 起動します。
( ./breeze
内部は 長大な Shell Script になっています。)
./breeze start-airflow |
ここから完了まで 10分程度待ちます。
完了すると、Airflow コンテナ内にログインした状態になります。
自動で tmux のセッションが開始され、以下のような画面が出てきます。
各 Pane ごとに整理すると以下のようになります。
Pane 位置 | 実行コマンド | |
---|---|---|
左上 | airflow コンテナシェルログイン | - |
右上 | airflow ui | cd /opt/airflow/airflow/www/; yarn install --frozen-lockfile; yarn dev |
左下 | airflow scheduler 実行 | airflow scheduler |
右下 | airflow webserver 実行 | airflow webserver |
Airflow の実行と tmux を終了したい場合は、 airflow_stop
コマンドをコンテナ内で実行することで終了できます。
ブラウザで http://127.0.0.1:28080
へリクエストすると Airflow UI へアクセスできます。(ログインは ユーザー/パスワード 共に admin
です。)
Breeze 環境
環境変数 AIRFLOW_HOME
は、 /root/airflow
になっています。
ログイン後には、 環境変数 AIRFLOW_SOURCE
である /opt/airflow
配下におり、こちらはローカル端末の Airflow ソースコードがコピーされています。(対象は .dockerignore
で絞り込まれているので全ソースコードではないです。)
動作確認用に DAG ファイルを配置したい場合、ローカル端末の airflow 直下 ./files/dags
以下に配置することで反映されます。コンテナ内の AIRFLOW__CORE__DAGS_FOLDER
環境変数がコンテナ内 /files/dags
を指しており、コンテナ内 /files/dags
はローカル端末上の ./files/dags
をマウントしているためです。
AIRFLOW__CORE__DAGS_FOLDER — Airflow Documentation
ファイルを配置してから Airflow UI への反映は5分程度ラグがあります。
※ 補足
UI 反映のラグを短くしたい場合は、 コンテナ内 /root/airflow/airflow.cfg
の以下設定値を修正の上、airflow webserver/scheduler を再起動することで反映できます。
(※ ディレクトリの読み込み頻度を上げるほど、サーバー負荷は上がります。)
# デフォルトで 5分設定のためより短い秒数を指定 |
breeze コマンド
breeze コマンドにはいくつかのサブコマンドが用意されています。
コンテナ内シェルログイン
(※ airflow webserver/scheduler は起動しない)
./breeze (shell) |
再起動
./breeze restart |
開始/停止
(※ airflow webserver/scheduler を起動する)
./breeze start-airflow/stop |
イメージの削除
./breeze cleanup-image |
その他いろいろ用意されています。
airflow/BREEZE.rst at master · apache/airflow
テスト実行
CI の環境としても利用されていることもあり、テストを実行できます。
Airflow ではテストの種類としては以下3種類が定義されています。 (airflow/TESTING.rst at master · apache/airflow より)
- Unit Tests
- 単体テスト。追加の Integration は不要であり、Airflow 実行環境内で完結する。
- ローカル仮想環境 or Breeze 環境下で実施
- Integration Tests
- 結合テスト。外部 Integration を用意しテストを行う。Integration は実際のサービスを起動して実施する。(コンテナ利用)
- Breeze 環境下で実施
- System Tests
- システムテスト。外部システムと連携して行うテスト
- システム実行環境下(クラウド環境等) で実際に動かすテストを指す
ここでは、 Unit Tests と Integration Tests について詳細を記載します。
Unit Tests
Breeze 環境へログインして、 pytest
を実行することでテスト可能です。
# Breeze 環境へログイン |
Integration Test
Breeze 環境はデフォルトでは、 Integration コンポーネントを起動しない設定になっており、該当の Integration Test もスキップされます。
Integration Test を実施したい場合は、Breeze 起動時にフラグを指定します。
# Redis 利用テスト準備 |
テスト実行は、 pytest
が利用されています。起動したコンテナ内で実行します。
Integration テスト実行のためには、 --integration
パラメータで利用する Integration を指定します。内部的には @pytest.mark.integration
アノテーションで制御されており、パラメータ指定した Integration テストを実行します。
# Breeze 環境へログイン |
Kubernetes Tests
Integration Tests の一種である、Kubernetes 上での実行のテストも Breeze 上で実行できます。(標準で整備されていることからも Kubernetes 上での実行が当たり前な世界が垣間見えますね。)
Kubernetes Cluster は Kind を利用してローカル環境上に起動します。
./breeze kind-cluster start |
Cluster が起動したら、Airflow を Kubernetes へデプロイします。(少し待ちます)
./breeze kind-cluster deploy |
デプロイが完了すると Airflow が Kubernetes 上で起動してます。http://127.0.0.1:8080
へアクセスすると Airflow UI が確認できます。(※ ポートが Breeze と違うので注意してください。ユーザー/パスは admin
です。)
テストを実行してみます。テストはローカル端末上で以下コマンドで実行できます。
(ローカル端末上に仮想環境が作成されます。コマンド内で ./scripts/ci/kubernetes/ci_run_kubernetes_tests.sh
(参照)を実行しています。)
❯ ./breeze kind-cluster test |
最後に Cluster を停止します。
./breeze kind-cluster stop |
所感
Airflow にて提供されている、ローカル環境/テスト環境向けの Airflow Breeze について紹介しました。./breeze
コマンドで諸々整備されていて便利ですが、様々なコンポーネントが関与しているため、動かすのに少し苦労しました(プロキシ周りがほとんどですが)。
それだけ複雑なテストケースが想定されていて、OSS でここまで管理されているのは改めてすごいなと思いました。
Airflow はクセが強いですが 最近(2020/12) バージョン 2.0 にアップデートされたりして、積極的に改善されており今後も注目な OSS だと思います。次は何かしらコントリビュートしたいです。