よんけんだより

思いついたら書いてます。なので、あんまり読みやすくないかも。備忘です。

俺、バカだからよくわかんねぇけどよ、REST APIが使いてぇよ!!!!

こんにちは。tomoboyです。

SIerとしてクラウドに関する導入とか提案とか検証支援とかしています。 技術も好きだけど、もっぱら組織論が好きでみんなが働きやすい環境を目指して日々試行錯誤しています。

今日はほんの少しだけ技術のお話です。 たまたま、そんな機会があったのでTableau君のREST APIのお話です。

こんなブログをお読みの皆さんはよく利用されてるかと思う、Tableauくん。
どうやらBIツール界隈じゃブイブイ言わせてるらしいじゃないですか。
キミ、やるじゃん。
「tomoboyくんさぁ、ちょっと運用作業大変になってきたらコードでヒョッと実行したい。調べておいてくれ」

言うじゃん。

調べました。そもそもREST API自体やったことなかったのでそこからでした。
多分世の中にはそんな人いっぱいいるだろうから、同じ様な人の参考になればと調べたことから書きますよ。

そもそもREST APIってなんだよ

言いたいことはわかりますよ。
「Representational State Tranfer の頭文字をとったんやで。」でしょ?
違う違う。そうじゃ、そうじゃない。
そんなことを聞きたいんじゃない。

APIもわからねぇんだ・・・
そういうことなんだ
結局のところこんな感じに理解

  • APIはアプリケーションにいたずらできる口。開発者は遊び心に長けてるからアプリの外から別の方法(インターフェース)で操作できるようにしちゃう。
  • RESTはステートレスな通信。つまり一夜の関係。投げたらそこまで。

    ※違かったら教えてください。

じゃあどうやってリクエスト投げるわけ?お前はいつも大事なことを忘れてるな

Curlコマンドとか、Invoke-Restmethodとかで実行するみたい。
curlはhttpリクエストのコマンドとして有名ですよね。
Invoke何某は今回使わなかったら一生見ることなかったかもと思った。
ちなみにPowershellはどっちもいけるっぽい。
Invoke何某はPowershellのコマンドなので、Linuxでは使えないよ。Curlでよろしく。

ふーん、で、TableauのREST APIはどういう流れになるの?

流れって、大事ですよね。 TableauのREST APIの流れはこんな感じ

  1. サインイン
  2. アクセストークン取得
  3. リクエスト投げつけ

簡単ですね。ちょっと少し入ってってみてみましょうか。

サインイン

サインインは、自分が使うに値するユーザーであることをTabelau君に知らしめるための行為です。 これをするとREST APIでの操作をして良いユーザーである証になるアクセストークンがもらえます。

必要な情報は3点

  • ユーザ名
  • パスワード
  • サイト名

ちなみに、SAMLでのSSO構成でパスワードないんだけど!?って方は、

  • Private Access Taken名
  • Private Access Taken シークレットキー
  • サイト名

こんな感じの内容でサインインできます。
ユーザ名 / パスワード は Tableau君にログインするときのものを利用すれば良いです。
Private Access Takenは別途払い出す必要がありますが、
Tableau君のホームページに払い出し方書いてあるから端折ります。ググってください
TableauでSAMLしてる環境でREST API叩くなら、PAT使ってくれ。さすれば道は開かれん。

ちなみに、URIにサイト名が入ってる場合、サインインしたときに指定したサイトしか使えないっていう制限があります。
地味に引っかかると思うので注意です!

ちなみにサインインはこんな感じのコードでどうでしょうか

 $response = Invoke-RestMethod -Uri https://[サーバー名]/api/[apiバージョン]/auth/signin -Body $body -Method Post

Bodyのオプションについては、事前にbodyにクレデンシャル情報仕込んでおきましょうね~~

アクセストークンの取得

サインインするとレスポンスの中にアクセストークンが詰まってるので、取り出します。
サインインするときのコマンドで $response って変数にXMLを格納しましたよね?
あ、申し遅れました。コマンドの結果はXMLで帰ってきてそれを変数で受け止めます。

で、私たちはそれを一時的な格納変数から再利用するための変数に格納しかえます。
こんな感じ

authToken = $response.tsResponse.credentials.token
siteID = $response.tsResponse.credentials.site.id
myUserID = $response.tsResponse.credentials.user.id

中身を確認すると

$authToken=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

みたいな文字の羅列があります。 こんな感じでアクセストークンを取得します。大事にしましょう。

リクエスト投げつけ

一番大事かつ気になるのがここですよね。
どうやってリクエストを投げるのか。
型は決まってます。

$response = Invoke-RestMethod -Uri https://hogehoge.com/~~~uri~~~ -Header  $AccessTaken -Method (POST or GETor PUT or DELETE) -body $body

みたいな感じでス。それぞれザっと説明します。

-Uri

投げつけるURIを記載する。普通にhttpsリクエストなので、ホスト名+インターフェースのURIって感じ

-Header

さっき取得したアクセストークンを付けます。事前に変数に格納すると楽です。
これがあることで、Tableauサーバは「このリクエストは使っていい人から送られてきてるんだ!」と認識することができる

-Method

メソッドはHTTPので用意されてるメソッド。僕詳しいことわかんないけど、消すタイプのuriはDELETEだし、作るタイプはPOST、情報を取得するタイプはGETであることが多いです。
細かいことはわかんないけど、「大体そういう方向性のリクエストだよ」っていうメッセージ程度に認識してます。
プロトコルの理解とり使えることが優先だったため許してください。

と、こんな感じで実行すれば、$responseにレスポンスが帰ってきます。
必要に応じて取り出して有効活用してください。

ここから先はどう処理を組むかって話なので、僕はあんまり関係なくなると思います。
ここまでについてはTableau公式でチュートリアル出てるし、
クラスメソッドさんがいい記事書いてますし、有志がサンプルコード書いてくれてるので参考にしてください。
ぶっちゃけ僕の記事よりこっちの方がいいと思います。ダハハ。

この記事の内容が意味わからなくて、でも聞きたいって場合はTwitterでDM送ってください。
この記事の範囲からちょっと足を出すくらいならお答えできると思います。

ではでは。