Tableau OnlineのメタデータをPythonで取得してみた

3 min read読了の目安(約3300字

経緯

業務でTableau Onlineのワークブックとビューのメタデータを取得したいという要件があったので、技術調査の結果をまとめようと思います。

Tableau Onlineのメタデータ取得方法

Tableauドキュメントの開発者向けリソース を見ると、「Tableau メタデータ API」というものがある

GraphQL を使用すると、Tableau コンテンツと関連する外部アセットとメタデータを検出してクエリを実行できます。詳細については、「Tableau メタデータ API」(Link opens in a new window)を参照してください。

TableauメタデータAPIとは?

ドキュメント

公式ドキュメント

概要

Tableau Metadata APIは、ワークブック、データソース、フロー、メトリックなど、TableauOnlineサイトまたはTableauServer上のすべてのコンテンツを検出してインデックスを作成します。
インデックス作成は、Tableauコンテンツ、つまりメタデータに関する情報、コンテンツのスキーマと系統に関する情報を収集するために使用されます。
次に、メタデータから、Metadata APIは、Tableau OnlineサイトまたはTableauServerのコンテンツで使用されるすべてのデータベース、ファイル、およびテーブルを識別します。

使えそう!

メタデータAPIとGraphQL

メタデータAPIは、関心のあるデータのみを要求して返す方法を説明するAPIのクエリ言語であるGraphQLを使用します。

GraphQLとは?

GraphQLについては、私が実際に参考にしたリンクを張っておきます。

https://graphql.org/
https://www.webprofessional.jp/rest-2-0-graphql/
https://qiita.com/SiragumoHuin/items/cc58f456bc43a1be41b4

TableauメタデータAPIを叩いてみる

TableauメタデータAPIのリファレンス

GraphiQLを使用してサクッと叩く

GraphiQLについて
クエリの例

  • ビューの一覧取得
query ShowViews{
  views {
    id
    name
  }
}
  • 名前が「Orders」のビューの取得
query FilteredShowViews{
  views (filter: {name: "Orders"}){
    id
    name
  }
}
  • ワークブック一覧を取得
query ShowWorkbooks{
  workbooks {
    id
    name
  }
}

認証について

認証方法
メタデータAPIでは、クエリを送信するたびに認証トークンを送信する必要があります。
トークンを使用すると、TableauOnlineまたはTableauServerでIDを確認し、サインインしていることを確認できます。
トークンを取得するには、Tableau REST APIバージョン3.6以降を使用して、2つの方法のいずれかでSignInメソッドを呼び出すことができます。

  • パーソナルアクセストークンを使用してサインインする
  • ユーザー名とパスワードを使用してサインインする

自動スクリプトとタスクのための認証はパーソナルアクセストークンを使用することが推奨です。

パーソナルアクセストークンで認証するメリット

  • ユーザー名とパスワードを使わないので、リスクが少ない
  • もしトークンが公開されたとしても、ユーザーは消さずに済む。トークンを削除すればよい
  • 15日間連続で使わなかったら自動で有効期限が切れるのでリスクが減る
  • トークンは実行されるスクリプトやタスクごとに作成できる
  • ユーザー アカウントのパスワード リセットやメタデータの変更 (ユーザー名、メールなど) を行っても、自動化が中断することがない

PythonでのメタデータAPI実行

パーソナルアクセストークンで認証する場合のサンプル

import argparse
import tableauserverclient as TSC

QUERY = """
{
  views {
    id
    name
  }
}
"""

def main():
    parser = argparse.ArgumentParser(description='Creates sample schedules for each type of frequency.')
    parser.add_argument('--server', '-s', required=True, help='server address')
    parser.add_argument('--token_name', '-tn', required=True, help='personal access tokenname to sign into server')
    parser.add_argument('--token_secret', '-ts', required=True, help='personal access tokenseclet to sign into server')
    parser.add_argument('--sitename', '-n', help='fghdhr')
    args = parser.parse_args()
    
    tableau_auth = TSC.PersonalAccessTokenAuth(args.token_name, args.token_secret, args.sitename)
    server = TSC.Server(args.server)
    server.version = '3.5'
    
    with server.auth.sign_in(tableau_auth):
        response = server.metadata.query(QUERY)

    print(response)


if __name__ == '__main__':
    main()