Alteryxを使ってTableau Serverに存在するユーザーの一覧をExcelに出力してみた #Alteryx #Tableau
はじめに
どうも。DI部@大阪オフィスのtamaです。
情シス等の、社内IT管理をやっている方の中で「社内で使用しているITツールのユーザー一覧を定期的に上層部に提出しないといけない」みたいなルールに対応されている方はどのくらいいらっしゃるでしょうか?
その場合、Tableau Serverももちろん該当するわけですが、サイトやらグループやらが沢山ある場合、画面をカチカチ確認するだけで一苦労です。画面さえ用意できればいいならマシで、何なら「Excelファイルで提出すること」みたいな決まりがある企業もあると思います。
今回は、Alteryx Designerを使用すれば、Tableau Serverのユーザーの出力が一気にできる…という内容をお届けします。
こういうのを作ってみました
楽じゃのう!
やってみた環境
- Tableau Server 2019.1.1
- Alteryx Designer 2019.1
- Tableau Server REST API 3.3
Tableau Serverのユーザーデータの取得手段
さて、Tableau Serverのユーザー情報を確認するには、Tableau Serverのどこを参照すればいいのでしょうか。
Tableau Serverリポジトリを使う
Tableau Serverには、Tableau Serverの各種データが格納されているDBが存在します。そこをSQLなりTableau Desktopなりで見に行けば、Tableau Serverのユーザー一覧を取得できます。
- Tableau Serverの管理ビューを使用してみる #tableau | DevelopersIO
- Tableau Serverに設定しているパーミッションを一括取得する(そしてTableau Desktopで可視化する) #tableau | DevelopersIO
Tableau Server REST APIを使う
もう一つの手段は、Tableau ServerのAPIを叩く方法です。実はTableau ServerにもREST APIが用意されており、それを叩けば、Tableau Serverの色々なデータを取得することができます。
- Tableau Server REST API - Tableau
- #tc18 レポート Tableau Server ClientとREST APIを使用した作業の自動化 – Tableau Conference 2018 at New Orleans | DevelopersIO
APIが叩ける→Alteryx Designerで取得できる
というわけで実践じゃ
ワークフローの要件
出力するユーザーリスト
以下がわかるExcelファイルを出力したいと思います。
- 属するサイト
- 属するグループ
- ユーザー名
- サイトロール
処理の概要
- Tableau Server REST API上でサインインする(トークンを取得する)
- サイト一覧を取得する
- サイト毎にグループ一覧を取得する
- グループ毎にユーザー一覧を取得する
サイトに存在するユーザーを一括取得できるAPIもありますが、今回は出力先にグループ名も載せたいので、グループからユーザーを取得するAPIを使用します。
使用するAPIを選定
- Reference-Tableau Server REST API - Tableau - Sigh In
- Reference-Tableau Server REST API - Tableau - Sigh Out
- Reference-Tableau Server REST API - Tableau - Query Sites
- サイト一覧を取得します
- Reference-Tableau Server REST API - Tableau - Query Groups
- 指定したサイトに存在するグループ一覧を取得します
- Reference-Tableau Server REST API - Tableau - Get Users in Group
- 指定したグループに存在するユーザー一覧を取得します
ワークフローを作成
全体図
今回はBatchマクロが2つ登場します。それぞれ「(取得した)サイトID毎にQuery Groupsを叩く」「(取得した)グループID毎にGet Users in Groupを叩く」というループ処理が必要だからです。本当はAPI毎にIterativeマクロ化もしようかと思っていたのですが、どれも1リクエストで1000件取得できるということと、サイトやグループが1000以上あることは稀だと思ったので、今回は実装していません。
1000件以上の可能性があるとしたらユーザーですが、そこをページネーション対応したい場合は、下記ブログを参考にしてください。
本体ワークフローのポイント
処理概要
- Tableau Serverアカウント(ユーザー名とパスワード)とURLを入力
- Tableau Serverにサインイン
- サイト一覧を取得するAPIを叩く
- 取得したサイトID等を「第1のBatchマクロ」に渡す
- マクロから取得したグループとユーザーのデータをExcelに出力
認証
まず、Tableau Serverにサインインしないと話は始まりません。どうやって作るか…と考え始めましたが、ここに関しては一切作業する必要はありません。
なぜなら「Publish to Tableau Serverツール」の中に、すでにサインイン処理するマクロが入っているからです(要するにこのツールもTableau Server REST APIを利用して作られているというわけです)。
こいつをそのまま利用して認証部分は完成です。
サイト取得
認証マクロから選択ツールで必要そうなカラムを絞った後は、サイト一覧を取得するAPIのエンドポイントを計算ツールで作成します。
で、そいつを利用してDownloadツールでAPIを叩きます。
ヘッダーに、先程の認証で取得したトークンを使うのを忘れないようにしましょう。これでサイト一覧はもうGETできました。
ちなみにTableau Server REST APIはレスポンス形式をXMLかJSONか選べますが、今回はXMLで処理しています。普通は「ゲぇ〜XML〜」ってなるところですが、今回のAlteryxワークフロー的にはXMLのほうがデータ整形が楽だったので、XMLにしてます(後続のXMLパースツールでパースしておく)。
Defaultサイト対応
Tableau Serverには、インストール直後から必ず「Defaultサイト」というサイトが用意されています。これは試してみてわかったことなのですが、Tableau Serverに存在するサイトが「Defaultサイト」のみ…という場合、このAPIでsite_id
とsite_name
が返ってきませんでした。ですので、EnsureマクロというCREWマクロで、この2カラムが無かった場合は、無理やり作成するようにしています(「サイト名」は、例え「Defaultサイト」しか無くても、Excelファイルには出力したかったため)。
第1のBatchマクロ「サイト毎にグループを取得」
処理概要
- Tableau Serverにサインイン
- グループ取得するAPIを叩く
- 取得したグループID等を第2のBatchマクロに渡す
- 第2のBatchマクロからユーザー情報を取得したらサインアウト
- 次のサイトIDの処理を行う(1に戻る)
サインインとサインアウト
上記のワークフロー全体画像を見ていただければわかると思いますが、このマクロの最初と最後で、(さっきもサインインしたのに)わざわざサインインとサインアウトを行っています。なぜでしょう。APIドキュメントには下記のように書かれています。
The token is valid only for REST API calls. You cannot use the token as authentication for other operations with Tableau Server. In addition, the token is good only for operations in the site that you're signed in to. You cannot sign in to one site and then use the token you get back to send requests to a different site. If you do, the server returns an HTTP 403 (Forbidden) error.
For Tableau Server, if the site element is missing or if the contentUrl attribute is an empty string, you are signed in to the default site. Note that you always sign in to a specific site, even if you don't specify a site when you sign in.
Tableau Server REST APIのトークンは下記の仕様となっています。
- サイト毎に発行される(そのサイトでしか使えない)
- サイトを指定しなくても「デフォルト」サイトに必ずサインインする
つまり必ずいずれかのサイトにサインインする形となるため、サイト毎の処理が終わるたびにサインアウト→再サインインを行い、新しいサイト用のトークンを取得する必要があります。そのために、このような構成となっています。
Defaultサイト対応
これは試してみてわかったことなのですが、今回パクってきた認証部分のワークフローでは、サインイン時、site_name
にDefault
という値を渡すとうまく動きませんでした。ですので、site_name
がDefault
の場合は、値をNULLにする計算ツールを入れています。
第2のBatchマクロ「グループ毎にユーザーを取得」
こっちのマクロは、1サイトに対して行う処理なので、サインインとアウトを繰り返す等の複雑な処理はありません。
処理概要
- 取得したグループIDをもとに、ユーザーを取得するAPIを叩く
- 取得したユーザー情報を返す
- 次のグループIDの処理を行う(1に戻る)
Analytics App化
最初のテキスト入力ツールの各セルに対して、テキストボックスを配置することで、Tableau Serverのユーザー名、パスワード、URLの3つさえ入力すれば、自動的にExcelファイルが出力されるようにしました。
おわりに
今回はExcelファイルとして出力するようにしていますが、例えば出力部分を別のツールに変えると、もっと嬉しいワークフローになるかもしれません。「Amazon S3 アップロード」ツールを使って、ユーザーリストのcsvをS3にアップするようにすれば、より安全にリストを一発保管することができます。また、ワークフロー自体をAlteryx Serverにアップロードして、定期的に実行するように設定すれば、自動で毎月ユーザーリストを吐くようにすることもできますね。
Tableau Serverリポジトリを参照する方法もアリですが、リポジトリのためにポートを空けるのが許されない環境だとか、毎月リストを定期的に出力したいとか、そういった要望を叶える場合は、APIを叩く方がオススメです。