ECS Fargate環境のredashをv8からv10にした話

# はじめに
当社ではBIツールredashを活用しておりますが、そのバージョンは長らくv8のままでした。v9betaが出ていたのは認知していたのですが、一向に正式版にならないままであった為、なかなかアップデートに踏み切れずにいました。そのような中で2021年10月頭になんとv10が登場しました。意気揚々と[release notes](https://github.com/getredash/redash/releases)を読みアップデートを行うも、<font color="Red">**発行したクエリが返ってこない**</font>という症状が発生、原因不明・解決不能のまま泣く泣く切り戻しを行いました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570763/0de6383a-11f8-43bd-10af-893180fd3900.png)
*クエリが返ってこず、Queuedだけがどんどん増えていく。


その後調査を続ける中で[**Redash SaaSサービスから自前ホストへの移行した話**](https://tech.mirrativ.stream/entry/2021/11/05/113250)（株式会社ミラティブ様のブログ）に行き着き、内容を参照させて頂くことで問題が解決しました。ありがとうございます。今回はこちらのブログを参照しつつ、redash on ECS Fargate環境にてv8からv10へのアップデートを行った際の設定を紹介します。

*v10からECS Fargate環境を新規作成する場合もDBマイグレーションのコマンドを変更するだけで完成するのでそちらも併せてご確認下さい。

## バージョンアップ手順
 - 1. ECSタスク定義の変更
 - 2. DBマイグレーション


# 0. 環境

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570763/d52978fe-bc5c-bb82-f545-da0da189cb18.png)

上図は当社のredash v10環境を簡単に表した図です。redashはFargateでホスティングし、redash_service内では5つのコンテナが稼働しています。その他メタデータを管理するPostgreSQLはRDS、キューイングを管理するRedisはElastiCacheといったマネージドサービスに乗せています。図では割愛しておりますが、ALBのターゲットグループにコンテナを指定して利用しています。

# 1. ECSタスク定義の変更

## 1.1 コンテナ一覧
[**Redash SaaSサービスから自前ホストへの移行した話**](https://tech.mirrativ.stream/entry/2021/11/05/113250)（株式会社ミラティブ様のブログ）にて、docker-compose.ymlの中身を参考にしつつ以下を作成しました。

 - server
 - scheduler
 - scheduled_worker
 - adhoc_worker
 - worker
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570763/363fa8d5-b577-3b1c-cb40-81b9f84d7eaf.png)

当社環境においては、postgresはRDS、redisはElastiCahceに置き換えているため割愛。nginxについては不要な為割愛。

## 1.2 タスク定義詳細
コンテナ毎の詳細なタスク定義を紹介します。一部Pythonを利用するための環境変数が含まれていますが、それ以外は一般的なものですので適宜読み替えて下さい。

### 1.2.1 server
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570763/9d8488ee-38db-d351-3502-e595e9f2d475.png)

### 1.2.2 scheduler
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570763/2a64acbf-4263-bc07-fad0-88bf011524c0.png)

 - server、schedulerは共に一般的な内容です。
 - **REDASH_DATABASE_URL**はメタデータ用のPostgreSQLのホスト名を記入下さい。
    - 書式は`postgresql://[user]:[password]@[hostname]:[ポート番号]/[database名]`です。
        - 例:`postgresql://testuser:testpswd@xxx.ap-northeast-1.rds.amazonaws.com:5432/redash`
        - [database名]のデフォルトはredashです。
 - **REDASH_REDIS_URL**も同様にRedisのホスト名です。
    - 書式は`redis://[hostname]:[ポート番号]/0`です。
        - 例:`redis://xxx.apne1.cache.amazonaws.com:6379/0`
        


### 1.2.3 scheduled_worker
**QUEUES**の値が`scheduled_queries,schemas`なのが特徴です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570763/315b0a47-f4c3-0716-a3cd-e3841cffd3d5.png)

### 1.2.4 adhoc_worker
**QUEUES**の値は`queries`です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570763/52c1d422-b04b-3b6d-3f63-517f75eba274.png)

### 1.2.5 worker
**QUEUES**の値は`periodic emails default`です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570763/d5625507-2db6-8189-91b9-5cd3210ef20e.png)


#### 補足
schedulerコンテナ、scheduled_workerコンテナ、workerコンテナのコマンドはworkerで統一されており、QUEUESの値で分けています。例えばこれを以下のように一つのコンテナにしても稼働します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570763/27ea819f-aa7a-f76d-219f-b5f3314464f0.png)
**QUEUES**の値は`scheduled_queries,schemas,queries,periodic emails default`です。
*periodic emails defaultの間のみ半角スペース区切り

タスク定義が完成したらECSにて当該クラスターに適用すれば完了です。

# 2. DBマイグレーション
既にデータ(クエリやダッシュボード)が存在し、それらごとアップデートしたい場合はDBマイグレーションを行う必要があります。
v10環境を新規作成する場合は補足をご確認下さい。

# 2.1 マイグレーション用タスク定義
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570763/b25af1f1-cdf7-4841-a591-d2aa78bf303a.png)

コンテナ設定は基本的には1.2.xのものと同様ですが、コマンドは`manage,db,upgrade`です。以下のように、タスク定義のコンテナ編集画面から`環境`内のコマンド欄に記入します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570763/4835d306-6093-aa35-1512-7ea04ae9fbbd.png)

## 補足

環境を新規作成する場合は、PostgreSQLとRedisの接続情報を記入したうえで、コマンド欄を`create_db`とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570763/6f0dda47-0a84-ba4c-5109-9bf7edf4b83a.png)

# 2.2 タスクの実行
用意したタスクをECSから実行する。

## 2.2.1 新しいタスクの実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570763/f922cc42-1fbf-26c3-00ae-1e5d523c1080.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570763/03d53685-d40b-dc1f-6a8d-9566d41d045d.png)

適切な設定を行い実行する。

成功すると次のようなログが流れる。
*CloudWatchにログを出している場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570763/0105959c-a694-ef61-50f8-248052dd58af.png)

問題なく設定できた場合、redashを稼働させているタスクの`パブリックIP:5000`でアクセスすることができます。当然パブリックIPを発行せず、ALB等を経由してアクセスするのでも問題ありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570763/2f9fc289-c440-3b25-cad5-aca83e938423.png)

# まとめ
redash on ECS Fargate環境にてv8からv10にアップデートする方法についてまとめました。一度は挫折したものの、[**Mirrativ Tech Blog**](https://tech.mirrativ.stream)に行き着いたことでヒントを得、無事解決することができました。深く感謝申し上げます。

redash v10についてはUI変更、CSV/Excelが利用可能になるなど大幅な更新がありました。
可視化の方法も増えたようですし、活用の幅が広がれば良いなと思います。

# 参考
[Redash SaaSサービスから自前ホストへの移行した話](https://tech.mirrativ.stream/entry/2021/11/05/113250) (ミラティブ様の記事)
[getredash / redash](https://github.com/getredash/redash/releases/tag/v10.0.0)