新着記事

Viewing posts for the category Re:dash

旧Redash(V2) から 新Redash(V8) にアップデートを行いました

Qiita の TORICO Advent Calendar 2019 の記事として書きました

社内での実績閲覧のツールとして Re:dash を使っています。

最初に導入した Re:dash v2 のまましばらくアップデートを行っていなかったので、v8 にアップデートを行いました。

アップデート方針

v8 は dockerコンテナで提供され、 docker-compose で起動させることができます。提供されている docker-compose.yml は、Postgres や redis コンテナの起動も自動でされますし、インストールスクリプトも良くできており、初期状態の ubuntu サーバであればコマンド一発で docker エンジンのインストールも含めアプリの起動まで行うことができます。

従来の EC2イメージの Redash から、スクリプトでアップデートできたら楽なのですが、少し試したところ Postgres の DB のスキーマ名が変わっていたり、Postgresのサーバのバージョンも 9.3 -> 9.6 への大きなアップデートとなることもあり、今回は「Redash v8 を新規EC2で起動し、旧サーバからDBのレコードをコピーする」という方針としました。

Redash V8 サーバの構築

https://github.com/getredash/setup/ こちらのスクリプトを使うことで、非常に簡単に起動させることができます。

1. EC2 で Ubuntu18 サーバを起動

2. ホームディレクトリで、

git clone git@github.com:getredash/setup.git

3.

cd setup
bash setup.sh

あとは、スクリプトの中で docker エンジンのインストール、postgres のデータファイル構築や ランダムなDBパスワードの作成、初期スキーマの構築などすべて行ってくれます。スクリプト終了時に docker-compose up -d まで行うため、ブラウザでアクセスすれば Redash のサインインページが表示されます。

postgres コンテナへの接続

インポートするために、Postgres の Docker コンテナに外部から接続できるようにします。

上記スクリプトで Redash をインストールした場合、/opt/redash/docker-compose.yml が作成されますので、この postgres サービスの箇所に

 postgres:
image: postgres:9.6-alpine
env_file: /opt/redash/env
volumes:
- /opt/redash/postgres-data:/var/lib/postgresql/data
restart: always
# 追加
ports:
- "5432:5432"

ports項目を追加し、ホストマシンの5432ポートをコンテナに接続します。
/opt/redash/env の POSTGRES_PASSWORD に作成されているパスワードと、ユーザー名 postgres でコンテナの postgres に接続できます。

旧サーバの暗号キー等の設定のコピー

旧サーバの、/opt/redash/.env の設定値を新サーバにコピーします。

REDASH_COOKIE_SECRET 

REDASH_COOKIE_SECRET は、DBの data_sources テーブルにある暗号化フィールドの復号化に使われますので、テーブル内容をそのままコピーする場合は一致させる必要があります。

これを一致させない場合、Redash 起動時の data source の選択の際にローディングスピナーがぐるぐる回り続けることになります。APIレスポンス自体はHTTP500が返ってきており、docker-compose のログには Pythonの例外が、暗号化内容を復号できない旨のメッセージと共に出力されます。肝心のトレースバック(スタックトレース)は保存し忘れました。

実際のDBの復号化には settings.DATASOURCE_SECRET_KEY が暗号キーとして使われ、settingsを読んでみると

COOKIE_SECRET = os.environ.get("REDASH_COOKIE_SECRET", "c292a0a3aa32397cdb050e233733900f")
SECRET_KEY = os.environ.get('REDASH_SECRET_KEY', COOKIE_SECRET)
DATASOURCE_SECRET_KEY = os.environ.get('REDASH_SECRET_KEY', SECRET_KEY)

このようになっており、DBの暗号キーとクッキーの暗号キーは個別に設定できるようですが、旧Redashの場合はそれぞれ同じ値を使っていると思いますので、新サーバの /opt/redash/env には 旧サーバの /opt/redash/.env から REDASH_COOKIE_SECRET の内容だけコピーしておきます。REDASH_SECRET_KEY ができていたら項目ごと消しておきます。

その他の設定

Google (Gsuite ) を使っている場合は、

REDASH_GOOGLE_APPS_DOMAIN
REDASH_GOOGLE_CLIENT_ID
REDASH_GOOGLE_CLIENT_SECRET

をコピーすることで新サーバでもGoogle 認証が行えるようになります。そのほか、REDASH_MAIL_* など、旧サーバの設定内容はそのままコピーします。

REDASH_GOOGLE_CLIENT_ID="1xxxxxxxx.apps.googleusercontent.com"

このように、ダブルクォーテーションで囲っているとV8ではうまく動作しませんので、envファイル内でダブルクオーテーションは書かないようにします。

テーブル内容のコピー

おそらく、慣れてる方であれば pg_dump を使うのが良いと思うのですが、私は postgres や pg_dump の経験があまり無いため、datagrip を使ってSELECT 結果から INSERT 文を生成し、それをコピペで流し込むことにしました。

旧Redash からの変更点として、データベーススキーマ名が redash から postgres に変更されたこと、また旧版の queries テーブルや dashboards にあった user_email フィールドが無くなっていることなどあり、pg_dump での対応が難しそうだと思ったためです。

データ量として 700クエリー、30ダッシュボード、60ユーザー程度の規模ですので、コピペで十分対応できました。なお、query_results テーブルに過去のSQL結果が入ってますが、2GB程度のストレージを使っており、不要だと思ったため今回は query_results は移行しませんでした。

旧サーバの postgres に接続し、以下のテーブル内容をコピーしていきます。

organizations
users
data_sources
groups
data_source_groups
queries
visualizations
dashboards
widgets

外部キー制約があるため、流し込む順番が違うと失敗しますが、上記の順番で INSERT できると思います。

queries , dashboards には user_email という不要フィールドがあり、queries にはさらに query_results への参照があるのですが、それらは不要なため下記のようなSELECT 文で datagrip 上で検索し、INSERT 文としてコピーして 新DBに INSERT します。

SELECT id, updated_at, created_at, org_id, data_source_id, name, description, query, query_hash, api_key, user_id, last_modified_by_id, is_archived, options, version, is_draft, schedule_failures, search_vector, tags, schedule
FROM public.queries
ORDER BY id;
SELECT id, updated_at, created_at, org_id, slug, name, user_id, layout, dashboard_filters_enabled, is_archived, version, is_draft, tags
FROM public.dashboards
ORDER BY id;

ついでに、MySQL データソースは RDS用のものが新たに出来ていたため、 data_sources の type フィールドは mysql から rds_mysql 変更しました。

シーケンスの更新

INSERT しただけではオートインクリメントPKに使われるシーケンス番号が1から始まり、新しいクエリを保存する時エラーになってしまうので、シーケンスも更新しておきます。

SELECT * FROM users_id_seq;
SELECT MAX(id) + 1 FROM users;
ALTER SEQUENCE users_id_seq RESTART WITH 61;

SELECT * FROM groups_id_seq;
SELECT MAX(id) + 1 FROM groups;
ALTER SEQUENCE groups_id_seq RESTART WITH 6;

SELECT * FROM data_sources_id_seq;
SELECT MAX(id) + 1 FROM data_sources;
ALTER SEQUENCE data_sources_id_seq RESTART WITH 24;

SELECT * FROM data_source_groups_id_seq;
SELECT MAX(id) + 1 FROM data_source_groups;
ALTER SEQUENCE data_source_groups_id_seq RESTART WITH 22;

SELECT * FROM dashboards_id_seq;
SELECT MAX(id) + 1 FROM dashboards;
ALTER SEQUENCE dashboards_id_seq RESTART WITH 37;

SELECT * FROM queries_id_seq;
SELECT MAX(id) + 1 FROM queries;
ALTER SEQUENCE queries_id_seq RESTART WITH 699;

SELECT * FROM visualizations_id_seq;
SELECT MAX(id) + 1 FROM visualizations;
ALTER SEQUENCE visualizations_id_seq RESTART WITH 1230;

SELECT * FROM widgets_id_seq;
SELECT MAX(id) + 1 FROM widgets;
ALTER SEQUENCE widgets_id_seq RESTART WITH 695;

このように、MAX(id) の結果をコピペしてALTER SEQUENCE していきました。1行で書けそうなのですが、経験が無く書き方がわからなかったため、愚直に書いてます。

これで、新サーバで旧サーバの状態が再現されていると思います。

nginx に SSL証明書を組み込む

自己認証局のSSL証明書がありますので、使います。

参考: dockerでredashのnginxをssl化したら思いの外ハマった

mkdir -p /home/ubuntu/nginx/certs

certs に、証明書 ( my-awesome.crt, my-awesome.key )を入れる 

/home/ubuntu/nginx/default.conf を作成

upstream redash {
server redash:5000;
}

server {
listen 80 default;
return 301 https://$host$request_uri;
}

server {
listen 443;
ssl on;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1.2;
ssl_ciphers "ECDHE+RSAGCM:ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:!EXPORT:!DES:!3DES:!MD5:!DSS";

gzip on;
gzip_types *;
gzip_proxied any;

ssl_certificate /etc/nginx/certs/my-awesome.crt;
ssl_certificate_key /etc/nginx/certs/my-awesome.key;

error_log /var/log/nginx/nginx_error.log;
access_log /var/log/nginx/nginx_access.log;

location / {
proxy_ssl_server_name on;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
proxy_pass http://redash;
}
}

/opt/redash/docker-compose.yml を修正

 nginx:
image: redash/nginx:latest
ports:
- "80:80"
- "443:443"
depends_on:
- server
links:
- server:redash
restart: always
volumes:
- /home/ubuntu/nginx/default.conf:/etc/nginx/conf.d/default.conf
- /home/ubuntu/nginx/certs:/etc/nginx/certs

最後に

繰り返しとなりますが、データソース選択ビューで、INSERTしたはずのデータソースが表示されず、ぐるぐるとローディングスピナーが回り続ける場合、旧サーバと settings.DATASOURCE_SECRET_KEY が一致していません。/opt/redash/env の REDASH_COOKIE_SECRET を旧サーバと同じにして、REDASH_SECRET_KEY 設定を消すとデータソースが見れるようになると思います。

Re:dash ダッシュボードツールを使って、運営しているあらゆるサービスの数値を1ページで見る

Re:dash とは

リダッシュ。公式サイトはこちらになります。

http://redash.io/


公式サイトには動作可能デモもあるので、試しに触っていただくとわかりやすいと思うのですが、簡潔に言うと

  • Webアプリ上で SQL などクエリー文を登録
  • 結果を表やグラフで、そのまま表示
  • その表やグラフのけっかをまとめて1つのページに組み合わせることができる

というツールです。「ダッシュボード」を作るWebアプリですね。


TORICO では、2016年に Redash を使い始めましたが、使い勝手が良いので継続して使っていきたいです。

オープンソースです。

https://github.com/getredash/redash/

クエリーは定期的に実行してくれます。設定も、「10分ごと」「12時間に1回」「1週間に1回」のようなざっくりした指定ができるのがとても便利です。時刻指定で毎日実行させることもできます。

クエリーはページを表示する毎に実行されるわけではないので、少し重いクエリーでも気兼ねなく実行できます。今までは自前でダッシュボード作って、クエリーをいちいちキャッシュするようなコードを書いてましたが、Redash ではプルダウンから選ぶだけなので簡単で良いです。

グラフ(ビジュアライゼーション) いくつか


棒グラフ、線グラフの他にも、使い勝手の良いビジュアライゼーションがいくつか入っています。

ピボットテーブル


二次元でのクエリ結果… 例えば、日付 ✕ アイテム ✕ 販売数  ですとか、四半期間 ✕ サービス ✕ 売上 のようなクエリ結果を、整形せずともきれいな二次元表として表示できます。

カウンター



ただ数字を表示します。ダッシュボードの上部に、達成率などを表示すると使い勝手が良さそうですね。

コホート表

お客様継続率の表示に使うやつですね。

https://demo.redash.io/queries/67

※デモを見ていただくとわかるのですが、コホートの分析結果 までを自前で作る必要があります。
Redash がやってくれるのは、分析結果から表を生成する所だけです。

ユーザーID と デイリーアクセスのログ だけでは、この表は作れずに、一度分析した結果を DB に格納するとか、それなりの解析ができるクエリーを自分で作らないといけないです。

その他、株価チャートなどに使う箱ひげ図、地図上プロット、パイチャート、XY相関表のようなものを表示できます。

インストール方法

参考: http://docs.redash.io/en/latest/setup.html

AWS、Google Compute Engine でイメージが公開されていますので、これを使うのが一番手っ取り早いでしょう。

上記参考サイトの特定リージョン ( 日本なら ap-northeast-1 ) の、AMI のリンクをクリックして、ボタンをクリックしていけばすぐに出来ます。

Ubuntu 用のプロビジョニングスクリプトが用意されているようなので、Ubuntu であれば自分でインストールも出来なくはなさそうです。

SSL 設定


イメージから立ち上げた場合、nginx が HTTP サーバとなります。
SSL証明書をサーバにコピーし、/etc/nginx/sites-available/redash を修正してその SSL 証明書を使うようにすれば、redash は問題なく HTTPS で動きます。

ドキュメントはこちらです http://docs.redash.io/en/latest/misc/ssl.html

離れたネットワークの DB に接続する

インフラが AWS で完結している場合は、セキュリティグループなんかで権限管理すれば RDS など DB への接続は問題無いと思いますが、AWS の外にあるサーバなどにも繋ぎたい所です。

MySQL over SSL で接続する、などの手も考えられますが、セキュリティ周りの調整がシビアになりそうです。

平文通信を SSHトンネルの中を通すのが簡単でしょう。

常時 SSH トンネルをキープするツールとして、autossh というものがあり便利です。

インストール

$ sudo apt-get install autossh

このように起動します。

$ autossh -M 0 -f -N -L 127.0.0.1:13306:127.0.0.1:3306 user@example.com


-M 0 … 接続確認ポートを使わない
-f … デーモンモード
-N … SSH接続設定

参考: autossh - MQTT and …

この設定の場合、

1. まず、SSH で user ユーザーで example.com ホストへ接続する
2. example.com ホストから見た、127.0.0.1:3306 ポートを、
3. authossh 起動ホストの、127.0.0.1:13306 にバインドする

となります。

この autossh が起動している状態で、redash サーバ上で

$ mysql --host=127.0.0.1 --port=13306 --user=hoge --password


とすれば、接続先の example.com の中で起動している MySQL サーバに、SSH 越しに接続できるというわけです。

※ redash イメージは MySQL クライアントコマンドは入ってないので、実際には上のコマンドは事前に
$ sudo apt-get install mysql-client-core なんかでインストールしておく必要があります。

SSH 秘密鍵の作成

SSH で redashサーバからリモートサーバに接続する際は、SSH キーペアの作成が必要です。
定番ですが一応書いておきます。

redashサーバ上で

$ ssh-keygen -C redash-server@example.com

.ssh/id_rsa , .ssh/id_rsa.pub
が出来ます。

-C 以下は公開鍵に書き込まれるコメント


id_rsa を上書きしたくない場合は -f でパスを指定

$ ssh-keygen -f ~/secret -C redash-server@example.com


id_rsa.pub の内容を、接続先サーバの ~/.ssh/authorized_keys に追記 (ファイルが無ければ作成)

これで、redash から接続先サーバに SSH で接続できるようになります。

アップデート方法


Redash は頻繁にアップデートされていますので、追従してサーバをアップデートするとバグが直ってたり新しい機能が使えたりするので幸せです。

ドキュメント http://docs.redash.io/en/latest/upgrade.html

アップデートの前に、EC2インスタンスのイメージをバックアップのために作っておくと良いでしょう。

アップデートは、mac など手元のPC から fabric を使って行います。fabric は、Python のデプロイツールです。capistrano みたいなやつです。TORICOでも多くのケースで使っています。

$ pip install fabric requests


で fabric をインストールし、

https://gist.github.com/arikfr/440d1403b4aeb76ebaf8

ここから fabfile.py をダウンロードします。

fabfile.py があるディレクトリ (もしくはそれ以下のディレクトリ) で、

fab -H{your re:dash host} -u{the ssh user for this host} -i{path to key file for passwordless login} deploy_latest_release


このように、deploy_latest_release を実行すると簡単にアップデートできます。

この fabfile には deploy_latest_release 以外にもいくつかのタスクが登録されています。

タスク一覧を表示するには

$ fab -l

Redash を使ってみての感想


非常に良いです。TORICO では、複数のサービスを様々な環境下でリリースしていますが、それらの数値をまとめて1つのページに簡単に出来るのは便利です。IAM が作られているので環境構築が簡単だというのも良いですね。

会社、もしくは部署で1つ作っておいて、autossh で各サーバにつなぎ、数値は全部そこで見る。みたいな運用が理想的だと思います。

Search