Redashは様々なデータソースから抽出したデータをクエリで結合して可視化できるサービス。
他のサイトにiframeでグラフを埋め込むには、Redashを立ち上げているサーバーもhttps(SSL)対応する必要がある。
ではどうやってhttps(SSL)対応するのか。
詰まりやすいポイントはあるのか。
そこで今回はGoogleCloudでRedashのhttps(SSL)化設定する手順について紹介する。
この記事を書いている人
記事を読むメリット
GoogleCloudでRedashのhttps(SSL)化設定する手順がわかり、https対応に何時間も悩まずに済む。
GoogleCloudでRedashのhttps(SSL)化設定する手順
RedashのHTTPS(SSL)の設定については、Redashの管理ガイドのページに書かれている。
ページには以下のように書かれている。
The instructions below are for the legacy images. If you use the new Docker based images, see the following guide:
https://gist.github.com/arikfr/64c9ff8d2f2b703d4e44fe9e45a7730e
実際はガイドのページではなく、GitHubのページを見ることになる。
ただし冒頭に書いたように、このまま進めるとハマる。
実際にハマった。
「iframeで読み込むならSSL化しないと」
ということでSSL対応したいけど、RedashのNginxコンテナに/opt/redash/nginx/nginx.confの設定が反映されねぇ。
(;´・ω・`)https://t.co/mqu2UdIiAG— からさん (@karasan_itips) September 2, 2024
同じようにハマらないためには、手順を少し変える必要がある。
設定方法
では設定方法を追っていこう。
step
1IP確認
Make sure the domain you picked points at the IP of your Redash server.
翻訳:選択したドメインが Redash サーバーの IP を指していることを確認してください。
これはHTTPS化よりも手前のドメイン設定なので、問題無いかと思う。
使うドメインのDNS設定にAレコードを追加してIPを指定すれば、ドメインにアクセスした際に指定したIPにアクセスするようになる。
サブドメインでもよい。
step
2rootユーザーに切り替え
GoogleCloud Redash インスタンス |
---|
Switch to the root user (sudo su).
翻訳:rootユーザーに切り替えます(sudo su)。
ここでは「rootユーザーに切り替え」となっているが、その前に当然GoogleCloudのインスタンスにSSH接続しておく必要がある。
特にこだわりが無ければGoogleCloudのインスタンスのページから、ブラウザSSHで接続するといいだろう。
ログインしたら sudo su
でrootユーザーになるといい。
step
3nginxディレクトリ作成
Create a folder named nginx in /opt/redash.
翻訳:/opt/redashに「nginx」という名前のフォルダを作成します。
ここは指定の通りディレクトリを作成する。
cd /opt/redash mkdir nginx
前のステップでrootユーザーになっておかないと、ここでディレクトリを作成する権限が無くてエラーになるので、rootユーザーになっておこう。
step
4certsディレクトリ作成
Create in the nginx folder two additional folders: certs and certs-data.
翻訳:/opt/redash/nginx の中に「certs」と「certs-data」という名前のフォルダを作成します。
ここも指定の通りディレクトリを作成する。
指定には無いがもう一つディレクトリを作成しておく。
cd /opt/redash/nginx mkdir certs mkdir certs-data mkdir conf.d
certs関連の中には後でSSL認証した際のファイルが格納される。
conf.dの中にはnginxの設定ファイルを保存する。
step
5confファイル作成
Create the file /opt/redash/nginx/nginx.conf and place the following in it: (replace example.redashapp.com with your domain name)
翻訳:以下の内容で「/opt/redash/nginx/nginx.conf」という名のファイルを作成します。(「example.redashapp.com」の部分は自分のドメイン名に読み替えてください。)
ここも指定の通りにファイルを作成する・・・のではなく、先程作った conf.d
のディレクトリにファイルを作成する。
cd /opt/redash/nginx/conf.d nano nginx.conf
nanoコマンドで編集画面を出したら以下の内容を記入する。
server_name example.redashapp.com;
の部分は自分のドメイン名に変更する。
upstream redash { server redash:5000; } server { listen 80; listen [::]:80; server_name example.redashapp.com; location ^~ /ping { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto; proxy_pass http://redash; } location / { rewrite ^ https://$host$request_uri? permanent; } location ^~ /.well-known { allow all; root /data/letsencrypt/; } }
step
6docker-compose.ymlにnginxコンテナの設定を追加する
Edit /opt/redash/docker-compose.yml and update the nginx service to look like the following:
翻訳:以下のように「/opt/redash/docker-compose.yml」のnginxサービス修正する
ここに間違いがある。
修正するのは /opt/redash/docker-compose.yml
ではなく、 /opt/redash/setup/docker-compose.yml
。
/opt/redash/docker-compose.yml
を変更したところで、以降のステップは一向に進まないので注意してほしい。
またdocker-compose.ymlを編集する前に、編集前のコピーをとっておくと良いだろう。
cd /opt/redash/setup cp docker-compose.yml docker-compose.yml.origin nano docker-compose.yml
追加する内容は以下のとおりだが、docker-compose.ymlファイルの中のserviceの中に追加する必要がある。
nginx: image: nginx:latest ports: - "80:80" - "443:443" depends_on: - server links: - server:redash volumes: #- /opt/redash/nginx/nginx.conf:/etc/nginx/conf.d/default.conf - /opt/redash/nginx/conf.d: /etc/nginx/conf.d - /opt/redash/nginx/certs:/etc/letsencrypt - /opt/redash/nginx/certs-data:/data/letsencrypt restart: always
volumes:
の - /opt/redash/nginx/nginx.conf:/etc/nginx/conf.d/default.conf
の部分を - /opt/redash/nginx/conf.d: /etc/nginx/conf.d
に変更している。
volumes:
ではホストのディレクトリをコンテナにマウントしているのだが、変更しないままの内容だとディレクトリではなくファイルを指定しているのでエラーになる。
volumeのマウント設定に使うためにステップ4で /opt/redash/nginx/nginx.conf
のディレクトリを追加で作成したわけだ。
docker-compose.ymlはインデントにも注意が必要だ。
インデントが違うだけでエラーになるので、編集した内容はフォーマットのチェックをしておくのが良いだろう。
step
7コンテナを再起動して変更を反映させる
Update Docker Compose: docker-compose up -d.
翻訳: 「docker-compose up -d」コマンドでDockerの構成を更新します。
ここにも間違いがある。
まずコンテナを再起動する前にrootユーザーは終了しておく必要がある。
(rootユーザーのまま実行するとエラーになる。)
そして docker-compose up
は再起動ではなく起動コマンドなので、既にコンテナが起動している状態では適切ではない。
また変更を確実に反映するにはオプションを付けるほうが良い。
まずrootユーザーを終了する
exit
そしてコンテナを再起動する。
docker-compose down docker-compose up -d --build
step
8SSL認証情報を生成する
Generate certificates: (remember to change the domain name)
翻訳:認証情報を生成する(ドメインの読み替えを忘れずに)
ここのコマンドも微妙に異なる。
GitHubページのコマンド
docker run -it --rm \ -v /opt/redash/nginx/certs:/etc/letsencrypt \ -v /opt/redash/nginx/certs-data:/data/letsencrypt \ deliverous/certbot \ certonly \ --webroot --webroot-path=/data/letsencrypt \ -d (自分のドメイン)
実際のコマンド
/opt/redash$ docker run -it --rm -v /opt/redash/nginx/certs:/etc/letsencrypt -v /opt/redash/nginx/certs-data:/data/letsencrypt certbot/certbot certonly --webroot --webroot-path=/data/letsencrypt -d (自分のドメイン)
GitHubのページでは deliverous/certbot
のところを、 certbot/certbot
にしている。
どちらもコンテナイメージだが、 certbot/certbot
の方が新しいのでこちらを使う。
コマンドが成功すると /opt/redash/nginx/certs
や /opt/redash/nginx/certs-data
ディレクトリの中にいくつかディレクトリやファイルが作成されているだろう。
(確認するときは sudo su
でrootユーザーになっておく必要がある。)
step
9nginxの設定ファイルにSSL用の設定を追加する
Assuming the previous step was succesful, update the nginx config to include the SSL configuration:
翻訳:前のステップが成功したら、nginxの設定ファイルにSSL設定を含めて行進する。
ここは特に問題なし。
気をつけるとするなら ssl_certificate
などのpemファイルの保存ディレクトリ名にドメイン名が含まれているので読み替えが必要なくらい。
upstream redash { server redash:5000; } server { listen 80; listen [::]:80; server_name example.redashapp.com; location ^~ /ping { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://redash; } location / { rewrite ^ https://$host$request_uri? permanent; } location ^~ /.well-known { allow all; root /data/letsencrypt/; } } server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name example.redashapp.com; add_header Strict-Transport-Security "max-age=31536000" always; ssl_session_cache shared:SSL:20m; ssl_session_timeout 10m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers "ECDH+AESGCM:ECDH+AES256:ECDH+AES128:!ADH:!AECDH:!MD5;"; ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 8.8.4.4; ssl_certificate /etc/letsencrypt/live/example.redashapp.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.redashapp.com/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/example.redashapp.com/chain.pem; access_log /dev/stdout; error_log /dev/stderr info; # other configs location / { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://redash; } }
step
10nginxコンテナを再起動して変更を反映させる
Restart nginx: docker-compose restart nginx.
翻訳: 「docker-compose restart nginx」コマンドでnginxコンテナを再起動する。
ステップ7と同じ手順で再起動する。
docker-compose down docker-compose up -d --build
step
11HTTPS化完了
All done, your Redash instance should be available via HTTPS now.
翻訳:全て完了したら、あなたのRedashインスタンスはHTTPSで利用できるはずだ。
手順に書いてあるとおり、ここまで来ればHTTPSのURLでアクセスできるはず。
というかhttpで接続しようとしてもhttpsにリライトする設定を入れたのでhttpsでしか接続できないはず。
まとめ
今回はGoogleCloudでRedashのhttps(SSL)化設定する手順について解説した。
基本的には公式サイトからリンクを貼られているGitHubページの手順で良いが、2024年9月段階では手順にいくつか間違いがある。
この記事の中で間違った手順の部分は修正したので、この手順で進めればHTTPS化できるだろう。
ビンゴ!(古)
/opt/redash/docker-compose.yml
ではなく
/opt/redash/setup/docker-compose.yml
を修正してdocker-compose up -d --build でvolumeを反映できた。そこからはLetsEncryptでSSL化して、Redashのグラフをiframeで表示できるようになった!🎉
— からさん (@karasan_itips) September 4, 2024