RedashをDockerで起動する(2017年3月版)


やったこと

  • Redashをローカル環境のDockerで起動する
  • ローカル環境(Dockerホスト)でリッスンしているMySQLへ接続する
  • Amazon Athenaへ接続する

TL;DR

とにかくRedashをDockerで起動してみたいんだけど、どうしたらいいの? (これだけだとAmazon Athenaは使えません)

  1. 作業ディレクトリを作って、そこへ移動する
  2. 下にある docker-compose.yml ファイルをコピーして、そのディレクトリへ配置する
  3. docker-compose run --rm server create_db する
  4. docker-compose up -d する
  5. http://localhost:28080 へアクセスする

前提

Docker for Mac をインストール済みの前提。他のOSでもdocker環境が構築済みなら、たぶん問題なく動くと思う。

試した環境は下記の通り。

  • macOS Sierra 10.12.3
  • Docker version 1.13.1
  • docker-compose version 1.11.1

起動

redashディレクトリを作成して、その下にリポジトリをcloneする。Amazon Athenaを使いたいのでそのためのリポジトリもクローンしている。こんな感じの構成にする。

redash/
    `-- https://github.com/getredash/redash.git (v1.0.0-rc.2)
    `-- https://github.com/getredash/redash-amazon-athena-proxy.git (95a9850)
    `-- docker-compose.yml (作成)

redashリポジトリの docker-compose.production.yml をコピーして docker-compose.yml を作り、変更する。(今回redashリポジトリで必要なのはこのymlファイルだけ)

主な変更点:

  • redashのイメージをbuildするようになっていたが、Docker Hub:redash/redashにイメージが上がっているのでimageを指定
  • ホスト側のポートは重複があるようなら変更
  • スキーマキャッシュの時間を5分に
  • 日付フォーマットを指定
  • Amazon Athenaを使うためにproxyサービスの追加・環境変数の追加
  • Postgresのデータを保存するvolumeは名前付きボリュームに
  • ゲートウェイのアドレスを固定するためにネットワーク設定をする(ゲートウェイへ接続するとホストに接続できる)

結果的にこんな感じになった。

docker-compose.yml
version: '2'
services:
  server:
    image: redash/redash:1.0.0.b2804
    command: server
    depends_on:
      - postgres
      - redis
    ports:
      - "5000:5000"
    environment:
      PYTHONUNBUFFERED: 0
      REDASH_LOG_LEVEL: "INFO"
      REDASH_REDIS_URL: "redis://redis:6379/0"
      REDASH_DATABASE_URL: "postgresql://postgres@postgres/postgres"
      REDASH_COOKIE_SECRET: veryverysecret
      REDASH_SCHEMAS_REFRESH_SCHEDULE: 5
      REDASH_DATE_FORMAT: YYYY/MM/DD
      # for Amazon Athena
      # REDASH_ADDITIONAL_QUERY_RUNNERS: redash.query_runner.athena
      # ATHENA_PROXY_URL: http://redash-amazon-athena-proxy:4567/query
  worker:
    image: redash/redash:1.0.0.b2804
    command: scheduler
    environment:
      PYTHONUNBUFFERED: 0
      REDASH_LOG_LEVEL: "INFO"
      REDASH_REDIS_URL: "redis://redis:6379/0"
      REDASH_DATABASE_URL: "postgresql://postgres@postgres/postgres"
      QUEUES: "queries,scheduled_queries,celery"
      WORKERS_COUNT: 2
      REDASH_SCHEMAS_REFRESH_SCHEDULE: 5
      REDASH_DATE_FORMAT: YYYY/MM/DD
      # for Amazon Athena
      # REDASH_ADDITIONAL_QUERY_RUNNERS: redash.query_runner.athena
      # ATHENA_PROXY_URL: http://redash-amazon-athena-proxy:4567/query
  redis:
    image: redis:2.8
  postgres:
    image: postgres:9.3
    volumes:
      - postgres-data:/var/lib/postgresql/data
  nginx:
    image: redash/nginx:latest
    ports:
      - "28080:80"
    depends_on:
      - server
    links:
      - server:redash
  # for Amazon Athena
  # redash-amazon-athena-proxy:
  #   build: redash-amazon-athena-proxy
volumes:
  postgres-data: {}
networks:
  default:
    ipam:
      config:
        - subnet: 172.31.0.0/16
          gateway: 172.31.0.1

こうしておいて下記のコマンドを順に実行すると、Redashが起動する。
docker-compose run --rm server create_db
docker-compose up -d

ホスト側のポート28080をwebサーバに割り当てているので、下記URLへアクセスするとRedashの初期画面が開く。
http://localhost:28080

Amazon Athenaへ接続できるようにする

Javaプロキシを立てて接続する方式になっている。上記ymlファイルで # for Amazon Athena とコメントアウトしているところをコメント解除するとAmazon Athenaが使えるようになる。(コメント解除後に再度 docker-compose up -d が必要)

参考にした情報

クエリランナーの有効化の方法とプロキシのURLがわからなくて苦労したので、辿ったファイルをメモしておく。

公式ブログ:

redashリポジトリ:

redash-amazon-athena-proxyリポジトリ:

接続設定(データソースの作成)

次の迷いポイントは接続設定だと思う。

MySQL

ホスト側でリッスンしているMySQLに接続するには、dockerネットワークのゲートウェイを指定する。
Host: 172.31.0.1
他はMySQLの設定に準ずる。

Amazon Athena

Amazon AthenaのテーブルはAWSコンソールなりで別途作成する必要がある。(事前に作成してなくても、接続自体は可能)

Redash側の設定に必要なもの:

  • AWSのアクセスキーID
  • AWSのシークレットアクセスキー
  • 利用するリージョン
  • Amazon Athena用stagingバケット

破棄

起動したRedashを停止するには、
docker-compose down

Postgresに保存したデータを含めて削除するには、
docker-compose down --volumes