
この記事のまとめ:
- Apache AirflowのWeb UIにパスワードユーザー認証の設定方法をまとめています。
背景
クラウド上でApache Airflowを動かそうと思ったのですが、AirflowのWeb UIにはデフォルトではユーザー認証などもなく、誰でもDAGsなどのすべてが変更できる状態です。そのため、ユーザー認証の設定をしていきます。なお、ユーザー認証方法は、パスワード認証、LDAP認証、Google Auth認証に対応しているようですが、今回はパスワード認証の設定を行います。
Apache Airflowについて
Apache Airflowを動かすにあたって、以前の記事でDockerコンテナーでの導入した時と同様に今回もDockerコンテナーを使います。
Apache Airflow入門
Apache Airflow初心者がAirflowのアーキテクチャを理解し、チュートリアルを動かすまでの手順をまとめています。
なお、当時はAirflowのDockerコンテナーとしてDoker Hubで一番Pull数が多い puckel/docker-airflow が更新されていませんでしたが、最近更新が再開したようです。ただし、その最新版ではこの後紹介するユーザー認証がうまく動作しなかったため、今回も zhongjiajie/docker-airflow を利用します。
設定の流れ
今回行う設定は主に下記の2つです。
- Web UIを提供しているWebserverに対してユーザー認証の設定
- ユーザー登録を行うスクリプトをAirflowのプラグインとして動かす
ひとつひとつどのような設定をするか見ていきます。
ユーザー認証設定
ユーザー認証の設定は airflow.cfg
に行います。初期設定では webserver
のブロック内の authenticate = False
になっていますので、コメントアウトして下記の2つを書き込みます。
[webserver]
#authenticate = False
authenticate = True
auth_backend = airflow.contrib.auth.backends.password_auth
コンテナー内の設定ファイルを更新した airflow.cfg
に置き換えるために次のように Dockerfile
を作成します。また、この時にパスワード認証を行うために flask-bcrypt
のPythonパッケージが必要ですので、インストールしておきます。
FROM zhongjiajie/docker-airflow
USER root
ARG AIRFLOW_HOME=/usr/local/airflow
COPY config/airflow.cfg ${AIRFLOW_HOME}/airflow.cfg
RUN chown -R airflow: ${AIRFLOW_HOME}
RUN pip install flask-bcrypt
USER airflow
ユーザー登録プラグイン
ローカルに plugins
ディレクトリーを作り、下記の内容の airflow_login.py
を保存します。
#!/usr/bin/env python
import airflow
from airflow import models, settings
from airflow.contrib.auth.backends.password_auth import PasswordUser
from flask_bcrypt import generate_password_hashimport configparser
config = configparser.ConfigParser()
config.read('/usr/local/airflow/plugins/user.conf')
user = PasswordUser(models.User())
user.username = config\['airflow_user'\]['username']
user.email = config\['airflow_user'\]['email']
user._password = generate_password_hash(config\['airflow_user'\]['password'].encode('utf8')).decode('utf-8')
session = settings.Session()
session.add(user)
session.commit()
session.close()
また、ユーザー情報については user.conf
として別ファイルとして同じディレクトリーに用意します。
[airflow_user]
username = <user_name>
password = <password>
email = <email_address>
Airflowの実行
基本的なファイルは zhongjiajie/docker-airflow のGitHubリポジトリーをクローンしてきたままを使い、先ほど変更や追加を行ったファイルの更新と、 docker-compose.yml
を変更します。
変更した airflow.cfg
と plugins
ディレクトリーを含めたディレクトリー構成は下記のようになっています。
$ tree
.
├── config
│ └── airflow.cfg
├── dags
│ └── tuto.py
├── Dockerfile
├── LICENSE
├── plugins
│ ├── airflow_login.py
│ └── user.conf
├── README.md
├── script
│ └── entrypoint.sh
├── docker-compose-CeleryExecutor.yml
├── docker-compose-LocalExecutor.yml
└── docker-compose.yml
docker-compose-LocalExecutor.yml
をベースとして、docker-compose.yml
を下記のように変更します。
version: '2.1'
services:
postgres:
image: postgres:9.6
environment:
- POSTGRES_USER=airflow
- POSTGRES_PASSWORD=airflow
- POSTGRES_DB=airflow
webserver:
build: .
restart: always
depends_on:
- postgres
environment:
- LOAD_EX=y
- EXECUTOR=Local
volumes:
- ./dags:/usr/local/airflow/dags
# Uncomment to include custom plugins
- ./plugins:/usr/local/airflow/plugins
ports:
- "8080:8080"
command: webserver
healthcheck:
test: ["CMD-SHELL", "[ -f /usr/local/airflow/airflow-webserver.pid ]"]
interval: 30s
timeout: 30s
retries: 3
後は docker-compose up -d
で実行すれば、下記の通りユーザー認証画面が出てきますので、user.conf
に記載したユーザー情報でログインできるはずです。

今回は以上です。
最後まで読んでいただき、ありがとうございます。
関連記事
Apache Airflow入門
Apache Airflow初心者がAirflowのアーキテクチャを理解し、チュートリアルを動かすまでの手順をまとめています。
コメントを投稿