redashmanを使ってRedashのクエリをお手軽にバックアップする

今日はRedash Advent Calendar 16日目ですが、この記事はAdvent Calendarの記事ではありません。

qiita.com

12/16の記事はvankobeさんによる、Redashの結果をGoogleスプレッドシートで扱う事例の記事です。

qiita.com

Redashの便利さと、その裏にあるつらみ

Redashを活用しはじめて1年半ほど経ちますが、今ではRedashなしで業務が回らなくなるほどに使い倒しています。

しかし、Redashの活用が進んだことによって「Redashが落ちたら全てが止まる」といった状況になりつつあることも事実で、たまにRedashの収容サーバーからアラートが飛んでくると、背筋が凍る思いをしています。

それだけでなく、Redashの利点でもある「誰でもクエリを実行・編集できる」というのが、運用上問題になることも何度か経験してきました。

この記事ではRedashのクエリのバックアップについて、自作のツール redashman の宣伝もしつつ紹介していきます。

Redashのバックアップ

ざっくりですが、すぐ思いつくバックアップ方法は以下の2つと考えています。

  • Redashインスタンスのディスクイメージのスナップショットを取得する
  • Redashの管理DB(PostgreSQL)のDBバックアップを取得する

構成にもよりますが、ディスクイメージのバックアップはIaaSを使っていれば、もっとも簡単かつ安心できる方法かと思います。

管理DBのバックアップは、バックアップスクリプトや保存先を用意する必要がありますが、PostgreSQLについて少し知識があれば簡単に実現できる方法と言えます。

上記のように、ディスクやデータベースの単位でバックアップをとっておくことは運用上重要なことですが、「クエリ」のバックアップについても考えてみます。

Redashは誰でも気軽にクエリを実行・編集することができる一方で、悪意の有無に関わらず、誤ってクエリを編集してしまい、クエリが実行できなくなってしまうことが考えられます。

しかし、先に紹介したディスクやデータベースによるバックアップは「クエリ」のバックアップという点で考えるとリストアの手間もあり、少し大げさに感じる部分があります。

redashman について

現在、私は redashman という自作のツールを用いて、Redashのクエリを定期的にバックアップしています。

github.com

Redashを管理するので redashman という名前にしましたが、なぜか青いロボットが針に当たってティウンティウンする光景が目に浮かんだかたは個別にご連絡ください。私はX4が好きです。

このツールはクエリの一覧、取得、作成などをCLIから実行するためのツールとして作成しましたが、その中にクエリの定義を取得するものがあるので、それを使ってクエリをバックアップしています。

インストール

redashman はGoで書いたので、go get で簡単にインストールできます。

$ go get -u github.com/ariarijp/redashman

redashman を使用したクエリのお手軽バックアップ

redashman 自体の使い方についてはREADMEを参照していただくとして、付属のPythonスクリプトを使用してバックアップをしてみます。

$ mkdir redash_backup
$ cd redash_backup
$ cp $GOPATH/src/github.com/ariarijp/redashman/scripts/backup_queries.py ./
$ export REDASH_URL=http://localhost
$ export REDASH_API_KEY="Redashのadmin権限があるユーザーのAPIキー"
$ python ./backup_queries.py
$ ls -la backup
total 48
drwxr-xr-x  8 ariarijp  wheel  272 12 16 14:34 .
drwxr-xr-x  4 ariarijp  wheel  136 12 16 14:34 ..
-rw-r--r--  1 ariarijp  wheel   23 12 16 14:34 0001.sql
-rw-r--r--  1 ariarijp  wheel   51 12 16 14:34 0002.sql
-rw-r--r--  1 ariarijp  wheel   89 12 16 14:34 0003.sql
-rw-r--r--  1 ariarijp  wheel   83 12 16 14:34 0004.sql
-rw-r--r--  1 ariarijp  wheel   89 12 16 14:34 0005.sql
$ cat backup/0001.sql
SELECT * FROM country;

これでクエリのバックアップを取得することができるようになりました。

定期的にバックアップし、変更履歴も残す

定期的にバックアップをするには、もう一手間かける必要があります。

そのために、以下のスクリプトbackup.sh として保存し、実行権限を与えておきます。

#!/bin/bash

export REDASH_URL=http://localhost
export REDASH_API_KEY="Redashのadmin権限があるユーザーのAPIキー"

cd `dirname $0`

if [ ! -d '.git' ]; then
  git init
fi

python backup_queries.py
git add . && git ci -a -m `date '+%Y%m%d%H%M%S'`

これを実行すると、先ほどのPythonスクリプトでクエリのバックアップを取得し、そのファイルがGitリポジトリにコミットされます。

$ ./backup.sh
Initialized empty Git repository in /private/tmp/redash_backup/.git/
[master (root-commit) 820ae32] 20171216144840
 8 files changed, 49 insertions(+)
 create mode 100755 backup.sh
 create mode 100644 backup/0001.sql
 create mode 100644 backup/0002.sql
 create mode 100644 backup/0003.sql
 create mode 100644 backup/0004.sql
 create mode 100644 backup/0005.sql
 create mode 100644 backup_queries.py

このスクリプトcron などを使って適当な間隔で定期実行すれば、クエリのバックアップを定期的に、かつ、Gitを使用することで履歴とタイムスタンプ付きで保存することができるようになります。

まとめ

Redashの気軽さを維持しつつ、redashman でクエリを定期的にバックアップすることで、クエリを誤って編集してしまったなどのトラブルに対処できるようになり、副産物としてクエリの編集履歴もGitという多くの開発者の手に馴染んだツールで管理できるようになります。

Redashの利用をこれから検討している方にも、ぜひ redashman の導入を検討してみてほしいです。

宣伝

id:kakku22 と私の主催で、ハンズオン形式のRedash Meetup #0 を12/19(火)に開催しますが。ありがたいことにキャンセル待ちが出ています。

redash-meetup.connpass.com

ハンズオンイベントについては来年1月に再演を計画していますので、今回予定が合わなかったり、キャンセル待ちから繰り上がらなかった方も、改めて参加を検討していただけるとうれしいです。

また、今後はハンズオンイベントではなく、各社の導入事例を成功も失敗も含めて共有できるような企画も検討しておりますので、Redashに興味があるかたは、よろしければConnpassのRedash Meetupグループに参加してみてください。

redash-meetup.connpass.com

このグループに参加していると、次回のハンズオンも含め、今後のイベント日程もチェックしやすくなると思います。