公式 Docker イメージを使って Apache Airflow を始める
この記事について
この記事では、Docker Hub で公式に公開されている Docker イメージを使用して、Apache Airflow の環境を構築する手順について記載しています。
Airflow は Airbnb のエンジニアが社内で開発したもので、基本的に相互に依存しているタスクと独立しているタスクが複数存在している場合において、実行されている様々なジョブの実行、スケジューリング、配布、監視を効率的に行うことが出来るフレームワークです。
Airflow は 2016 年に Apache の一部となり、オープンソースとしてユーザーが利用できるようになりました。
Airflow 環境を Docker で作るネット記事は多く回っていますが、そのほとんどが他人が自作したもの
であったり、Dockerfile を独自に作成
していたりするものがほとんどだと思います。
こうしたいわゆる 野良の Docker イメージ はセキュリティ的に不安要素が大きかったり、その人が便利と考えたカスタム要素が入っていたりする場合があり、Airflow をこれから勉強しようとしている人にとっては、学習の阻害となる可能性もあると思います。
そのため、誰もが簡単に、公式の Docker イメージを使用して Airflow 環境を構築できるよう、本記事にて解説を行っています。
環境
今回は、以下の環境を使用しました。
Docker でインストールを行うので、OS は Windows/macOS/Linux 関係なく、同じように実行できると思います。
- OS: macOS Big Sur バージョン 11.1 (Intel Mac)
- Docker: Docker for Mac (Docker Engine v20.10.0)
- Airflow: v2.0.0 (Stable)
公式 Docker イメージ
公式で提供されている Apache Airflow の Docker イメージはこちらです。
公式ドキュメント (英語)
Apache Airflow の公式ドキュメントはこちらです。
Airflow のインストール
Docker Compose 用の YAML ファイルを作成
docker-compose.yaml
ファイルを作成します。
version: '3'
services:
web:
image: apache/airflow:2.0.0
container_name: airflow
ports:
- 8080:8080
volumes:
- ./opt/airflow:/opt/airflow
command: db init # Use fist time only
# command: webserver # Using with docker-compose up after exec `db init`
Airflow 用 DB の初期化
docker-compose.yaml
を作成したら、docker-compose up
で Docker コンテナーを起動します。
docker-compose up
command: db init
とあるように、まず最初に Airflow 用の DB の初期化を行います。
デフォルトでは、SQLite
が リポジトリ DB として設定されています。この部分については、volumes
で定義している /opt/airflow
以下に SQLite の DB ファイルが作成されるようになっています。
Airflow 自体は、リポジトリ DB に MySQL や PostgreSQL を設定することも可能ですが、今回は割愛します。
コマンドを実行したら、以下のような結果が帰ってくると思います。
Creating network "docker-airflow_default" with the default driver
Creating airflow ... done
Attaching to airflow
airflow | DB: sqlite:////opt/airflow/airflow.db
airflow | [2021-01-03 13:54:08,533] {db.py:678} INFO - Creating tables
airflow | INFO [alembic.runtime.migration] Context impl SQLiteImpl.
airflow | INFO [alembic.runtime.migration] Will assume non-transactional DDL.
airflow | INFO [alembic.runtime.migration] Running upgrade -> e3a246e0dc1, current schema
airflow | INFO [alembic.runtime.migration] Running upgrade e3a246e0dc1 -> 1507a7289a2f, create is_encrypted
...(中略)...
airflow | [2021-01-03 13:54:15,779] {manager.py:727} WARNING - No user yet created, use flask fab command to do it.
airflow | [2021-01-03 13:54:25,468] {migration.py:517} INFO - Running upgrade 2c6edca13270 -> 61ec73d9401f, Add description field to connection
airflow | [2021-01-03 13:54:25,497] {migration.py:517} INFO - Running upgrade 61ec73d9401f -> 64a7d6477aae, fix description field in connection to be text
airflow | [2021-01-03 13:54:25,512] {migration.py:517} INFO - Running upgrade 64a7d6477aae -> e959f08ac86c, Change field in DagCode to MEDIUMTEXT for MySql
airflow | [2021-01-03 13:54:26,502] {dagbag.py:440} INFO - Filling up the DagBag from /opt/airflow/dags
airflow | Initialization done
airflow exited with code 0
Initialization done
が表示されていたら OK です。初期化処理だけのため、完了後は Docker コンテナーは自動で停止します。
また、volumes
で指定した箇所に、SQLite の DB ファイルなどが作成されていることも確認できるはずです。
YAML ファイルの更新
DB の初期化が完了したので、command: db init
をコメントアウトして、代わりに command: webserver
をアンコメントします。
docker-compose.yaml
ファイルは以下のようになるはずです。
version: '3'
services:
web:
image: apache/airflow:2.0.0
container_name: airflow
ports:
- 8080:8080
volumes:
- ./opt/airflow:/opt/airflow
# command: db init # Use fist time only
command: webserver # Using with docker-compose up after exec `db init`
Apache Airflow の起動
docker-compose.yaml
を更新したら、docker-compose up -d
で Docker コンテナーを再起動します。
先ほどと違い、docker-compose up
に -d
オプションを付けて、デタッチド・モードで起動していることに注意してください。
デタッチド・モードで、コンテナーをバックグラウンドで実行させるようにしています。
docker-compose up -d
起動確認
docker-compose ps
で、コンテナーが起動したかを確認します。
docker-compose ps
正常に起動していれば、State
が Up
になっているはずです。
Name Command State Ports
-------------------------------------------------------------------------
airflow /usr/bin/dumb-init -- /ent ... Up 0.0.0.0:8080->8080/tcp
コンテナーが起動していることを確認したら、Web ブラウザで http://127.0.0.1:8080 にアクセスし、Apache Airflow のログイン画面が表示されることを確認します。
管理者アカウントの作成
Airflow の管理者アカウントは、Airflow の CLI (コマンドラインインタフェース) から作成することができるようになっています。
そのため、起動した Docker コンテナー内で Airflow の CLI を実行し、ユーザーを作成します。
まず、Docker コンテナーの ID を確認します。
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e47876da534b apache/airflow:2.0.0 "/usr/bin/dumb-init …" 10 minutes ago Up 10 minutes 0.0.0.0:8080->8080/tcp airflow
上の例では、e47876da534b
がコンテナーの ID になるので、この ID を使って Airflow のコンテナーの Bash セッションを開始します。
docker exec -it e47876da534b bash
Bash セッションを開始したら、以下の CLI コマンドを実行し、新規にユーザーを作成します。
ID や 名前、E-mail の情報は、任意で書き換えてください。
airflow users create \
--username admin \
--firstname Peter \
--lastname Parker \
--role Admin \
--email spiderman@superhero.org
実行すると、作成するユーザーのパスワード入力を求められます。
任意のパスワードを設定します。
入力が問題なければ、以下のような結果が返ってくるはずです。
[2021-01-03 14:20:39,681] {opentelemetry_tracing.py:29} INFO - This service is instrumented using OpenTelemetry. OpenTelemetry could not be imported; please add opentelemetry-api and opentelemetry-instrumentation packages in order to get BigQuery Tracing data.
[2021-01-03 14:20:40,105] {manager.py:727} WARNING - No user yet created, use flask fab command to do it.
Password:
Repeat for confirmation:
Admin user admin created
これで、管理者ユーザーの作成が完了したので、Airflow にログインできるようになります。
Airflow にログイン
Web ブラウザで http://127.0.0.1:8080 のページに戻り、ログイン画面で、先ほど作成したユーザー情報を入力します。
Sign In
を選択し、ログインを実行します。
正常にログインができれば、Airflow のホーム画面を確認できるはずです。
2021/01/06 追記
上記の docker-compose.yaml
では、Airflow の Web サーバーは起動しますが、DAG ファイルを認識しタスクを実行するスケジューラーは起動していません。
DAG の詳細については、以下の記事に記載しているので、興味ある方は合わせてご確認ください。
また、docker-compose up -d
実行時に、Web サーバーとスケジューラーを一度に起動したい場合は、以下のように docker-compose.yaml
の command 部分を書き換えてください。
services:
web:
image: apache/airflow:2.0.0
container_name: airflow
ports:
- 8080:8080
volumes:
- ./opt/airflow:/opt/airflow
# command: db init # Use fist time only
# command: webserver # Using with docker-compose up after exec `db init`
command: >
bash -c "airflow webserver -p 8080 -D && airflow scheduler -D"
まとめ
今回は、Docker Hub で公開されている、公式の Docker イメージを使用して、Apache Airflow の環境を作成しました。
今回の内容については、以下の GitHub リポジトリでも公開していますので、合わせてご確認ください。
Discussion