Alteryxを使ってTableau Serverに存在するユーザーの一覧をExcelに出力してみた #Alteryx #Tableau

Tableau Server REST APIは結構独特な印象
2019.03.18

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

どうも。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 REST APIを使う

もう一つの手段は、Tableau ServerのAPIを叩く方法です。実はTableau ServerにもREST APIが用意されており、それを叩けば、Tableau Serverの色々なデータを取得することができます。

APIが叩ける→Alteryx Designerで取得できる

というわけで実践じゃ

ワークフローの要件

出力するユーザーリスト

以下がわかるExcelファイルを出力したいと思います。

  • 属するサイト
  • 属するグループ
  • ユーザー名
  • サイトロール

処理の概要

  1. Tableau Server REST API上でサインインする(トークンを取得する)
  2. サイト一覧を取得する
  3. サイト毎にグループ一覧を取得する
  4. グループ毎にユーザー一覧を取得する

サイトに存在するユーザーを一括取得できるAPIもありますが、今回は出力先にグループ名も載せたいので、グループからユーザーを取得するAPIを使用します。

使用するAPIを選定

ワークフローを作成

全体図

今回はBatchマクロが2つ登場します。それぞれ「(取得した)サイトID毎にQuery Groupsを叩く」「(取得した)グループID毎にGet Users in Groupを叩く」というループ処理が必要だからです。本当はAPI毎にIterativeマクロ化もしようかと思っていたのですが、どれも1リクエストで1000件取得できるということと、サイトやグループが1000以上あることは稀だと思ったので、今回は実装していません。

1000件以上の可能性があるとしたらユーザーですが、そこをページネーション対応したい場合は、下記ブログを参考にしてください。

本体ワークフローのポイント

処理概要

  1. Tableau Serverアカウント(ユーザー名とパスワード)とURLを入力
  2. Tableau Serverにサインイン
  3. サイト一覧を取得するAPIを叩く
  4. 取得したサイトID等を「第1のBatchマクロ」に渡す
  5. マクロから取得したグループとユーザーのデータを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_idsite_nameが返ってきませんでした。ですので、EnsureマクロというCREWマクロで、この2カラムが無かった場合は、無理やり作成するようにしています(「サイト名」は、例え「Defaultサイト」しか無くても、Excelファイルには出力したかったため)。

第1のBatchマクロ「サイト毎にグループを取得」

処理概要

  1. Tableau Serverにサインイン
  2. グループ取得するAPIを叩く
  3. 取得したグループID等を第2のBatchマクロに渡す
  4. 第2のBatchマクロからユーザー情報を取得したらサインアウト
  5. 次のサイト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_nameDefaultという値を渡すとうまく動きませんでした。ですので、site_nameDefaultの場合は、値をNULLにする計算ツールを入れています。

第2のBatchマクロ「グループ毎にユーザーを取得」

こっちのマクロは、1サイトに対して行う処理なので、サインインとアウトを繰り返す等の複雑な処理はありません。

処理概要

  1. 取得したグループIDをもとに、ユーザーを取得するAPIを叩く
  2. 取得したユーザー情報を返す
  3. 次のグループIDの処理を行う(1に戻る)

Analytics App化

最初のテキスト入力ツールの各セルに対して、テキストボックスを配置することで、Tableau Serverのユーザー名、パスワード、URLの3つさえ入力すれば、自動的にExcelファイルが出力されるようにしました。

おわりに

今回はExcelファイルとして出力するようにしていますが、例えば出力部分を別のツールに変えると、もっと嬉しいワークフローになるかもしれません。「Amazon S3 アップロード」ツールを使って、ユーザーリストのcsvをS3にアップするようにすれば、より安全にリストを一発保管することができます。また、ワークフロー自体をAlteryx Serverにアップロードして、定期的に実行するように設定すれば、自動で毎月ユーザーリストを吐くようにすることもできますね。

Tableau Serverリポジトリを参照する方法もアリですが、リポジトリのためにポートを空けるのが許されない環境だとか、毎月リストを定期的に出力したいとか、そういった要望を叶える場合は、APIを叩く方がオススメです。