社内で Redash の話をしていて「API key はクエリ単位に存在する」という仕様があまり知られていなかったので,まとめておこうと思う.
API Key の種類
Redash には2種類の API Key が存在する.恐らく Query API Key の存在を知らない人が多いのではないかなと思う.
- User API Key
- Query API Key
ドキュメントにも書いてある通り,できる限り Query API Key を使うべきと書いてある.
PostgreSQL で確認してみる
Redash ハンズオンで構築した PostgreSQL コンテナを使って,実際にクエリを投げてみる.
以下のように queries
テーブルのデータを確認すると,クエリごとに api_key
が存在していることがわかる.
/ # psql -U postgres -d postgres postgres=# SELECT id, name, user_id, api_key FROM queries ORDER BY id; id | name | user_id | api_key ----+------------+---------+------------------------------------------ 1 | 国の一覧 | 1 | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 2 | 国の件数 | 1 | yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy 3 | 都市の件数 | 1 | zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz (3 rows) postgres-# \q
Query API Key を使う
じゃあ Query API Key をどこで使うの?と言うと,API 経由でクエリ結果を取得するときに使う.クエリ編集で右側のメニューから「Show API Key」を押すと,API 経由でクエリ結果を CSV と JSON で取得するための URL が出力される.
(Show API Key メニュー)
(クエリ結果を取得する URL)
クエリ結果を JSON で取得して jq でパースする
例えば,jq で JSON 結果の上位2件を取得することもできる.クエリ結果を JSON で取得できるのは,いろいろと応用できて便利かと!
$ curl -s http://localhost/api/queries/1/results.json\?api_key\=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | jq '.query_result.data.rows | [limit(2;.[])]' [ { "GovernmentForm": "Nonmetropolitan Territory of The Netherlands", "GNP": 828, "Code": "ABW", "Name": "Aruba", "HeadOfState": "Beatrix", "SurfaceArea": 193, "Region": "Caribbean", "Code2": "AW", "LifeExpectancy": 78.4, "Capital": 129, "LocalName": "Aruba", "GNPOld": 793, "Continent": "North America", "IndepYear": null, "Population": 103000 }, { "GovernmentForm": "Islamic Emirate", "GNP": 5976, "Code": "AFG", "Name": "Afghanistan", "HeadOfState": "Mohammad Omar", "SurfaceArea": 652090, "Region": "Southern and Central Asia", "Code2": "AF", "LifeExpectancy": 45.9, "Capital": 1, "LocalName": "Afganistan/Afqanestan", "GNPOld": null, "Continent": "Asia", "IndepYear": 1919, "Population": 22720000 } ]
リフレッシュ API を試す
ただし,API 経由でクエリ結果を取得しても,クエリ結果がキャッシュされてしまっている場合がある.そのためにリフレッシュ API も用意されている.リフレッシュ API を使う場合は User API Key を使う必要がある.あくまで Query API Key は「クエリ結果を取得するため」のものであり,リフレッシュなど「状態を変化させるため」には使えないようになっている.
$ curl -XPOST http://localhost/api/queries/1/refresh\?api_key\=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa {"job": {"status": 1, "error": "", "id": "fc820fb6-6c1b-46fc-9005-3ba1f3042084", "query_result_id": null, "updated_at": 0}}%
小ネタ : Redash v3 で修正されたリフレッシュ API のエラー処理
Query API Key を使ってリフレッシュ API を叩いたときの挙動が,Redash v2 と Redash v3 で異なる.正確に言うと,Redash v3 で正しくエラーが返されるように修正されている.
Redash v2
Redash v2 だと 500 になってしまっている.
$ curl -XPOST http://localhost/api/queries/1/refresh\?api_key\=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx {"message": "Internal Server Error"}%
Redash v3
Redash v3 だと,適切なエラーメッセージが返っている.
$ curl -XPOST http://localhost/api/queries/1/refresh\?api_key\=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx {"message": "Please use a user API key."}%
まとめ
- Redash の API Key には User API Key と Query API Key の2種類がある
- API 経由でクエリ結果を取得できる(CSV と JSON)
- クエリ結果を最新化するためのリフレッシュ API があり,User API Key を使う必要がある
- Query API Key を使ってリフレッシュ API を叩いたときのエラー処理が Redash v2 と Redash v3 で異なる