【Terraform/Redash】1から始めるTerraformによるRedash構築

 

 

初めまして、サーバーエンジニアの坂牛です
今回は、Terraformでredashを1から構築する機会がありましたのでそちらに関してご紹介させていただきます。

はじめに

今回は、MySQLで集計したログデータをエンジニア以外でもweb上で確認できるようにするためRedashを使用しました
それに合わせ、環境ごとにRedashを複製できるようにTerraformも併用致しました
筆者はTerraform、Redashの経験がない状態で短期間で作成する必要があったため最小構成で構築することを目標に進めています

Terraform/Redash とは

  • Terraform
    Terraformは、インフラ(サーバー、ネットワーク、セキュリティ設定など)をコードで管理・構築できるツールです
    AWSのようなクラウドリソースを、手作業ではなく「コード化」することで、再現性のあるインフラ構築やバージョン管理が可能になります
    Redash環境を繰り返し構築したり、環境ごとに設定を分けたい場合に非常に便利です
  • Redash
    Redashは、さまざまなデータベースに接続し、SQLクエリを使ってデータの可視化ができるオープンソースのBIツールです
    今回は、MySQL上に存在するログデータをエンジニア以外でも確認できるようにするため使用しました

    ※Redashは下記コマンドでdockerコンテナを構築

curl -sLO https://raw.githubusercontent.com/getredash/setup/master/setup.sh
chmod +x setup.sh
sudo ./setup.sh

※yaml、.envを/opt/redashからコピーし、gitで管理

Terraformの設計方針

環境ごとに作成できるよう「enviroment」でフォルダ分け、「module」にリソース設定を配置するオーソドックスな構成
「common」に環境で共通のパラメータ(セキュリティグループ有効IPなど)を設定できるように

.
└── terraform/
    ├── common/
    │   ├── main.tf
    │   └── variables.tf
    ├── enviroments/
    │   └── dev/
    │       ├── local_variables.tf
    │       └── main.tf
    └── modules/
        ├── alb
        ├── dns
        └── ec2-server

既存リソースに関して

VPC、Route53に関してはすでに存在する状態だったのでそちらを使うように

Redashの構成方針

最小構成で構築できるようにEC2でDockerを起動する構成に

Terraformで作成する主なリソース

  • EC2(Redash用のDockerホスト)
    • aws_instance (EC2インスタンス設定)
    • aws_key_pair (EC2アクセス時に使用するSSH用の公開鍵を登録)
      • sshキーはローカルで発行 (ed25519鍵)
    • aws_security_group (EC2インスタンスにアクセス制御(sshアクセスのみ))
  • ALB(ロードバランサー、Redashへのアクセス用)
    • aws_lb (ALB本体)
    • aws_route53_record (ALBと証明書との紐づけ)
    • aws_lb_listener (HTTP/HTTPSのリスナー)
    • aws_lb_target_group (EC2を紐づけるためのグループ)
    • aws_lb_target_group_attachment (ALBとEC2の接続)
    • aws_security_group (ALB用のアクセス制御)
  • Route53(DNS設定、既存ドメインに紐づけ)
    • aws_acm_certificate (AWS ACMで証明書を取得)
    • aws_route53_record (証明書の検証に必要な設定)
    • aws_acm_certificate_validation (証明書検証用のCNAMEレコード)

構築手順

  1. Terraform の初期化・apply 手順
    ※ 実行は「enviroments/<環境名>」のディレクトリ内で実行する

初期化
※モジュール設定を追加する場合も実行の必要あり

AWS_PROFILE=<環境用のprofile> terraform init

差分情報出力
※反映時に出力された情報をもとにリソースを反映

AWS_PROFILE=<環境用のprofile> terraform plan -out <環境名>.plan

反映

AWS_PROFILE=<環境用のprofile> terraform apply <環境名>.plan
  1. EC2 インスタンス内のセットアップ手順(Docker起動など)

対象のEC2インスタンスにssh接続

ssh -i ~/.ssh/<発行したsshキー> ec2-user@<対象Ec2インスタンスIP>

EC2インスタンスに必要なパッケージをインストール

sudo yum update -y
sudo yum install -y git docker
sudo systemctl start docker
sudo systemctl enable docker
sudo usermod -aG docker ec2-user

docker composeのインストール

sudo wget https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-linux-x86_64 -O /usr/libexec/docker/cli-plugins/docker-compose
sudo chown root:root /usr/libexec/docker/cli-plugins/docker-compose
sudo chmod a+x /usr/libexec/docker/cli-plugins/docker-compose

dockerコンテナの起動
※あらかじめ、EC2コンテナ内で発行したsshキーをgit リポジトリに登録しリソース(Redashのdocker設定)を配置しておくこと

docker compose up

httpsアクセスして、こちらの画面が出れば構築完了!
※ 初回アクセス時ユーザー登録画面になり、そちらが管理ユーザーになります

その他、気を付けたところ

  • redashにヘルスチェックは無いのでnginx.confに定義を追記したうえでmountする必要がある
  • 同じVPC内のRDSを参照するように設定したがRDS側のセキュリティグループにEC2インスタンスのセキュリティグループを追加しないと接続に失敗していた

反省点・今後やっていきたい点

  • 本番で今のままの構成だとインスタンスを変えたときなどRedashのクエリが揮発するのでRDSなどに接続できるようにしてもよかった
  • EC2の自動停止周りまで対応する余裕が無かったので次回実施予定(Lambda + EventBridge)
  • 構築時にEC2インスタンスに対して手動でコマンドを実行していたがTerafformで作成時に実行するようにもできたようなので次回実施予定

 

関連記事

  1. Android15(APIレベル35)への対応が本当にできたのか不安な…

  2. 【JavaScript/TypeScript】forEachは非同期!…

  3. Unityでメモリ位置を表示するツール

  4. GitHub Actionsで1つしかキューされない挙動について

サービスサイト