Tableau Onlineに対してpython clientで抽出の更新を行う

こんにちは、AIチームの杉山です。
Tableau Onlineで抽出の更新を定期実行する際に規定のスケジュールしか使えず困ったので、pythonからAPIで抽出の更新を行いcronなどで任意のタイミングで実行できるようにしたので、その方法を備忘録的に公開します。
Tableau Server操作用のpython clientは提供されているものの、Tableau Online特有の癖があり少し工夫が必要だったので同じように困った方のお役に立てば幸いです。

Tableau Onlineとは

Tableau Desktopで作成したWorkbookを共有、公開する際には通常Tableau Serverを用います。Tableau Serverを運用するにはそのためのインフラ手配やサーバー管理を自分たちで行う必要があります。Tableau Onlineはその部分を全てTableau社が担い、Tableau Serverの機能をSaaS型で提供しているサービスになります。Tableau Onlineを用いることで面倒な作業を行うことなくTableu Serverの機能を利用することができ、本来の可視化・分析に集中することができます。
一方で、フルマネージドなSaaSにありがちなことではありますが、バージョンが勝手に変わっていたり細かい設定が変更できなかったりと痒いところに手が届かないシーンがあります。今回のケースでは、抽出の更新の定期実行を設定する際にプリセットにはない柔軟な設定をしたかったり、日時のバッチ集計が終わったことをトリガーにして抽出の更新を行うジョブフローを組みたかったりするケースに対して、管理画面からの設定では実現できませんがAPI経由で実行することでそれらが実現できるようになります。

実行方法

python用のtableauライブラリが提供されているため、pipでインストールします

pip install tableauserverclient

pythonで以下のようなスクリプトを作成し実行することで指定したWorkbookに対し任意のタイミングで抽出の更新を行うことができます。
Tableau OnlineはURLが自動で発行されるため、各種パラメーターの指定方法がわかりづらいですが、コード中のコメントを参考にご自身の環境でのパラメーターを取得、指定してください。

import tableauserverclient as ts_client

# サイトIDはTableau OnlineのURL中の/site/に続く文字列
tableau_auth = ts_client.TableauAuth('{username}', '{password}', site_id='{サイトID}')

# ポッドIDはご利用のTableau OnlineのURLに含まれるのでそちらを指定する
server = ts_client.Server('https://{ポッドID}.online.tableau.com/')

# APIバージョンは以下のURL内の対応表から取得し、指定する
# https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_concepts_versions.htm
server.version = '{api version of tableau online}'

with server.auth.sign_in(tableau_auth):
    # 更新したいワークブックのIDを確認
    all_workbooks, pagination_item = server.workbooks.get()
    print([(workbook.id, workbook.name) for workbook in all_workbooks])
    
    # 上で確認したワークブックIDを指定
    status = server.workbooks.refresh(workbook_id='ワークブックID')

このスクリプトをGoogle Cloud FunctionsやAWS Lambdaなどの実行環境に配置し、Google Cloud SchedulerやAmazon CloudWatch Eventsで定期実行したりトリガーを設定して実行することで好きなタイミングで抽出の更新が行えます。

参考

Tableau Server Client