Pocket

[Ubuntu]Redash v8.0.0をDockerで構築してHTTPS化してみた

さて、お久しぶりのRedash系ブログでございます。今まではEC2上にDockerをインストールして、docker-composeでRedashのコンテナらを起動して、構築の手間等省けることができました。しかしながら運用上、重たいクエリなど誤って実行してしまうと、サーバーのCPUやロードアベレージが高くなり、結局は再起動するといった手間がかかります。そこで今回EC2(Docker)からECS/Fargateに移行する際注意することをまとめてみたいと思います。ここらへんの検証は同僚の@kata_dev氏が試してくれたのでthanks!!


ECS/Fargateでの構成

  • Redash Server
    いつも見てるWebUI ターゲットグループのportは5000
  • Redash Scheduler
    JobをRedisにキューイング
  • Redash Scheduled Worker
    スケジューリングされたクエリを処理
  • Redash Adhoc Worker
    都度実行されるクエリを処理

Redashの各コンテナは細かく見ると4つほどあります。(構成図がわかりにくくてすんません)上記でEC2の時に重いクエリでサーバー再起動しなければならない根本的な原因はWorkerが重いからなのです。なので、Workerのスペックを調整して、オートスケールできればサービスが停止することはありません。ここがEC2ではできないECS/Fargateのメリットとなります。EC2の場合は各役割ごとにコンテナを動かすなんでできないですからね。EC2上のDockerと構成は同様ですが、改めて構成図を書いてみるとFargateの場合、中々ややこしい….!!


Terraform

  • elasticache.tf

RedashのRedisのバージョンは5系が推奨されています。6系でも動作するか後ほど確認してみたいと思います。 num_cache_nodes は一つで十分そうですね。

  • security-group.tf

  • elb_targetgroups.tf

ターゲットグループのヘルスチェックパスですが、以下Redashはデフォルトで/pingが用意されているので指定しましょう。

https://discuss.redash.io/t/aws-fargate-redash-server-alb/6152/6

  • elb_listenerrule.tf

・移行前

・移行後

移行前と移行後のソースがありますが、リスナールールでEC2用とECS用のターゲットグループをいつでも切り替えられるようにしています。

  • ecs_redash.tf

まず、12行目では環境変数でバケットとdatadogのAPIkeyはAWS Systems Managerから値を取得しています。バケットでは後ほど説明するRedashのenvファイルを読み込ませるためです。

次に、25行目health_check_grace_period_seconds = 300 ですが、Redashといえば起動する時間がかかるため、300秒の間はALBのヘルスチェックが失敗してもECSに無視してもらうように設定する必要があります。

また、71行目deployment_minimum_healthy_percent = 0 は以下schedulerがローリングデプロイが不可能なため、旧コンテナを消してから新コンテナをデプロイするようにしています。

https://discuss.redash.io/t/cannot-deploy-without-downtime-because-of-scheduler-process-getting-error-raise-valueerror-theres-already-an-active-rq-scheduler/7842

  • files/task_definitions/redash.json

  • files/task_definitions/redash-scheduler.json

  • .env

PYTHONUNBUFFERED はdocker-compose.ymlにも指定されているように、envファイルでも必要になります。また、Redashは多くのデータソースに対応している反面、依存パッケージも多いのと、読み込みによってメモリが多く消費されます。 REDASH_DISABLED_QUERY_RUNNERS で使われていない不要なクエリは削除してしまいましょう。

  • autoscale.tf

オートスケールは80%以上からですが、コンテナの起動が遅いので40%からでも良さそうですね。ここらへんは運用してから変えていきましょう。


EC2からECS/Fargateに切り替え

  • EC2/docker-compose stopする
  • DBをdumpする
  • terraform apply
  • ターゲットグループをfargate用に向ける
  • アクセスできたらEC2をシャットダウンし、AMIとインスタンス削除

RedashはEC2とECSで同時起動してしまうとworkerのスケジューラーやクエリが走らないように必ずEC2の方は停止することをオススメします。


まとめ

これはTerraform化しないと手動での設定は無理なんじゃないかと思うくらい大変でした。ECSならではの設定項目があったりするので、マネージドに移行してからまだ運用して間もないですが、オートスケールなどの調整は引き継ぎDatadogでモニタリングしていこうと思います。とりあえず運用コストかからなくて済むぞ!(docker-composeの方が個人的に楽)

参考
https://zenn.dev/paulxll/articles/5acfafd0921f0b
https://tech.timee.co.jp/entry/2020/04/20/175821

Pocket


adachin

1989年生まれのSRE。 ホスティングから大規模なアドテクなどのインフラエンジニアとして携わる。好きなツールはAnsible,Terraform,CircleCIで、ECS/Fargateでのインフラ構築を得意とする。副業では数社サーバー保守とベンチャー企業のインフラ改善やMENTAで未経験者にインフラのコーチングを実施している。また、「脆弱性スキャナVuls」のOSS活動もしており、自称エバンジェリスト/技術広報/テクニカルサポート/コントリビュータでもある。現在はサービスの信頼性向上、DevOps、可用性、レイテンシ、パフォーマンス、モニタリング、緊急対応、インフラコード化、リファクタリング、セキュリティ強化、新技術の検証、Docker開発環境の提供、AWSでのインフラ構築、ECS/Fargateへ移行、CakePHP4での管理画面作成、メンター、分析基盤の運用を担当している。

0件のコメント

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください