every Tech Blog

株式会社エブリーのTech Blogです。

Redash運用環境改善の取り組み

はじめに

こんにちは。 株式会社エブリーの開発本部データ&AIチーム(DAI)でデータエンジニアをしている吉田です。

今回は、半年ほど前に実施した挑戦Week内で行ったRedashの運用環境整備について紹介します。
DAIでは、BIツールとしてRedashをEC2で運用していましたが、運用コストの削減と運用の効率化を目的にECSへの移行を実施しました。  

背景

これまではEC2のdocker上でRedashを運用していましたが、以下のような問題がありました。

  • infra周りが管理されていない
  • docker-compose.ymlが管理されていない
  • コンテナがメモリを食いつぶして、サービスが落ちることがある
  • 障害対応、バージョンアップ、ライブラリの追加などの運用が大変

特にライブラリの追加などでRedashに変更を加えたい場合、scpでファイルを転送しsshでログインしてコマンドを実行する、などの煩雑な作業が必要でした。
手作業なためミスが起こり得る状況のほか、それらの変更の履歴が残らないなどの問題からRedashの運用環境の改善を行うことにしました。

そこで、IaCによる環境構築、CI/CDの導入、運用の効率化を目的にECSへの移行を実施しました。

ECSへの移行

ECSへの移行により、以下のような構成に変更しました。

  • IaC
    • terraformによるRedashの環境管理
  • CI/CD
    • AWS CodeBuildによるRedashのビルド/デプロイ
    • ecspressoによるECSサービス/タスク定義のデプロイ
  • Redashの運用
    • ECSによるBlue/Greenデプロイ
    • ECRによるRedashのコンテナイメージの管理

redash-infra

ecspressoによるECSへのデプロイ

ecspressoは、ECSのタスクやサービス定義の管理/デプロイを行うためのツールです。 ecspressoを利用することで、ECSのタスクやサービス定義をjsonで管理し、コマンド一つでデプロイが行えるようになります。 ecspresso.yml

region: ap-northeast-1
cluster: redash-fargate
service: redash-server
service_definition: ecs-service-def.json
task_definition: ecs-task-def.json
timeout: "10m0s"

ecs-service-def.json

{
  "deploymentConfiguration": {
    "deploymentCircuitBreaker": {
      "enable": true,
      "rollback": true
    },
    "maximumPercent": 200,
    "minimumHealthyPercent": 100
  },
  "deploymentController": {
    "type": "ECS"
  },
  "desiredCount": 1,
  "enableECSManagedTags": false,
  "enableExecuteCommand": true,
  "healthCheckGracePeriodSeconds": 0,
  "launchType": "FARGATE",
  "loadBalancers": [
    {
      "containerName": "redash-server",
      "containerPort": 5000,
      "targetGroupArn": "arn"
    }
  ],
  "networkConfiguration": {
    "awsvpcConfiguration": {
      "assignPublicIp": "ENABLED",
      "securityGroups": [
        "sg-"
      ],
      "subnets": [
        "subnet-",
        "subnet-"
      ]
    }
  },
  "pendingCount": 0,
  "platformFamily": "Linux",
  "platformVersion": "LATEST",
  "propagateTags": "NONE",
  "runningCount": 0,
  "schedulingStrategy": "REPLICA",
  "tags": [
    {
      "key": "Service",
      "value": "redash"
    },
    {
      "key": "Terraformed",
      "value": "1"
    }
  ]
}

ecs-task-def.json

{
  "containerDefinitions": [
    {
      "command": [
        "server"
      ],
      "cpu": 0,
      "secrets": [
      ],
      "environment": [
      ],
      "essential": true,
      "image": "ecr.image",
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-create-group": "true",
          "awslogs-group": "/ecs/redash",
          "awslogs-region": "ap-northeast-1",
          "awslogs-stream-prefix": "ecs"
        }
      },
      "name": "redash-server",
      "portMappings": [
        {
          "appProtocol": "",
          "containerPort": 5000,
          "hostPort": 5000,
          "protocol": "tcp"
        }
      ],
      "ulimits": [
        {
          "hardLimit": 65536,
          "name": "nofile",
          "softLimit": 65536
        }
      ]
    }
  ],
  "executionRoleArn": "arn",
  "taskRoleArn": "arn",
  "family": "redash-server",
  "ipcMode": "",
  "cpu": "2048",
  "memory": "4096",
  "ephemeralStorage": {
    "sizeInGiB": 30
  },
  "networkMode": "awsvpc",
  "pidMode": "",
  "requiresCompatibilities": [
    "FARGATE"
  ],
  "tags": [
    {
      "key": "Service",
      "value": "redash"
    },
    {
      "key": "Terraformed",
      "value": "1"
    }
  ]
}

タスク定義、サービス定義をjsonで管理し、ecspresso.ymlで定義した内容を元に、ecspresso deploy --config ecspresso.ymlでデプロイを行うことができます。
また、diffを出力することもできるため、変更点を把握しやすくなります。

移行後

CI/CD整備により、masterブランチへのマージをトリガーにRedashのビルド/デプロイが自動で行われるようになりました。 これにより、ライブラリ追加などの変更が発生した際に、手作業でのデプロイ作業が不要となりました。 またecspressoによるECSへのデプロイにより、ECSのタスクやサービス定義の管理が容易になり、diffを出力することで変更点を把握しやすくなり意図しない変更を防ぐことができるようになりました。

最後に

今回はRedashの運用環境の改善を行いました。 EC2での運用からECSへの移行、CI/CDの導入、IaCによる環境管理などを行い、運用コストの削減と運用の効率化を実現しました。