自前でRedashを構築してSaaSからデータ移行をする
こんにちは、ばんがです。
Redash SaaSのサービス終了に伴って、業務でRedashの自前での構築・SaaSからのデータ移行を実施したのでざっくりまとめようと思います。
Hosted Redashの終了について。
https://redash.io/help/faq/eol
Self-Hosted Redashの構築
RedashはOSSでコードが公開されているので自前で構築することができます。
公式から全部入りのAMIが提供されていますので今回はこちらを利用。
Redash自体はもちろん、DB(postgresql, redis)、nginxなどが入っておりこのAMIを使ってEC2を立ち上げればRedash環境が出来上がります。
https://redash.io/help/open-source/setup
とはいえVPCなどネットワーク周りやSSL化するためにロードバランサーなどを作る必要があるので、Terraformを使って必要なリソースを構築しました。
まずは、公式が提供するAMI(ap-northeast-1)を使ってEC2インスタンスを定義。
インスタンスタイプは、最低限smallが必要らしいのでt3.small
にしました。
resource "aws_instance" "redash" {
ami = "ami-060741a96307668be"
instance_type = "t3.small"
subnet_id = aws_subnet.redash_public_a.id
ebs_optimized = true
vpc_security_group_ids = [
aws_security_group.redash.id
]
monitoring = false
key_name = "redash"
root_block_device {
delete_on_termination = false
volume_size = 8
}
tags = {
Name = "redash"
}
depends_on = [
aws_subnet.redash_public_a,
aws_security_group.redash
]
}
割愛しますが、VPCやサブネット、ロードバランサーなども定義しておきます。
IP制限をかけたいので、セキュリティグループも定義しましょう。
EC2用とロードバランサー用それぞれを定義します。
Redashで連携した外部データソースと通信するので、EC2用にもアウトバウンド(egress)許可を入れておく必要がありました。
# EC2用
resource "aws_security_group" "redash" {
name = "redash"
description = "For Redash"
vpc_id = aws_vpc.redash.id
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
security_groups = [aws_security_group.redash-lb.id]
}
lifecycle {
ignore_changes = [ingress, egress]
}
}
# ロードバランサー用
resource "aws_security_group" "redash-lb" {
name = "redash-load-balancer"
description = "sg for redash application load balancer"
vpc_id = aws_vpc.redash.id
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}
Redash関連の全リソースの定義はこちらにあります。参考まで。
https://github.com/bangarrr/terraform-test/tree/master/redash
SaaSからデータを移行する
さて、自前でRedashが構築できたので、SaaS版のRedashからデータを移行します。
公式が提供しているデータ移行ツール(redash-toolbelt)があるのでこちらを利用します。
https://github.com/getredash/redash-toolbelt/tree/master/redash_toolbelt/docs/redash-migrate
まずはインストールします。
当時の最新版(v0.1.8)ではダッシュボードなど複数のデータの移行でエラーが発生したため、v0.1.6を利用しました。
pip install redash-toolbelt==0.1.6
移行作業は、移行元Redashと移行先Redashにアクセスできる環境であればローカル環境で実施できます。
まずは適当な作業ディレクトリで移行設定の初期化をしましょう。
@some workdir
redash-migrate init
コマンドを実行すると、移行元・移行先Redash双方のURLやadminユーザーのアクセスキー、ユーザーIDなどが聞かれるので入力します。(先ほど作成した移行先のRedashで、あらかじめ初期ユーザーを作っておく必要があります)
コマンドが完了するとmeta.json
ファイルが作成されます。
ここに先程の設定が記載されており、またこれから行う移行コマンドを実行していくと、移行したクエリやデータソースなどの情報が追記されていきます。
移行コマンドを実行していく
redash-toolbeltではデータを一括移行できるわけではなく、データソース、クエリ、ダッシュボード...など、それぞれを順番に移行してやる必要があります。
公式にも記載がありますが、redash-migrate --help
コマンドで移行コマンド一覧が表示されます。基本的に上から順番に実行していけばOKです。(逆に変な順番でやるとうまくいかないです)
移行後の作業
残念ながら上記移行コマンドだけでは完全に移行はできないので、移行先のRedashで追加で作業する必要があります。
データソースの認証情報の設定
データソースと連携するためのパスワード/シークレットキーなどの認証情報は移行されないので、新Redashで再度設定する必要があります。
既存ユーザーのパスワード
同じく、既存ユーザーのパスワードも移行されません。最初に作成したAdminユーザー以外の既存ユーザーは招待中の状態になるので、各自でパスワード再設定をしてからログインしてもらうことになります。
グループが重複する
v0.1.6では、デフォルトのユーザーグループ(defaultとadmin)が新旧の分で重複します。
新Redashの方にデフォルトでdefault、adminのグループが存在するのに、グループの移行コマンドによって旧Redashのdefaultとadminが移行されてくるので重複してしまいます。
片方は不要なので、旧のdefault、adminを消しましょう。
ただし、旧グループに入っていたユーザーは新グループの方に追加してください。
クエリのIDがリセットされる
これもv0.1.6の問題かもしれませんが、旧RedashでのクエリのID(DB上のIDだと思われます)は移行されず、新Redashでは新しく1から付与されます。
クエリ中に他クエリのIDを直書きしている場合などはクエリが動かなくなるので、新しいクエリIDで置き換える必要があります。
まとめ
追加の作業を行ってやっとデータ移行が完了しました。
細かいところで色々不具合はありますが、公式の移行ツールが提供されているのはありがたかったです。
現在はv0.1.9も出ているようなので、上記のような細かい問題も改善されているかもしれません。
それではまた。