Re:dash移行をギリギリ滑り込みで間に合わせる

redashのサービスが2021/11いっぱいで終了になるとのこと。
残り１週間で自社用サーバにてredashが使えるようにし、app.redash.ioからデータを移行する必要があった。

なお私には一切インフラ知識はなかったので涙目になりながらググりまくったがひとつの記事で全てを網羅しており、かつ途中でハマらずすんなり一本で完了できるものが見つからなかったので色々な記事を合わせてなんとか気合で移行完了させることができたが、自分用メモを兼ねて残しておくことにする。

なお、自社サーバはGCPのVM上にDockerで立ち上げる形で構築することになった。

## GCPコンソールよりVMインスタンスを作成

下記以外はいじらずに登録。
マシンの構成: デフォルトのままe2-medium（vCPU x 2、メモリ 4 GB）にしておく。一旦これで様子見することにした
ネットワークインターフェース: 外部IPは固定のものを選択しておく、ネットワークとサブネットワークはメインで読み込むSQLインスタンスと同じVPCにしておく。
ファイアウォール: HTTPとHTTPSトラフィックを両方オンにしておく(これをしないとsshもサイト閲覧もできない)
Boot Disk: OSはUbuntuの18.04にしておく

登録後、そのまま作成したVMインスタンスの画面からSSHブラウザウィンドウを開いて作業をしたいのだが、接続できない。
これはネットワークインターフェースにSQLインスタンスと同じVPCを設定したためと思われる。
対応としては別の画面でファイアウォールに特定タグのターゲットに対する SSHの接続を許可するルールを追加し、VMインスタンスの編集画面よりそのタグを追加することで解消。


## DockerでのRedash環境構築

こちらの記事を参考にした。dockerでのredash環境構築のくだりをそのままコマンド実行していった。
https://note.com/nesta13/n/n7fce5e6563f6

ただし、デフォルトのredashのバージョンではなくver10にしないとデータ移行の対象外となるため、下記を参考にdocker-compose.yml(/opt/redashにある方)を書き加えておく。
https://github.com/getredash/redash/releases/tag/v10.0.0

dockerを停止、起動して、パブリックIPをそのままブラウザに入力すると、Re:dash初期画面が表示される。
※ `git clone`したディレクトリの`/redash` 配下にも`docker-compose.yml`があるがこちらは使用しないので、docker-composeコマンドも必ず/opt/redashでおこなうこと。

この辺で、一旦GCPコンソールよりスナップショットを作成しておくとよい。適当な名前をつけて、ソースディスクにさきほど作ったVMを選択すればよいだけ。これで最悪、環境が壊れてもまたスナップショットから復元すれば楽。


## データソース接続確認
・参照DBが本番環境と開発環境とでVPCが分かれており、極力全てプライベート接続にしたかったが、本番環境向けはプライベート IP 、各開発環境向けは Cloud SQL Proxy 経由という方式にした。VM インスタンスに対して複数の NIC をなぜか追加することができなかったため。できたとしても iptables の設定とか厄介かもしれない
・Cloud SQL Proxy のコンテナからは本番環境用の接続設定と、すべての Docker ホスト（VM インスタンス自体）へのポートフォワーディングを削除。外部からアクセスできる必要がないため

## データ移行
こちらを参考におこなった。
https://github.com/getredash/redash-toolbelt/tree/master/redash_toolbelt/docs/redash-migrate

まずは`redash-migrate help`で表示されるコマンドのうち、
data-sources、 check-data-sources、 users, groupsまでを移行する。

####途中、ハマりどころ

- パスが通っていなかった　

`redash-migrate init`する際に`redash-migrate: command not found`エラーが発生したので、パスを通す。おそらく`redash-toolbelt`がホームディレクトリ以下のuserフォルダにインストールされているためにパスが通っていなかった？


~/.local/bin というディレクトリがって、その中に redash-migrate があったので、
~/.bashrc の末尾に

```
export PATH=$HOME/.local/bin:$PATH
```

を加えてパスを通した上で

```
exec $SHELL -l
```
を実行してシェルを読み込み直す。

- DBに接続できない

データソースを移行した後、redashのデータソース一覧画面より移行したデータソース(今回でいうとGCP上のSQLインスタンスのMySQL)の詳細画面より、TestConnectionを実行するも、接続できない。
→ まさかのMySqlパスワードが移行できていると思わせておいてされていなかった模様。パスワードを入力し直して、一度Saveしてから再度詳細画面に入り、TestConnectionで接続することができた。

- usersは移行できたが、querysやdashboardsを移行時にエラーになってしまう。(403エラー)

こちらを見ていると、
https://github.com/getredash/redash-toolbelt/issues/106#issuecomment-957558358
ユーザの属するグループが正しく移行できていないことによるエラーな気がしたので、
下記の手順でpostgresにログインし、強制的に全ユーザーにadminとdefaultグループに属するようにした。UPDATEは1だけだとまだエラーだったので、その後2に変えてもう一度UPDATEすることでエラーがおこらなくなった。

```
sudo docker-compose exec postgres psql -U postgres
```

```
UPDATE
  users
SET
  groups = groups || 1
WHERE
  NOT (1 = ANY(groups));
```
これにより、redash-migrate querysがエラーにならず成功したので、残りの移行するコマンドを全て打ちこんでいく。

この時点でdockerを起動しなおすと、一応ほぼ以前と同じ環境を再現することができた。
ただ、この時点では管理者である自分自身以外がログインできず、メールでの招待もできないため、
`setting/users`の一覧画面より`Pending Invitations`をクリックすると移行したユーザー一覧が表示でき、1人1人詳細画面からログインするためのURLを発行できるので渡してログインしてもらう必要がある。

※ この時点でredashユーザーに引き渡してもよかったが、いくつか作業が残っていたため1名だけログインができるかテストしてもらうだけにし、正式に全面利用切り替えするのは後回しにしてもらった。
(残り作業中にサーバ落としたりする可能性もあり、その間は元のredashを使ったりして、新旧のredashをそれぞれ使われてしまったりすると新redashにだけ存在するクエリなどが出てきたりしてしまいコンフリクトしないか不安だったため。)


## 残り作業
・ドメイン設定
すでに名前コムで取得していたドメインからサブドメイン(redash.xxxx.com)を切って、発行した固定IPを紐付けた。

・https化
こちらを参考におこなった。
https://qiita.com/nullnull/items/2929b82958582267987f#https%E5%8C%96

・メール機能
このままだとパスワードを忘れた際や招待する際のメール機能が使えないため。
こちらを参考におこなった。
https://blog.fire-sign.info/1274/

・Googleログインの有効化
便利なので。
こちらを参考におこなった。
https://medium.com/jdsc-tech-blog/gce%E3%81%A7%E3%81%AEredash%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E6%96%B9%E6%B3%95%E3%82%92%E5%88%86%E3%81%8B%E3%82%8A%E3%82%84%E3%81%99%E3%81%8F%E8%A7%A3%E8%AA%AC%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B-31bb2576e42c