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

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

この記事のまとめ:
  • Apache AirflowのWeb UIにパスワードユーザー認証の設定方法をまとめています。
背景

クラウド上でApache Airflowを動かそうと思ったのですが、AirflowのWeb UIにはデフォルトではユーザー認証などもなく、誰でもDAGsなどのすべてが変更できる状態です。そのため、ユーザー認証の設定をしていきます。なお、ユーザー認証方法は、パスワード認証、LDAP認証、Google Auth認証に対応しているようですが、今回はパスワード認証の設定を行います。

(2019.10.12修正)ユーザー登録手順をプラグインとして実装を行おうとしていましたが、プラグインとしての実装すること自体が間違っておりましたので、単純にスクリプトとしてユーザー登録を実行する方法に記事を修正しました。

Apache Airflowについて

Apache Airflowを動かすにあたって、以前の記事でDockerコンテナーでの導入した時と同様に今回もDockerコンテナーを使います。

なお、当時はAirflowのDockerコンテナーとしてDoker Hubで一番Pull数が多い puckel/docker-airflow が更新されていませんでしたが、最近更新が再開したようです。ただし、その最新版ではこの後紹介するユーザー認証がうまく動作しなかったため、今回も zhongjiajie/docker-airflow を利用します。 puckel/docker-airflow でも動作しましたので修正しました。

設定の流れ

今回行う設定は主に下記の2つです。

  1. Web UIを提供しているWebserverに対してユーザー認証の設定
  2. ユーザー登録を行うスクリプトを実行

ひとつひとつどのような設定をするか見ていきます。

ユーザー認証設定

ユーザー認証の設定は 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.cfgauth ディレクトリーを含めたディレクトリー構成は下記のようになっています。

$ 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 に記載したユーザー情報でログインできるようになっているはずです。


今回は以上です。 最後まで読んでいただき、ありがとうございます。
関連記事



コメント

このブログの人気の投稿

LinuxでのnVidia GPUのオーバークロック・電力チューニング方法

【レビュー】 格安VPSサービスTime4VPSを1年強使ってみてわかったメリット・デメリット・注意点