VTRyo Blog

一歩ずつ前に進むブログ

"けしからん"Redash v4をv9-betaにバージョンアップした

「けしからんことを放置してはいけない」と僕の心の登大遊氏に叫ばれた。

logmi.jp

けしからんこと

バージョンアップ放置しすぎ

2020年6月にv9-betaが出ているのに、未だにv4で運用している。 よくない。

v4リリースは2018年。時代はもう2021年、けしからんですね。

github.com

Redashが起動しているネットワーク構成

なぜかPublic subnetに配置されてしまっているRedashを、 他のインスタンス同様にPrivate Subnet*1相当の場所に配置する。

f:id:vtryo:20210221225754p:plain
せめてこのような構成にする

レガシーセットアップ

Supervisorで起動していたRedashをDockerによる起動に変える。

Starting from the Redash V8 release we’re no longer building the tarball version of a release – only Docker images.

redash.io

作業内容

作業自体はネットに転がっている記事がたくさんあり、そちらを見ればほとんど同じことが書いてある。

ので、この記事では作業ポイントだけ残しておく(何気に2日くらいハマってたりしたので…)。

おおざっぱな作業概要

Docker化するのだし、ECSに乗せたい!という欲は一旦我慢してDocker化することを優先する。

  • 現行v4環境のPostgreSQLからデータエクスポート
  • 現行v4環境のREDASH_COOKIE_SECRETの値をメモしておく
  • 新しいEC2を起動する(Ubuntu18.04)
  • PostgreSQLクライアントをインストールする
  • setup/setup.shを使う
  • PostgreSQL以外のコンテナを停止
  • PostgreSQLコンテナでエクスポートデータのインポート先をCREATEする
  • PostgreSQLコンテナでデータインポート
  • データベース名などを更新
  • envを更新する
  • docker-compose up
  • 起動確認後、Dockerイメージを新しいバージョンに書き換える
  • マイグレーションする
  • バージョンアップされる!!

というのを検証環境で確認後、実際に運用するAWSアカウントへAMIを共有してRedashを起動することにした。

  • バージョンアップを確認できたAMIを作成し、運用アカウントに共有する
  • Cloudformation(もしくは他のIaC)で構成を書く
  • 起動
  • もろもろ準備できたらRoute53でレコード変更

作業備忘録

現行v4環境のPostgreSQLからデータエクスポート

現行v4環境にて。 redashテーブルをDumpする。 オプションの-Fcを使わないと、インポート時に did not find magic string in file headerが出た。

sudo -u redash pg_dump -Fc redash > old_redash.dump

新しいEC2での作業

  • PostgreSQLクライアントをインストールする
sudo apt install postgresql-client zip -y
  • setup/setup.shを使う
$ git clone https://github.com/getredash/setup.git
$ sudo chmod +x setup/setup.sh

setup.shを書き換える。LATEST_VERSIONを現行のバージョンに合わせる

# vim setup/setup.sh

# L59
LATEST_VERSION="4.0.1.b4038"
# L62
sed -i -e "44i \ \ \ \ ports:\n - \"5432:5432\"" docker-compose.yml

実行

./setup/setup.sh
  • PostgreSQL以外のコンテナを停止
$ cd /opt/redash
$ sudo docker-compose stop server scheduler scheduled_worker adhoc_worker nginx redis
  • PostgreSQLコンテナでエクスポートデータのインポート先をCREATEする
=# CREATE USER redash;
=# CREATE DATABASE redash OWNER redash;
  • PostgreSQLコンテナでデータインポート

さっきつくった空のredashデータベースにインポートする。

SupervisorのRedashはデータベース名がredashなので、まずはこの名前でインポートしておき、インポート後にpostgresに名前を変更する。
※もしかしたらいきなりpostgresデータベースにインポートしてもよいかもしれないが念の為

pg_restore -h localhost -U postgres -d redash -cC -Fc old_redash.dump

このようなエラーが出てくるが、ROLEがいなくて実行できなかったパターンのエラーであれば影響はない(実際なかった)。 *2

pg_restore: [archiver (db)] could not execute query: ERROR:

あとはselectしてデータが入っていることを確認しておけば安心だろう。

  • データベース名など変更 DockerのRedashはデータベース名がpostgresなのでリネームしていく
=# ALTER DATABASE redash OWNER TO postgres;
=# DROP DATABASE postgres;
=# ALTER DATABASE redash RENAME TO postgres;
  • envを更新
# vim /opt/redash/env

# メモしていた現行のREDASH_COOKIE_SECRETを記述
REDASH_COOKIE_SECRET=<REDASH_COOKIE_SECRET>
REDASH_SECRET_KEY =<REDASH_COOKIE_SECRET>
  • docker-compose up

http://docker_ip:5000でアクセスできればOK。AWSの検証環境では適当にパブリックIPを付けてアクセスして、現行と同じ状態で起動していることを確認する。

  • 起動確認後、Dockerイメージを新しいバージョンに書き換える

ここまでくればもうかんたんな作業。Dockerイメージをメジャーバージョン1つずつ上げていく。

hub.docker.com

# vim /opt/redash/docker-compose.yml

image: redash/redash:5.0.0.b4754 #一個ずつバージョンをあげていく
  • マイグレーションする
$ docker-compose stop server scheduler scheduled_worker adhoc_worker
$ docker-compose run --rm server manage db upgrade
$ docker-compose up
  • バージョンアップされる!!

v8の安定版まで上げて、問題なかったので検証環境での作業はこれで終えた。

v9-betaには、実際に運用するAWSアカウントで起動を確認してから実施する。

運用するAWSアカウントでの作業

検証環境でバージョンアップしきったインスタンスのAMIを作成しておき、共有する。

特定の AWS アカウントとの AMI の共有 - Amazon Elastic Compute Cloud

その後、僕はCloudformationにALB, EC2周りの記述をしてスタックを作成した。 もちろんPrivate Subnetに配置。

VPCなどやSGは既存のものを!Refで紐付ける。

Cloudformationは相変わらずデバッグしにくかった。 エラー内容を読んでも全然わからないし、スタック新規作成に失敗するとParametersが1から設定し直しになってしまって非常に時間を取られた。 残念ながらTerraformはDatadog監視設定でしか運用していないので諦める。

ALBのアドレスで起動を確認したあと、v9-betaにRedashを更新した。

そしてここまでくれば、あとはRoute53で設定をするだけなのでかんたんだ。

無事にv4で動いていたURLで最新版をリリースできた。

v5からv9までの主な新機能

ほとんどkakakakakkuさんのブログ引用です。いつもお世話になっています。

※全部ではないです

  • v5

    • クエリに「お気に入り登録」と「タグ登録」をできるようになった
    • ダッシュボードに「お気に入り登録」と「タグ登録」をできるようになった
    • ユーザーを無効化できるようになった
    • パラメータで日付の範囲指定ができるようになった
    • クエリ編集画面でレイアウトを変更するショートカットが使えるようになった
      • Alt + D : テーブル一覧とクエリエディタを非表示にする
      • Alt + Shift + D : テーブル一覧を非表示にする
  • v6

    • チャート種類に「ヒートマップ」が追加された
  • v7

    • SQL 選択実行(サブクエリだけ実行するとか)
    • 「Refresh Schedule」に「終了日 (Ends)」を設定できる
    • ユーザの最終アクセス日時 (Last Active At)が追加
    • ユーザ招待中の場合「招待中」と表示される
  • v8

    • ドロップダウンで複数値を選択できるようになった(パラメータ付きクエリ)
    • クエリ名を日本語で正しく検索できるようになった
    • ダッシュボードがグリッド表示になった
    • カスタムアラート機能
  • v9

    • データソースが追加された
    • クエリ画面がリニューアルされた
    • Date Range パラメータで直近n日を指定できるようになった
    • グラフ上で使える Plotly Mode Bar を非表示にできるようになった
    • クエリ結果を TSV 形式でダウンロードできるようになった
    • アラート画面がリニューアルされた
    • アラートのカスタムテンプレート機能が正式にリリースされた
    • アラートをミュートできるようになった
    • Celery を廃止して RQ に移行
    • Python 3 を正式にサポート

おわり

入社したときRedashはv1で立っていて(2018年)、誰もバージョンアップしていなかった。

自分でv4にバージョンアップしたあと、やっぱり誰バージョンアップはやってなくて「ああそろそろなんとかしないと……」と思っていたところに

けしからんことを放置してはいけない

と、この言葉が背中を押した。

今や代名詞になっていて笑う。

f:id:vtryo:20210221234812p:plain
さすがの認知度である


今回は完全にスタンドプレーでバージョンアップしたので、結構楽しかった。

登大遊氏にあやかって行動できたので、本ブログタイトルも全力で乗っからせてもらいました。
ありがとうございます。

彼のブログ、これも面白いので一読してほしい。

softether.hatenadiary.org

*1:実際はPublic, Protect, Privateといった具合にサブネットを分けています

*2:追記: 独自にRedashに設定していたUserが実は存在していて、そのユーザのROLEがないぞって怒ってただけだった