Re:dash APIを利用してRe:dashのお引っ越しする


概要

昔雑に立ててたRe:dashから新しいRe:dash環境にクエリをお引っ越しする。

Re:dashを雑に立てた結果さまざまな問題に直面したため新しくRe:dash環境を立ち上げて引っ越すことを決めた。
既存の環境を頑張っていい感じにすることも考えられるが利用者が少ない(私とディレクター1人だけ)&query以外そこまで利用していない背景があり、新しい環境立てて引っ越した方が早いのではと言う試みをしました。

成果物

実現したこと

旧環境のqueryを全て取得し、利用中のものだけ新しい環境に全てインポートする。

本家のドキュメントはGET系はそこそこわかりやすいのですが登録系はだいぶ苦戦しました....

ポイントだけ

APIキーの種類

Re:dashの認証には User API KeyQuery API Key のに種類があります。
Query API Key はそのクエリのみに限定された権限のAPI Keyになっており、本家のドキュメントでは可能な限りこちらを使用するようにと推奨しています。
=> 今回はQueryの全件取得を行うのと登録を行うため User API Key を利用します。管理画面から簡単にRegenerateできるので他で利用してないなら実行後にRegenerateしておくといいかもしれません。

認証方式

公式のドキュメントではquery parameterでapi_keyを設定する方法が書かれています。

$ curl https://{your redash domain}/api/queries?api_key={your user api key}

これとは別方式でAuthorization Headerに入れて検証する方式もあるようです。
query parameterで渡すよりもこちらの方がコードがシンプルになるので今回はこちらを採用。

$ curl -H "Authorization: Key {your user api key}" https://{your redash domain}/api/queries

他にも request.view_args.get("token") で渡す方法があるらしく、Flaskの機能らしいのですがちゃんと確認してないです。とはいえエンドポイントにapi key入れ込む手法らしくヘッダーに入れる方がシンプルかなと思って見切ってないです。

cf: https://github.com/getredash/redash/blob/2992c382d12ba0ddb23dd1886b38c00c0d8b67cc/redash/authentication/__init__.py#L142-L154

post /api/queriesが通らん...

エラーもそこまで詳細が詳しく返ってこないので割と手探りでやりまくりました。
=> Re:dashの管理画面からのリクエスト情報を参考に情報を絞っていくとわかりやすいと思います。

今回は以下のパラメータを投げることにしました。

  • name: queryのタイトル
  • query: 実際のSQL
  • description: よくわからん...(管理画面からだと登録できないのか?と思ったら左側にありました...)
  • schedule: 定期実行情報
  • data_source_id: データソースid(これは新旧で一致するとは限らないのでmapで対応表を噛ませました。(とはいえデータソース一つなのでどちらでもでしたが...))

後追いですがここら辺見るとパラメータについて書かれてました。上のものが必須でそれ以外はoptionalみたいですね。
https://github.com/getredash/redash/blob/2992c382d12ba0ddb23dd1886b38c00c0d8b67cc/redash/handlers/queries.py#L330-L342

        """
        Create a new query.
        :<json number data_source_id: The ID of the data source this query will run on
        :<json string query: Query text
        :<json string name:
        :<json string description:
        :<json string schedule: Schedule interval, in seconds, for repeated execution of this query
        :<json object options: Query options
        .. _query-response-label:

        .........

        """

実行後に全部unpublish状態で だったのですがどうやら固定でdraft状態になるっぽいです。。
https://github.com/getredash/redash/blob/0e1587a0687838b934c90c2b066ae0aa7db0af83/redash/handlers/queries.py#L257

Re:dash APIと戦う時の心得

まず前提として公式のドキュメント以外の非公式?なAPIがとてもたくさんありました...。

Re:dashのAPIはここにまとめられていました。
https://github.com/getredash/redash/blob/0e1587a0687838b934c90c2b066ae0aa7db0af83/redash/handlers/api.py

この中からそれっぽいエンドポイントを探し当てて **Resources クラスを特定する。
あとはそのクラスで全件検索なりドリルダウンなりして該当のエンドポイントの実装を探す。
=> 大体コメントで必要なパラメータを記載してくれてます。

素敵なRe:dashライフをgood luck!

参考

https://redash.io/help/user-guide/integrations-and-api/api
https://qiita.com/sakatukitukasa/items/18012b7bed4aec437ae5