ローカルでSQL Server×Redashの環境を作る


この記事は自分用メモみたいなもの

目標

  • ローカルでRedashを使えるようにする
  • RedashのデータソースにSQL Serverを使う

手順

  1. 各種コンテナの立ち上げ
  2. データベースの作成
  3. データの投入
  4. Redashの接続

構築

1. 各種コンテナの立ち上げ

今回はローカルのRedash/SQL Serverともにコンテナを使って立ち上げる
Redashについてはこちらの記事にかかれている方法で立ち上げることができるが、SQL Serverを使うためには少し修正が必要になる

1.1 SQL Serverを使えるRedashのDockerイメージ作成

こちらのリポジトリから作られるdocker-compose.ymlをそのまま使うと、Redashコンテナ内のpymssqlのバージョンの関係でSQL Serverにうまく接続できない
具体的にはredash/redash:8.0.0.b32245のイメージのみ変更が必要なので、このイメージを元にSQL Serverを使えるイメージを生成する

以下のようなDockerfileを作成する

FROM redash/redash:8.0.0.b32245
RUN pip install --upgrade "pymssql==2.1.4" --user

上記Dockerfileが配置されたディレクトリにて以下コマンドを実行する
今回はredash-testというイメージ名で作成する

docker build -t redash-test:1.0.0 .

1.2 Redash/SQL Serverのコンテナ立ち上げ

こちらにて用意されるdocker-compose.ymlを元に以下のようなdocker-compose.ymlファイルを作成

version: "2"
x-redash-service: &redash-service
  image: redash-test:1.0.0
  depends_on:
    - postgres
    - redis
  env_file: /opt/redash/env
  restart: always
  networks:
    - redash

services:
  server:
    <<: *redash-service
    command: server
    ports:
      - "5000:5000"
    environment:
      REDASH_WEB_WORKERS: 4
  scheduler:
    <<: *redash-service
    command: scheduler
    environment:
      QUEUES: "celery"
      WORKERS_COUNT: 1
  scheduled_worker:
    <<: *redash-service
    command: worker
    environment:
      QUEUES: "scheduled_queries,schemas"
      WORKERS_COUNT: 1
  adhoc_worker:
    <<: *redash-service
    command: worker
    environment:
      QUEUES: "queries"
      WORKERS_COUNT: 2

  redis:
    image: redis:5.0-alpine
    restart: always
    networks:
      - redash

  mssql:
    image: mcr.microsoft.com/mssql/server:2017-latest
    ports:
      - 1433:1433
    environment:
      - ACCEPT_EULA=Y
      - SA_PASSWORD={任意のパスワード※}
      - MSSQL_LCID=1041
      - MSSQL_COLLATION=Japanese_CI_AS
    networks:
      - redash

  postgres:
    image: postgres:9.6-alpine
    env_file: /opt/redash/env
    volumes:
      - /opt/redash/postgres-data:/var/lib/postgresql/data
    restart: always
    networks:
      - redash

  nginx:
    image: redash/nginx:latest
    ports:
      - "80:80"
    depends_on:
      - server
    links:
      - server:redash
    restart: always
    networks:
      - redash

networks:
  redash:
    driver: bridge

※mssqlにて設定するパスワード
半角英数字で8文字あればとりあえずよい
ポリシーはこちら

このdocker-compose.ymlが配置されたディレクトリにてdocker-compose up -dを実行
実行後docker container ls等で以下のように起動が確認できていればOK

$ docker container ls
CONTAINER ID   IMAGE                                        COMMAND                  CREATED          STATUS          PORTS                                        NAMES
e3bce650d8d6   redash/nginx:latest                          "nginx -g 'daemon of…"   12 seconds ago   Up 9 seconds    0.0.0.0:80->80/tcp, :::80->80/tcp, 443/tcp   data_nginx_1
6e1d13e1b92f   redash-test:1.0.0                            "/app/bin/docker-ent…"   16 seconds ago   Up 12 seconds   5000/tcp                                     data_adhoc_worker_1
b31aeb169b19   redash-test:1.0.0                            "/app/bin/docker-ent…"   16 seconds ago   Up 12 seconds   5000/tcp                                     data_scheduler_1
3d5ebc25e254   redash-test:1.0.0                            "/app/bin/docker-ent…"   16 seconds ago   Up 11 seconds   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp    data_server_1
78e2d2a931f5   redash-test:1.0.0                            "/app/bin/docker-ent…"   16 seconds ago   Up 12 seconds   5000/tcp                                     data_scheduled_worker_1
b6c00c560f88   mcr.microsoft.com/mssql/server:2017-latest   "/opt/mssql/bin/nonr…"   18 seconds ago   Up 15 seconds   0.0.0.0:1433->1433/tcp, :::1433->1433/tcp    data_mssql_1
d2d166c58f9e   postgres:9.6-alpine                          "docker-entrypoint.s…"   18 minutes ago   Up 15 seconds   5432/tcp                                     data_postgres_1
0d7286213d72   redis:5.0-alpine                             "docker-entrypoint.s…"   18 minutes ago   Up 15 seconds   6379/tcp                                     data_redis_1

起動が確認できた状態でlocalhost:5000にアクセスするとRedashの起動が確認できる

2. データベースの作成

2.1 SSMSにてDBに接続

今回はSQL Server Management Studio (SSMS)を用いる
アプリケーションを開くと接続情報の入力画面が現れるので、以下の通り入力する
(※パスワードはdocker-compose.ymlにて設定したmssql用のパスワードを入力)

Server nameの部分は<hostname>,<port>なので注意

2.2 SSMSからデータベースの作成

この時点ではデフォルトのデータベースしか用意されていない
デフォルト以外のデータベースを使いたい場合はこの時点で作成しておく
※本当はコンテナ立ち上げ時にできるが、一旦は手動作成する

今回は以下の通りTestDbという名前でデータベースを作成した

3. データの投入

今回は以下のようなcsvを投入することでDB内にテーブル・データを用意する

id, name
1,sample
2,test
3,hoge

SSMSにて先程作成したデータベース名を右クリックし、「Tasks > Import Flat File...」を選択

するとImportするファイルを選択できるので、先程作成したファイルを選択(今回はtest.csvというファイル名にしている)

またこの時点でテーブル名とスキーマを選択できる
今回は投入するスキーマをdbo、テーブル名をsample_tableとしている

その後は画面の指示に従い操作する

4. Redashの接続

再びRedashに戻る
画面右上のボタンから設定画面へ遷移
遷移した画面のうち「Data Sources」タブから「+ New Data Source」を選択

ボタンを押下するとData Sourceの選択画面が現れる
選択肢の中からMicrosoft SQL Serverを選択(検索窓にSQL Serverといれるとすぐ見つかる)

進んだ画面で接続情報をそれぞれ以下の通り入力
TDS Version, Character Set, Portは編集しない

接続情報を登録すると以下のような画面に遷移する
中央下の「Test Connection」ボタンを押下し、右下に「Success」という文字が出れば接続できている

クエリを実行してみる

以上でローカルのRedash/SQL Serverの環境はできた
先程SQL Serverに投入したデータを確認する

クエリ作成画面へ遷移する

画面左上の「Create」ボタンを押下、そこで現れた選択肢のうち「Query」を選択

遷移した先がクエリエディタになっているため、先程作成したテーブルをselectする
selectする際スキーマ名dboもつける必要がある点に注意

参考資料