Tableau

【Matillion】TableauメタデータAPIを利用してメタデータ情報をDWHにエクスポートする

こちらの記事の続きです。

【Tableau】メタデータAPIを利用してワークブックとテーブルの対応表を取得する例えばDWHやデータマートのあるテーブルの整形ロジックを変更した時、どのワークブックが影響を受けるか気になる時ってありますよね。こんな時...

本記事ではELTツールのMatillionでTableauメタデータAPIを利用→メタデータ情報をDWHにエクスポートする方法を簡単にご紹介します。
※Matillionに関する記事はこちら

メタデータAPIを利用する際の流れ

1. 認証トークンを取得

メタデータAPIを利用してメタデータ情報を取得するには、あらかじめ認証トークンを取得しておく必要があります。2023年10月現在、認証トークンの取得方法は3種類ほど用意されています。
※詳しい取得方法はこちら

2. 認証トークンを用いてメタデータAPIを利用(POST)→結果を取得

取得した認証トークンを利用してPOST形式でAPIを叩きます。その際、GraphQLのクエリをbodyで渡します。エンドポイントは以下の通りです。

https://<server-name>/api/metadata/graphql
例)https://us-west-2b.online.tableau.com/api/metadata/graphql

Matillionでのジョブ作成

本記事では認証トークンを取得するために”Python Script”コンポーネント、メタデータAPIを叩いて出力をDWH(Snowflake)にエクスポートするのに”API Query”コンポーネントを使用しています。下図はフローの全体図になります。

1. 認証トークンを取得するために必要な個人アクセストークン用の環境変数を用意

Project > Manage Environment Variablesから認証トークンを取得するために必要なトークン名とシークレットの環境変数をそれぞれ用意し、値を設定しておきます。ここで設定した環境変数はPythonで認証トークンを取得する際に参照します。


※個人アクセストークンの取得方法はこちら

2. 認証トークンを一時的に格納しておくための環境変数を用意

同じく Project > Manage Environment VariablesからPythonで取得した認証トークンを一時的に格納しておくための環境変数を用意します。ここで設定した環境変数はAPI QueryコンポーネントでAPIを叩く際に参照します。

3. Manage Query ProfilesでメタデータAPIの情報を設定

Project > Manage API Profiles > Manage Query ProfilesからメタデータAPIの情報を設定します。下記画面のAuthタブでENABLEDをonにして、Type欄で”Bearer Token”を選択します。また、プロファイルを設定する際にはいったん認証を通す必要があるため、画面右側では認証トークンを入力する必要があります。
※そのために、あらかじめ後述のPythonスクリプトを実行するなどして、認証トークンを取得しておく必要があります。

また、BodyタブからGraphQLのクエリをjson形式で記述します。この際、以下ポイントに注意してください。

  • keyに”query”、valueにクエリ内容を記述する
    例){“query”: “query getWorkbooksAndTables { workbooks { id name upstreamTables { id name }}}”}
  • value(クエリ内容)の中で改行しない
    ※改行するとエラーとなる

※詳しいプロファイル設定方法はこちら

4. 認証トークンを取得→環境変数に格納するPythonスクリプトを作成

“Python Script”コンポーネント上で認証トークンを取得→環境変数に格納するPythonスクリプトを作成します。以下、ソースコードになります。

  • nameとsecretに対応する環境変数(tableau_pat_name, tableau_pat_secret)を代入しています。
  • serverとsiteは必要に応じて修正してください。
  • 最終行で環境変数’tableau_token’に取得した認証トークンを代入しています。
import json
import pandas as pd
import requests


# トークンの取得
def get_token(server, name, secret, site):
    # URLの構築(APIのバージョンを変更する際は3.13の部分を変更)
    url = server + "/api/3.13/auth/signin"
    # ヘッダー
    headers = {
        "accept": "application/json",
        "content-type": "application/json"
    }
    # ボディ
    body = {
        "credentials": {"personalAccessTokenName": name,
                        "personalAccessTokenSecret": secret,
                        "site": {"contentUrl": site}}}
    # POST
    pst = requests.post(url, json=body, headers=headers)
    # 結果取得
    response = pst.json()
    token = response["credentials"]["token"]
    return token
  

if __name__ == '__main__':
    # 各種設定
    server = "サーバーのURL" #ex)"https://us-west-2b.online.tableau.com"
    name = tableau_pat_name
    secret = tableau_pat_secret
    site = "サイト名"
    # 関数実行
    token = get_token(server, name, secret, site)
    context.updateVariable('tableau_token', token)
5. メタデータ情報を取得→DWHにエクスポートする処理を”API Query”コンポーネントを用いて作成

“API Query”コンポーネントのProperties欄から各種設定を行います。

この際、以下ポイントに注意してください。

  • Authentication Methodでは”Bearer Token”ではなく”Other”を選択する
  • Connection OptionsのParameterに”CustomHeaders”、Valueに”X-tableau-auth:${tokenが入っている変数名}”を入力する

あとはエクスポート先のテーブルを設定すればジョブは一通り完成です。

mochizuki
データサイエンティスト。筋トレ、温泉、時々スキー。