supersetをシュッと起動できるDockerfile(認証方式をGoogle API OAuth2に変更)をつくってみた、あと触ってみた所感など


ダッシュボードツールのsupersetをシュッと起動できるDockerfileを作りました。といってもsupersetのDockerfileはgithub.comに見かけるので認証方式をGoogle API OAuth2.0に変更したDockerfileを作りました。あとsupersetを触ってみての感想など導入に向けての所感をまとめたエントリです。

認証方式をOAuthに変更する方法

supersetは認証方式を変更できます。チームに最適な認証方式を選択できます。標準はDBにID/パスワードを登録する方式になっています。これをOAuthに変更する方法をまとめます。

コンテナ内の環境変数 SUPERSET_HOMEにセットしたディレクトリ配下にsuperset_config.pyを置いてsupersetの環境変数を上書きします。次のように認証方式をAUTH_OAUTHに設定し認証プロバイダの詳細設定を記述します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import os
from flask_appbuilder.security.manager import AUTH_OAUTH
basedir = os.path.abspath(os.path.dirname(__file__))
AUTH_TYPE = AUTH_OAUTH
OAUTH_PROVIDERS = [
    {'name':'google', 'icon':'fa-google', 'token_key':'access_token',
        'remote_app': {
            'consumer_key':'{GOOGLE_AUTH_CLIENT_ID}',
            'consumer_secret':'{GOOGLE_AUTH_SECRET_KEY}',
            'base_url':'https://www.googleapis.com/plus/v1/',
            'request_token_params':{
              'scope': 'https://www.googleapis.com/auth/userinfo.email'
            },
            'request_token_url':None,
            'access_token_url':'https://accounts.google.com/o/oauth2/token',
            'authorize_url':'https://accounts.google.com/o/oauth2/auth'}
    }
]

認証方式をAUTH_OAUTHに設定した状態でsupersetを起動するとログイン画面で認証するサービスにGoogleが表示されます。

次に認証情報を作成したGoogle Developer ConsoleでリダイレクトURLhttp://localhost:8088/oauth-authorized/googleに設定するとGoogle Accountで認証ができます。またGoogle+ Apiからアカウント情報を取得しますのでDeveloper ConsoleでGoogle+ Apiを有効にします。

最後に認証させたいアカウントをfabmanegerを使って作成します。

1
2
3
4
5
6
7
docker exec -it superset \
  fabmanager create-admin --app superset \
  --username 'Google+ アカウントの表示名(displayName)' \
  --firstname '任意の名' \
  --lastname '任意の姓' \
  --email 'Google アカウントのメールアドレス' \
  --password '任意のパスワード'

Google以外にもTwitterやFacebookなどの認証サービスを追加することができます。

詳しくはgithubのレポジトリに公開していますので合わせて確認できます。

GitHub - nsoushi/superset-demo: This repository contains demo using Superset. After begging containers, you can try Superset right now.

supersetが参照するDBを標準のsqliteからmysqlに変更する

標準ではsupersetが参照するDBはsqliteでOS内の$DATA_DIRにデータが格納されます。
これだとコンテナを削除するとダッシュボードの登録設定が消えてしまうのでsupersetのコンテナではない外のmysqlコンテナを起動させて参照させました。
Compose化して次のようにSQLALCHEMY_DATABASE_URIの環境変数を変更しています。

1
SQLALCHEMY_DATABASE_URI = 'mysql://root@mysql:3306/app?charset=utf8mb4'

mysqlのコンテナではマルチバイト文字列も扱えるようにutf8mb4の文字コードを有効にしています。 supersetアプリが参照するデータベースURLの末尾に?charset=utf8mb4をつければダッシュボードの名前にマルチバイト文字列が使えるようになります。

Dockerfileの使い方

次のレポジトリのDockerfileでコンテナを起動させるとsupersetが使えるようになります。
superset-demo/superset at master · nsoushi/superset-demo · GitHub

supersetだけを起動したい場合はsuperset-init.sh内の次の行をコメントアウトしてください。

1
SQLALCHEMY_DATABASE_URI = '${SUPERSET_DB_URI}'

mysqlのコンテナとセットで動かしたい場合はレポジトリのREADMEを参考にdocker-copomseでsupersetとmysqlのコンテナを起動してください。
GitHub - nsoushi/superset-demo: This repository contains demo using Superset. After begging containers, you can try Superset right now.

supersetを触ってみた感想など

最後にsupersetを触ってみた感想をまとめます。
初めてsupersetを触りましたが次のようなダッシュボードを作成することができました。

mysqlが提供するworldデータベースをデータソースにして人口やGNPの数値をグラフ化しました。

worldデータベースには時系列のデータがありませんが、時系列のデータがあれば集計条件に取得範囲時間を設定してダッシュボードを定期的に更新して定点観測することもできます。

グラフの作成手順

特にヘルプなどを見なくても直感的にグラフ作成まで進めます。
グラフ作成手順は次のような流れです。

https://raw.githubusercontent.com/nsoushi/superset-demo/master/docs/capture.gif

柔軟にテーブルを定義できる

柔軟にグラフ化したデータテーブルを定義できます。

ただ、SQL Labからダイレクトにグラフ化に進む方法は手元のバージョン(0.17.3)ではエラーとなりIssueとしても登録されていました。

SQL Lab

SQL Labでは作成したクエリを実行できます。
実行したクエリは履歴として残ります。後から再度実行できたり、実行結果から直接グラフを作ることもできます。
クエリを書ける人であればSQL Labでグラフ化したいデータの条件でSQLを作りメトリクスとグラフ作成に進むほうが効率が良さそうです。

機能権限とセキュリティ

Admin, Alpha, Gamma, sql_labなどのロールが用意されていてテーブルの登録権限、スライスの登録権限、SQL Labだけを使える権限などがあります。

http://airbnb.io/superset/security.html

機能権限に加えてユーザの操作ログや各種メニューへのアクセス権限などを設定することも可能です。
ここらへんはBIツールに必要そうな機能をサポートする姿勢が伺えます。

まとめ

コードを公開しています

コード全体はgitbubで確認できます。