kakakakakku blog

Weekly Tech Blog: Keep on Learning!

Redash のユーザー削除が難しい

背景

Redash を運用していて,例えば退職者が出たタイミングなど,ユーザー削除って結局どうするんだっけ?という話題が出て,明確な回答ができなかったので,実際に試してみた.ユーザー削除だけじゃなく,権限管理など,今後 Redash の運用面の記事を書く機会が増えそう.なお,今回は Redash 3.0.0 を使って検証した(master を Docker で起動したため最新すぎる可能性もある).

Redash 画面

Redash 画面では,ユーザー追加とグループ管理ができる.ただし,公式ドキュメントにも記載が無いように,ユーザー削除の機能は提供されていなかった.admin 権限でログインした場合は,Redash 画面からユーザー削除ができるべきだと思う.

redash.io

Redash CLI

公式ドキュメントにも詳細な記載はないけど,Redash には Redash CLI と言うコマンド機能 (manage.py) がある.例えば users list を実行すると,登録済のユーザー一覧を取得することができる.

$ ./manage.py users list
Id: 1
Name: admin
Email: admin@example.com
Organization: test
--------------------
Id: 2
Name: user1
Email: user1@example.com
Organization: test
--------------------
Id: 4
Name: user3
Email: user3@example.com
Organization: test
--------------------
Id: 3
Name: user2
Email: user2@example.com
Organization: test

特殊な条件でユーザー削除ができる

この Redash CLI の users delete を使うと,ユーザー削除ができる.指定するのは,メールアドレスとなる.以下のように,問題なくユーザー削除ができた.ただし,これは特殊な条件で「そのユーザーが1度も Redash にログインしていないこと」が前提になる.そんなこと,ほぼ無いでしょうに...!

$ ./manage.py users delete user3@example.com
Deleted 1 users.

イベント(操作履歴)があると削除できない

Redash では,ユーザーごとの操作履歴をイベントとして events テーブルで管理している.このテーブルに対して外部キー制約が設定されているため,ユーザー削除は以下のようにエラーになった.

$ ./manage.py users delete user2@example.com
Traceback (most recent call last):
  (中略)
sqlalchemy.exc.IntegrityError: (psycopg2.IntegrityError) update or delete on table "users" violates foreign key constraint "events_user_id_fkey" on table "events"
DETAIL:  Key (id)=(3) is still referenced from table "events".
 [SQL: 'DELETE FROM users WHERE users.email = %(email_1)s'] [parameters: {'email_1': u'user2@example.com'}]

Redash 管理者画面で,イベントを削除することはできるけど,ユーザーを指定して削除することができないため,オペレーションとして現実的に不可能だと思う.

f:id:kakku22:20171014023637p:plain

ダッシュボードとクエリの所有ユーザーだと削除できない

もし,イベントを削除できたとしても,ダッシュボードとクエリの所有ユーザーだった場合は,今度は dashboards テーブルと queries テーブルの外部キー制約により,ユーザー削除はエラーになった.Redash を使っていればダッシュボードとクエリを作るのは一般的だし,今の仕様はかなり厳しいように感じた.

$ ./manage.py users delete user1@example.com
Traceback (most recent call last):
  (中略)
sqlalchemy.exc.IntegrityError: (psycopg2.IntegrityError) update or delete on table "users" violates foreign key constraint "dashboards_user_id_fkey" on table "dashboards"
DETAIL:  Key (id)=(2) is still referenced from table "dashboards".
 [SQL: 'DELETE FROM users WHERE users.email = %(email_1)s'] [parameters: {'email_1': u'user1@example.com'}]

ダッシュボードとクエリの所有ユーザーを変更する

ユーザー削除ができないとしても,退職者が所有ユーザーになったダッシュボードとクエリを運用し続けるのも微妙なので,そういう場合は Redash 管理者画面から所有ユーザーだけを変更することができる.そもそも Redash 管理者画面の存在を知らない人も多いはずで,このあたりはもうちょっと普及を進めたいと思っている.

f:id:kakku22:20171014023658p:plain

要望など

当然ながら,ユーザー削除の要望は出ていて,開発予定はありそうだった.

github.com

github.com

Trello で管理されているロードマップでも "Accepted" レーンの1番目に位置しているため,次期リリースあたりで入って欲しいなーとは思う.

まとめ

  • Redash 画面では,現時点でまだユーザー削除の機能が提供されていなかった
  • Redash CLI を使うと,ユーザー削除ができた
    • ただし,PostgreSQL の外部キー制約に該当してレコードが消せないため,現実的にはユーザー削除はできないと言える
  • ダッシュボードとクエリの所有ユーザーを変更することはできるので,退職者が所有ユーザーになった状態は回避できる
  • Redash 管理者画面の存在を知らない人は多そう
  • 次期リリースあたりでちゃんとユーザー削除ができるようになることを祈る