背景
Redash を運用していて,例えば退職者が出たタイミングなど,ユーザー削除って結局どうするんだっけ?という話題が出て,明確な回答ができなかったので,実際に試してみた.ユーザー削除だけじゃなく,権限管理など,今後 Redash の運用面の記事を書く機会が増えそう.なお,今回は Redash 3.0.0 を使って検証した(master を Docker で起動したため最新すぎる可能性もある).
Redash 画面
Redash 画面では,ユーザー追加とグループ管理ができる.ただし,公式ドキュメントにも記載が無いように,ユーザー削除の機能は提供されていなかった.admin 権限でログインした場合は,Redash 画面からユーザー削除ができるべきだと思う.
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 管理者画面で,イベントを削除することはできるけど,ユーザーを指定して削除することができないため,オペレーションとして現実的に不可能だと思う.
ダッシュボードとクエリの所有ユーザーだと削除できない
もし,イベントを削除できたとしても,ダッシュボードとクエリの所有ユーザーだった場合は,今度は 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 管理者画面の存在を知らない人も多いはずで,このあたりはもうちょっと普及を進めたいと思っている.
要望など
当然ながら,ユーザー削除の要望は出ていて,開発予定はありそうだった.
Trello で管理されているロードマップでも "Accepted" レーンの1番目に位置しているため,次期リリースあたりで入って欲しいなーとは思う.
まとめ
- Redash 画面では,現時点でまだユーザー削除の機能が提供されていなかった
- Redash CLI を使うと,ユーザー削除ができた
- ただし,PostgreSQL の外部キー制約に該当してレコードが消せないため,現実的にはユーザー削除はできないと言える
- ダッシュボードとクエリの所有ユーザーを変更することはできるので,退職者が所有ユーザーになった状態は回避できる
- Redash 管理者画面の存在を知らない人は多そう
- 次期リリースあたりでちゃんとユーザー削除ができるようになることを祈る