Airflowのユーザー認証の設定方法

この記事のまとめ:
- Apache AirflowのWeb UIにパスワードユーザー認証の設定方法をまとめています。
背景
クラウド上でApache Airflowを動かそうと思ったのですが、AirflowのWeb UIにはデフォルトではユーザー認証などもなく、誰でもDAGsなどのすべてが変更できる状態です。そのため、ユーザー認証の設定をしていきます。なお、ユーザー認証方法は、パスワード認証、LDAP認証、Google Auth認証に対応しているようですが、今回はパスワード認証の設定を行います。
(2019.10.12修正)ユーザー登録手順をプラグインとして実装を行おうとしていましたが、プラグインとしての実装すること自体が間違っておりましたので、単純にスクリプトとしてユーザー登録を実行する方法に記事を修正しました。
Apache Airflowについて
Apache Airflowを動かすにあたって、以前の記事でDockerコンテナーでの導入した時と同様に今回もDockerコンテナーを使います。
Apache Airflow入門
Apache Airflow初心者がAirflowのアーキテクチャを理解し、チュートリアルを動かすまでの手順をまとめています。
なお、当時はAirflowのDockerコンテナーとしてDoker Hubで一番Pull数が多い puckel/docker-airflow が更新されていませんでしたが、最近更新が再開したようです。ただし、その最新版ではこの後紹介するユーザー認証がうまく動作しなかったため、今回も zhongjiajie/docker-airflow を利用します。 puckel/docker-airflow でも動作しましたので修正しました。
設定の流れ
今回行う設定は主に下記の2つです。
- Web UIを提供しているWebserverに対してユーザー認証の設定
- ユーザー登録を行うスクリプトを実行
ひとつひとつどのような設定をするか見ていきます。
ユーザー認証設定
ユーザー認証の設定は 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 puckel/docker-airflow:1.10.4
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
ユーザー登録スクリプト
ローカルに任意のディレクトリー(ここでは auth )を作り、下記の内容の airflow_user_add.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/auth/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の実行
基本的なファイルは puckel/docker-airflow:1.10.4 のGitHubリポジトリーをクローンしてきたままを使い、先ほど変更や追加を行ったファイルの更新と、 docker-compose.yml を変更します。
変更した airflow.cfg と auth ディレクトリーを含めたディレクトリー構成は下記のようになっています。
$ tree
.
├── config
│ └── airflow.cfg
├── dags
│ └── tuto.py
├── Dockerfile
├── LICENSE
├── auth
│ ├── airflow_user_add.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
- ./auth:/usr/local/airflow/auth
# Uncomment to include custom plugins
- ./auth:/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 で実行すれば、ブラウザで webserver にアクセスすれば、下記の通りユーザー認証画面が出てきます。

ただし、まだユーザー登録はしていませんので、最後にユーザースクリプトを実行します。
$ docker-compose exec webserver python init/airflow_user_add.py
これで user.conf に記載したユーザー情報でログインできるようになっているはずです。
今回は以上です。
最後まで読んでいただき、ありがとうございます。
関連記事
Apache Airflow入門
Apache Airflow初心者がAirflowのアーキテクチャを理解し、チュートリアルを動かすまでの手順をまとめています。
コメント
コメントを投稿