Redash には2種類の API Key が存在する

社内で Redash の話をしていて「API key はクエリ単位に存在する」という仕様があまり知られていなかったので,まとめておこうと思う.

API Key の種類

Redash には2種類の API Key が存在する.恐らく Query API Key の存在を知らない人が多いのではないかなと思う.

  • User API Key
  • Query API Key

ドキュメントにも書いてある通り,できる限り Query API Key を使うべきと書いてある.

help.redash.io

PostgreSQL で確認してみる

Redash ハンズオンで構築した PostgreSQL コンテナを使って,実際にクエリを投げてみる.

github.com

以下のように 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 が出力される.

f:id:kakku22:20180126175436p:plain

(Show API Key メニュー)

f:id:kakku22:20180126175532p:plain

(クエリ結果を取得する 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 で正しくエラーが返されるように修正されている.

github.com

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 KeyQuery API Key の2種類がある
  • API 経由でクエリ結果を取得できる(CSV と JSON)
  • クエリ結果を最新化するためのリフレッシュ API があり,User API Key を使う必要がある
  • Query API Key を使ってリフレッシュ API を叩いたときのエラー処理が Redash v2 と Redash v3 で異なる