AMIから起動したredashでメタデータにアクセスする手順の話(2020/04/03現在)

はじめに

redashのユーザー情報やクエリなどredash上で保存したデータはメタデータとしてDBに保存されている

少し苦戦したので、redashのDBにアクセスするまでの手順を備忘録として残す

DB情報の確認

redashはアプリケーションサーバ以外に、キャッシュとしてredisやDBとしてPostgreを利用している

docker-composeで一括起動しているので、再起動時などもdocker-composeを利用する

$ cat /opt/redash/docker-compose.yml
version: "2"
・
・
・
  postgres:
    image: postgres:9.6-alpine
    env_file: /opt/redash/env
    volumes:
      - /opt/redash/postgres-data:/var/lib/postgresql/data
    restart: always
    ports:
      - "5432:5432"
・
・
・

DBの接続情報は、ここで設定されている /opt/redash/env に記載されているので確認しておきましょう

$ cat /opt/redash/env | grep -i postgres
POSTGRES_PASSWORD=hogehogepassword
REDASH_DATABASE_URL=postgresql://postgres:hogehogepassword@postgres/postgres

パスワードは書き換えていますが、 接続情報からユーザーが postgres でデータベースとして postgres となっていることも確認できます

DB接続情報の確認

redashの管理画面から接続する前にredashのインスタンス上で接続の確認を行います

psqlのクライアントが入っていないので、インストールから行います

# psql clientのインストール
$ sudo apt-get install postgresql-client

# バージョンの確認
$ psql --version
psql (PostgreSQL) 12.2 (Ubuntu 12.2-2.pgdg18.04+1)

続いて、先程の接続情報を使ってDBにログインしたいところですが、postgresへのポートが開放されていないので、空ける必要があります

# dockerのポート情報の確認
$ sudo docker ps
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS                         NAMES
  adhoc_worker:
e3be4ab3f1c8        redash/redash:8.0.0.b32245   "/app/bin/docker-ent…"   7 days ago          Up 7 days           0.0.0.0:5000->5000/tcp        redash_server_1
6bf3b713d5fe        postgres:9.6-alpine          "docker-entrypoint.s…"   7 days ago          Up 7 days           5432/tcp                      redash_postgres_1
a4edc7fb36d0        redash/nginx:latest          "nginx -g 'daemon of…"   7 days ago          Up 7 days           0.0.0.0:80->80/tcp, 443/tcp   redash_nginx_1
2b39a6838a0c        redash/redash:8.0.0.b32245   "/app/bin/docker-ent…"   7 days ago          Up 7 days           5000/tcp                      redash_adhoc_worker_1
2ff4aed21f34        redash/redash:8.0.0.b32245   "/app/bin/docker-ent…"   7 days ago          Up 7 days           5000/tcp                      redash_scheduled_worker_1
e9a4a49963e3        redash/redash:8.0.0.b32245   "/app/bin/docker-ent…"   7 days ago          Up 7 days           5000/tcp                      redash_scheduler_1
bc73e56ac9a2        redis:5.0-alpine             "docker-entrypoint.s…"   5 months ago        Up 7 days           6379/tcp                      redash_redis_1

アプリケーションサーバーとnginxしかポートが開放されていないことがわかりますね

postgresのポート開放

docker-compose.ymlを修正して、ports情報を追記します

$ diff -u docker-compose.yml.bk docker-compose.yml
--- docker-compose.yml.bk   2020-04-03 06:23:44.332535841 +0000
+++ docker-compose.yml  2020-04-03 04:50:14.879865025 +0000
@@ -41,6 +41,8 @@
     volumes:
       - /opt/redash/postgres-data:/var/lib/postgresql/data
     restart: always
+    ports:
+      - "5432:5432"
   nginx:
     image: redash/nginx:latest
     ports:

設定を変更したので、反映させます

$ sudo docker-compose up -d postgres
Recreating redash_postgres_1 ... error

ERROR: for redash_postgres_1  Cannot start service postgres: b'driver failed programming external connectivity on endpoint redash_postgres_1 (2750c3aca436769be5b99682533d389bca070a999f70399ec00c43ff704e0a40): Error starting userland proxy: listen tcp 0.0.0.0:5432: bind: address already in use'

ERROR: for postgres  Cannot start service postgres: b'driver failed programming external connectivity on endpoint redash_postgres_1 (2750c3aca436769be5b99682533d389bca070a999f70399ec00c43ff704e0a40): Error starting userland proxy: listen tcp 0.0.0.0:5432: bind: address already in use'
ERROR: Encountered errors while bringing up the project.

自分の環境では、portの設定反映だけでは正常に動作しなかったので、該当のpsqlのプロセスを落として、再起動しました

# 5432をbindingしているプロセスを探す
$ sudo lsof -i:5432 -nP
COMMAND   PID     USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
postgres 8403 postgres    5u  IPv4 1161102      0t0  TCP 127.0.0.1:5432 (LISTEN)

# 該当プロセスのkill
sudo kill 8403

# postgresの起動
$ sudo docker-compose up -d postgres
Removing redash_postgres_1
Recreating 6bf3b713d5fe_redash_postgres_1 ... done

再度dockerのポート情報を確認すると空いているのがわかりますね

$ sudo docker ps
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS                         NAMES
e3370b9ddb6d        postgres:9.6-alpine          "docker-entrypoint.s…"   11 seconds ago      Up 6 seconds        0.0.0.0:5432->5432/tcp        redash_postgres_1
e3be4ab3f1c8        redash/redash:8.0.0.b32245   "/app/bin/docker-ent…"   7 days ago          Up 7 days           0.0.0.0:5000->5000/tcp        redash_server_1
a4edc7fb36d0        redash/nginx:latest          "nginx -g 'daemon of…"   7 days ago          Up 7 days           0.0.0.0:80->80/tcp, 443/tcp   redash_nginx_1
2b39a6838a0c        redash/redash:8.0.0.b32245   "/app/bin/docker-ent…"   7 days ago          Up 7 days           5000/tcp                      redash_adhoc_worker_1
2ff4aed21f34        redash/redash:8.0.0.b32245   "/app/bin/docker-ent…"   7 days ago          Up 7 days           5000/tcp                      redash_scheduled_worker_1
e9a4a49963e3        redash/redash:8.0.0.b32245   "/app/bin/docker-ent…"   7 days ago          Up 7 days           5000/tcp                      redash_scheduler_1
bc73e56ac9a2        redis:5.0-alpine             "docker-entrypoint.s…"   5 months ago        Up 7 days           6379/tcp                      redash_redis_1

DBに接続

localから接続できるようになったので、接続してテーブル情報の確認をします

$ psql -U postgres -h localhost
Password for user postgres:
psql (12.2 (Ubuntu 12.2-2.pgdg18.04+1), server 9.6.15)
Type "help" for help.

postgres=# \d

redashからメタデータのDBにアクセス

redashの管理画面のDataSourceを追加する

f:id:b0941015:20200403153524p:plain

注意すべき点として、同じインスタンス内だがHostがlocalhost127.0.0.1で接続できなかった

そこでインスタンスのprivate-ipを指定することによって接続することができた

IPが変わるような環境であれば、DNSを作成して指定すると良いかも知れない

上記の設定を行って、Test Connectionが正常に動作すれば、対応完了

まとめ

AMIでredashを起動した際に生成されるローカルのデータベースにアクセスする手順をまとめた。

バージョンが変わると接続方法も変わるかも知れないが、一時的な備忘録としてここに記した