💻

公式 Docker イメージの Airflow で RDB をリポジトリ DB にする

2021/01/24に公開

この記事について

この記事は、2021 年 1 月 23 日に開催した第 38 回 SQL Server 2019 勉強会で登壇した内容のフィードバック記事です。
セッション中で使用した Apache Airflow の環境について解説しています。

以前の記事で、公式 Docker イメージを使用した Apache Airflow の環境構築について解説しました。ただ、この環境構築方法で作成される Apache Airflow の環境は、リポジトリ DB に SQLite が設定されるようになっています。

Apache Airflow では、リポジトリ DB に MySQLPostgreSQL も設定できるようになっています。今回は、公式の Docker イメージを使った環境構築時に MySQL や PostgreSQL などをリポジトリ DB に設定する方法について解説します。

環境構築

基本的には、通常の環境構築に以下の内容を追加で実施して、Docker コンテナーを起動するだけです。

  • リポジトリ DB 用の Docker コンテナーを準備
  • Airflow のコンテナーに .env でリポジトリ DB に接続するための環境変数を設定

MySQL の場合

リポジトリに MySQL を使用する場合は、以下のような docker-compose.yaml を作成します。

docker-compose.yaml
version: '3'

services:
  mysql:
    image: mysql:8.0
    container_name: mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: P@ssw0rd
      MYSQL_DATABASE: airflow
      MYSQL_USER: airflow
      MYSQL_PASSWORD: airflow
    ports:
        - 3306:3306
    volumes:
        - ./data/mysql:/var/lib/mysql
        - ./conf:/etc/mysql/conf.d
  
  scheduler:
    image: apache/airflow:2.0.0
    container_name: airflow-scheduler
    restart: always
    env_file:
      - .env
    depends_on:
      - mysql
    volumes:
      - ./dags:/opt/airflow/dags
      - ./logs:/opt/airflow/logs
    command: scheduler

  webserver:
    image: apache/airflow:2.0.0
    container_name: airflow-webserver
    restart: on-failure
    env_file:
      - .env
    ports:
      - 8080:8080
    depends_on:
      - scheduler
      - mysql
    volumes:
      - ./dags:/opt/airflow/dags
      - ./logs:/opt/airflow/logs
    # command: db init # Use fist time only
    command: webserver # Using with docker-compose up after exec `db init`

また、.env ファイルは以下のように作成しています。

.env
AIRFLOW__CORE__SQL_ALCHEMY_CONN=mysql://airflow:airflow@mysql:3306/airflow
AIRFLOW__CORE__EXECUTOR=LocalExecutor

PostgreSQL の場合

リポジトリに PostgreSQL を使用する場合は、以下のような docker-compose.yaml を作成します。

docker-compose.yaml
version: '3'

services:
  postgres:
    image: postgres:11
    environment:
      - POSTGRES_USER=airflow
      - POSTGRES_PASSWORD=airflow
      - POSTGRES_DB=airflow
    volumes:
      - ./data/postgresql:/var/lib/postgresql/data
  
  scheduler:
    image: apache/airflow:2.0.0
    container_name: airflow-scheduler
    restart: always
    env_file:
      - .env
    depends_on:
      - postgres
    volumes:
      - ./dags:/opt/airflow/dags
      - ./logs:/opt/airflow/logs
    command: scheduler

  webserver:
    image: apache/airflow:2.0.0
    container_name: airflow-webserver
    restart: on-failure
    env_file:
      - .env
    ports:
      - 8080:8080
    depends_on:
      - scheduler
      - postgres
    volumes:
      - ./dags:/opt/airflow/dags
      - ./logs:/opt/airflow/logs
    # command: db init # Use fist time only
    command: webserver # Using with docker-compose up after exec `db init`

また、.env ファイルは以下のように作成しています。

.env
AIRFLOW__CORE__SQL_ALCHEMY_CONN=postgresql+psycopg2://airflow:airflow@postgres/airflow
AIRFLOW__CORE__EXECUTOR=LocalExecutor

まとめ

デフォルトの SQLite ではなく、MySQL や PostgreSQL をリポジトリ DB にして Apache Airflow 環境を作成したいという場合でも、簡単に環境が作成できることはとてもいいことですね。
Airflow のリポジトリ DB に MySQL や PostgreSQL を設定しただけな、さまざまな野良イメージがネット上の記事には公開されていたりしますが、特段の理由などがない場合は、それぞれしっかり公式で提供されているイメージを活用する方がいいと思います。

Discussion