Terraformとecspressoを使用してRedashをECS上で動かす例を紹介する
本記事では、AWS環境でRedashを動かす場合に、ECSを使う例を紹介します。
できるだけ、手間をかけずにセットアップしたいため、Terraformとecspressoを使用します。
これらのツールを使われていない方でもRedashをECSで動かす参考になると思います。
公式によるRedashのセットアップ方法は以下です。
公式のセットアップ方法では、コンテナの環境にPostgreSQLなどのDBが含まれています。運用を考えると、DBはRDSを使いたいと考えます。
今回は、Redashで必要な各種DBはAWSのマネージドサービスを使い、プログラムはECSで動かすという例を紹介します。
ソースは以下にあります。
使用するツールについて
- Terraform
- ecspresso
Terraformとecspressoの組み合わせはとても良くて、Terraformで作成したVPCのサブネットやセキュリティグループといったECSで必要になるリソースを参照できるのが良いです。
ecspressoを使わない場合、Terraformで値を出力して、設定ファイルをその値に書き換えるスクリプトを書くなりして値を補完する必要があるので面倒です。
Redashのセットアップに関する動作内容の説明
まずはTerraformを実行して、RDSなどのRedashを動かすのに必要なリソースを用意します。
$ cd terraform
$ terraform init
$ terraform apply
実行が完了すると、VPC、RDS、ElastiCache、ALBといったAWSリソースが作成されます。
ecspressoでは、以下のようにTerraformのtfstateを使用する設定を行います。
adhoc_worker/config.yaml
... plugins: - name: tfstate config: url: s3://hi1280-tfstate-main/redash.tfstate
ecspressoで使用するサービス定義、タスク定義の設定ファイルでは、tfstateの値を以下のように参照できます。
adhoc_worker/ecs-service-def.json
{ ... "networkConfiguration": { "awsvpcConfiguration": { "assignPublicIp": "ENABLED", "securityGroups": [ "{{ tfstate `aws_security_group.redash.id` }}" ], "subnets": [ "{{ tfstate `module.vpc.aws_subnet.public[0].id` }}", "{{ tfstate `module.vpc.aws_subnet.public[1].id` }}", "{{ tfstate `module.vpc.aws_subnet.public[2].id` }}" ] } }, ... }
{{ tfstate ...}}で、terraformのリソースの値を参照できます。
このような形で設定ファイルを用意することで、ecspressoを使ってECS上でRedashを実行できます。
$ cd ecspresso $ ecspresso create --config create_db/config.yaml $ ecspresso run --config create_db/config.yaml --task-def create_db/ecs-task-def.json $ ecspresso create --config worker/config.yaml $ ecspresso create --config adhoc_worker/config.yaml $ ecspresso create --config scheduled_worker/config.yaml $ ecspresso create --config server/config.yaml
Redashは、DB作成のスクリプトを実行してから、Redashの各種プログラムを動かすという手順でセットアップします。
具体的には、create_db
というコマンドを実行した後に、Redashの各種プログラムを起動します。
ecspresso run
では、ECSタスクを一度だけ実行できるため、これでcreate_db
を実行します。
ただし、ecspressoでは、runを行うのにサービスを作ることが前提となるため、ecspresso create
でタスクを実行しないサービスを事前に作ります。
desiredCountを0にしてタスクを実行しないようにします。
create_db/ecs-service-def.json
{ ... "desiredCount": 0, ... }
そのほかのプログラムは,ecspresso create
でECSサービスとして通常どおりに動かします。
動作確認
試しにRedashにアクセスする場合には、HTTPSでALBのDNS名にブラウザからアクセスします。
Redashの初期画面が表示されます。
実際に運用する場合には、Route53と連携して、正式なホスト名で公開することになると思います。
まとめ
ECS上でRedashを構築する例については、情報を探すと色々なやり方が見つかります。
今回は、それらの情報を踏まえた上で自分が考える一番良いやり方を行いました。
参考になれば幸いです。