RedashをDockerで起動する（2017年3月版）

# やったこと

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

## TL;DR
とにかくRedashをDockerで起動してみたいんだけど、どうしたらいいの？ （これだけだとAmazon Athenaは使えません）

1. 作業ディレクトリを作って、そこへ移動する
1. 下にある `docker-compose.yml` ファイルをコピーして、そのディレクトリへ配置する
1. `docker-compose run --rm server create_db` する
1. `docker-compose up -d` する
1. ` 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](https://hub.docker.com/r/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がわからなくて苦労したので、辿ったファイルをメモしておく。

公式ブログ：

- https://blog.redash.io/amazon-athena-in-redash-support-6b71c91aa747#.wo5oz4f5s

redashリポジトリ：

- https://github.com/getredash/redash/blob/v1.0.0-rc.2/redash/query_runner/athena.py
- https://github.com/getredash/redash/blob/v1.0.0-rc.2/redash/query_runner/__init__.py#L169
- https://github.com/getredash/redash/blob/v1.0.0-rc.2/redash/__init__.py#L66
- https://github.com/getredash/redash/blob/v1.0.0-rc.2/redash/settings.py#L195

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

- https://github.com/getredash/redash-amazon-athena-proxy/blob/95a9850/src/main/java/com/getredash/awsathena_proxy/API.java#L25

# 接続設定（データソースの作成）
次の迷いポイントは接続設定だと思う。

## 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`