「けしからんことを放置してはいけない」と僕の心の登大遊氏に叫ばれた。
けしからんこと
バージョンアップ放置しすぎ
2020年6月にv9-betaが出ているのに、未だにv4で運用している。 よくない。
v4リリースは2018年。時代はもう2021年、けしからんですね。
Redashが起動しているネットワーク構成
なぜかPublic subnetに配置されてしまっているRedashを、 他のインスタンス同様にPrivate Subnet*1相当の場所に配置する。
レガシーセットアップ
Supervisorで起動していたRedashをDockerによる起動に変える。
Starting from the Redash V8 release we’re no longer building the tarball version of a release – only Docker images.
作業内容
作業自体はネットに転がっている記事がたくさんあり、そちらを見ればほとんど同じことが書いてある。
Supervisor型の旧Redash(v4)をDocker型の新バージョン(v8)へアップグレードする | DevelopersIO 一部手順内にミスがあるので注意(DBのリストアのところ)
秘伝のredash v1.0.3 から redash v8.0.0 on ECSになるまで - KAYAC engineers' blog
ので、この記事では作業ポイントだけ残しておく(何気に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つずつ上げていく。
# 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さんのブログ引用です。いつもお世話になっています。
- 最新バージョン Redash v5 をすぐに試せる「Redash ハンズオン資料」 - kakakakakku blog
- 最新バージョン Redash v6.0.0 をすぐに試せる「Redash ハンズオン資料」 - kakakakakku blog
- SQL 選択実行など便利な新機能が追加された「Redash v7.0.0」紹介 - kakakakakku blog
- Redash v8 を試そう!「Redash ハンズオン資料」v8 をリリースした - kakakakakku blog
- 2020年6月にリリースされた「Redash v9.0.0-beta」の新機能と機能改善を「計10点」紹介 - kakakakakku blog
※全部ではないです
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にバージョンアップしたあと、やっぱり誰バージョンアップはやってなくて「ああそろそろなんとかしないと……」と思っていたところに
けしからんことを放置してはいけない
と、この言葉が背中を押した。
今や代名詞になっていて笑う。
Google で「けしからん」を検索すると、「けしからん NTT 東日本」がトップで表示されるのですが、私の環境だけでしょうか? pic.twitter.com/6supsnXmDj
— Daiyuu Nobori (登 大遊) (@dnobori) 2021年2月21日
今回は完全にスタンドプレーでバージョンアップしたので、結構楽しかった。
登大遊氏にあやかって行動できたので、本ブログタイトルも全力で乗っからせてもらいました。
ありがとうございます。
けしからんNTT東日本をやっつけようと思った 登大遊氏が注目する世界最大級のICT人材を育成できる環境 - ログミーTech
けしからんファイアウォールに負荷掛けたら警察から手紙きた 登大遊氏が光ファイバーの先に興味をもった理由 - ログミーTech
「けしからんことをやっていいとなった瞬間が一番おもしろい」...天才プログラマー登大遊氏の仕事観に学ぶ/『情熱大陸』 - トレンドニュース
彼のブログ、これも面白いので一読してほしい。