公式 Docker イメージを使って Apache Airflow を始める

9 min read読了の目安(約8200字

この記事について

この記事では、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 ファイルを作成します。

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 を設定することも可能ですが、今回は割愛します。

environmentAIRFLOW_HOME を追加してディレクトリを設定してしまうと、指定したディレクトリ以下に /home/airflow として、初期データ一式を作成することになります。
これだと、SQLite のファイルも /opt/airflow 以下に作成されなくなってしまいます。

コマンドを実行したら、以下のような結果が帰ってくると思います。

実行結果(例)
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 ファイルは以下のようになるはずです。

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

正常に起動していれば、StateUp になっているはずです。

実行結果(例)
 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 部分を書き換えてください。

docker-compose.yaml
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 リポジトリでも公開していますので、合わせてご確認ください。

参考情報

Docker Hub

Apache Airflow Documentation