最近カービィシリーズの動きが活発で嬉しい 会員システムグループでエンジニアしている石川です。
弊社にはDWHのBIツールとして5年ほど前から使っているRedashがあります。
公式のAMIから作ったEC2単体構成で立ち上げてから、v1からv7までアップグレードしたりスケールアップで負荷に対応してきました。
v8からDocker必須となり移行が手間でアップグレードを見送っていたのですが、利用者も増えてきたのでちゃんとしようと思い 今回ECS Fargate構成にしてv10までのアップグレードを行いました。
構成図
可用性はそこまで高くする必要はないので、拡張性は担保しつつもシングルAZ構成。
安く組みたいのでAuroraではなくRDSを利用しています。
Fargate化とアップグレード手順
Redashの移行に関してDBデータ移すだけでいいため、まずFargate化から行いました。
- Fargate構成のRedash v7を作成
- 既存RedashのPostgreSQLのダンプファイルをRDSにリストア、v7動作確認
- v8へアップグレード、v8動作確認
- v10へアップグレード、v10動作確認
- OneLoginとのSAML設定
アップグレード時の操作
インフラ構築はCDK使って作成しています。
アップグレードは立ち上げるタスクを切り替えてデプロイすることで実現しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
# services = ['server', 'create_db'] # v7 新規状態での初回起動 # services = ['server', 'worker'] # v7 通常起動 # services = ['server', 'upgrade'] # v7 リストア後 # services = ['server', 'upgrade'] # v8 アップグレード # services = ['server', 'worker'] # v8 通常起動 # services = ['server', 'upgrade'] # v10 アップグレード services = ['server', 'scheduler', 'scheduled_worker', 'adhoc_worker', 'worker'] # v10 通常起動 service_context = { 'server': { 'cpu': 1024, 'memory': 2048, 'command': ['server'], 'desired_count': 1 }, 'create_db': { 'cpu': 512, 'memory': 1024, 'command': ['create_db'], 'desired_count': 0 }, 'upgrade': { 'cpu': 512, 'memory': 1024, 'command': ['manage', 'db', 'upgrade'], 'desired_count': 1 }, 'scheduler': { 'cpu': 512, 'memory': 1024, 'command': ['scheduler'], 'queues': 'celery', 'desired_count': 1, 'worker_count': '1' }, ... for service_name in services: ... container = task_definition.add_container(service_name, image=image, command=service_context[service_name]['command'], entry_point=['/app/bin/docker-entrypoint'], environment={ 'PYTHONUNBUFFERED': '0', 'REDASH_LOG_LEVEL': 'INFO' if service_name == 'server' else 'WARNING', 'REDASH_REDIS_URL': redis_url, 'REDASH_DATABASE_URL': rds_url, 'REDASH_HOST': redash_host, 'REDASH_COOKIE_SECRET': 'xxxxx', 'REDASH_SECRET_KEY': 'xxxxx', 'REDASH_ALLOW_SCRIPTS_IN_USER_INPUT': 'true', 'REDASH_DATE_FORMAT': 'YYYY/MM/DD', 'REDASH_FEATURE_SHOW_PERMISSIONS_CONTROL': 'true', 'REDASH_DISABLE_PUBLIC_URLS': 'true', 'QUEUES': service_context[service_name]['queues'] if 'queues' in service_context[service_name] else '', 'WORKERS_COUNT': service_context[service_name]['worker_count'] if 'worker_count' in service_context[service_name] else '' }, memory_limit_mib=service_context[service_name]['memory'], logging=ecs.LogDriver.aws_logs( stream_prefix='ecs', log_group=log_group ) ) |
アップグレード時の注意点
主に公式ドキュメントとGitHubリポジトリのRelease文面の通りにやっていれば問題ないのですが、ひっかかった部分だけ記載しておきます。
データソースの画面が空になった
REDASH_COOKIE_SECRET と REDASH_SECRET_KEY はDBとクッキーの暗号化キーとして使われているので、既存Redashで使われていた値を指定する必要があります。
これが空だったり違う値だと複合に失敗するためデータソースが取得できず空になります。
CFnでリソースの置き換えが進まない
既存タスクが終わらせられないのかデプロイが進まないことがあります。これは既存タスクを手動で止めた後ちょっと待っていれば進み出します。
根本原因だと思われるRQ Schedulerのバージョンを上げれば対応できそうですが、これだけのためにイメージ作り直すのも手間なので今回は手動対応しました。
参考:RedashでScheduler更新時に発生するエラー「There’s already an active RQ scheduler」について原因を調べて解消してみた | DevelopersIO
OneLoginとのSAML設定
v7を使っていた時は設定のためにRedashのソースを書き換えて対応していたのですが、v8やv10では書き換えなしで利用できるようになっていました。
ただマニュアル通りに書いてもうまくいかなかったのでv10でうまくいった設定を書いておきます(v8でも動くと思います)
OneLogin Appには SAML Custom Connector (Advanced) を利用。
Configurationは以下のように設定。
Parametersには FirstName と LastName のマッピングを追加。
1 2 3 4 5 6 |
Audience (EntityID): https://${your_domain}/saml/callback?org_slug=default Recipient: 同上 ACS (Consumer) URL Validator: 同上 ACS (Consumer) URL: 同上 SAML signature element: Assertion |
Redash側にも以下のように設定。
SAML Entity IDにはインスタンスのURLを指定しろとRedashのドキュメントには書いてありますが、それだと動きませんでした。
1 2 3 4 |
SAML Enabled: Enabled (Dynamic) SAML Metadata URL: OneLogin AppのSAML MetadataのURL SAML Entity ID: 同上 SAML NameID Format: SAML MetadataのXMLに書いてあるNameIDFormat |
Fargate構成でRedash v10を使ってみた印象
フロントが100%Reactになった影響か、レスポンスが格段に速くなっていて気持ちいいです。
Fargate化して良かったのはインスタンスを意識しなくていいのはもちろん、アップグレードの楽な点がいいですね。
はじめは腰の重い作業でしたが先人の知恵がすでに多くあり、それほど引っ掛かることなくアップグレードできました。
OneLoginとのSAML設定だけはソースコードを書き換える方法しか見つからなくて、今回の設定値を見つけるのだけは時間がかかりました。。
もし同じような構成で悩んでいる方がいましたら本記事が参考になると幸いです。