なになれ

IT系のことを記録していきます

Terraformとecspressoを使用してRedashをECS上で動かす例を紹介する

本記事では、AWS環境でRedashを動かす場合に、ECSを使う例を紹介します。
できるだけ、手間をかけずにセットアップしたいため、Terraformとecspressoを使用します。
これらのツールを使われていない方でもRedashをECSで動かす参考になると思います。

公式によるRedashのセットアップ方法は以下です。

github.com

公式のセットアップ方法では、コンテナの環境にPostgreSQLなどのDBが含まれています。運用を考えると、DBはRDSを使いたいと考えます。 今回は、Redashで必要な各種DBはAWSのマネージドサービスを使い、プログラムはECSで動かすという例を紹介します。
ソースは以下にあります。

github.com

使用するツールについて

  • 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名にブラウザからアクセスします。
f:id:hi1280:20210328164838p:plain:w800

Redashの初期画面が表示されます。
f:id:hi1280:20210328171821p:plain:w800

実際に運用する場合には、Route53と連携して、正式なホスト名で公開することになると思います。

まとめ

ECS上でRedashを構築する例については、情報を探すと色々なやり方が見つかります。
今回は、それらの情報を踏まえた上で自分が考える一番良いやり方を行いました。
参考になれば幸いです。

参考