AWSで構築したRedashをSSL化する方法
こんにちは!@Ryo54388667です!☺️
普段は都内でエンジニアとして業務をしてます!
主にTypeScriptやNext.jsといった技術を触っています。
AWSで構築したRedashをSSL化する方法を紹介していきます!
📌 Redashとは?
カテゴリーとしては、BIツール(Business Intelligence Tool)のひとつに含まれます。Redash(リダッシュ)は、データを「見える化」するためのオープンソースです。
通常、簡易的に構築するだけではSSL化がされておらず、httpsのアクセスができない状態です。今回は、AWS上で構築したRedashをSSL化する手順を紹介していきます!
📌 手順
前提条件
- AWS上にRedash環境を構築済み
- キーペアを所定のディレクトリに配置済み
コマンド
- ターミナルで下記のコマンドを入力。ホスト名の箇所は変更してください。
ssh -i "redash.pem" ubuntu@xxxxxxxxxx.ap-northeast-1.compute.amazonaws.com
- opt/redash内
mkdir nginx
- redash/nginx内
mkdir certs
mkdir certs-data
- redash/nginx内
touch nginx.conf
- redash/nginx内
vi nginx.conf
- 下記のコードを書き込む(
nginx.conf
)
upstream redash {
server redash:5000;
}
server {
listen 80;
listen [::]:80;
server_name redash.example.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/;
}
}
- opt/redash内に戻る
cd ..
- opt/redash 内の
docker-compose.yml
ファイルを編集する
vi docker-compose.yml
-
docker-compose.yml
に下記のコードを書き込む
version: "2"
x-redash-service: &redash-service
image: redash/redash:8.0.0.b32245
depends_on:
- postgres
- redis
env_file: /opt/redash/env
restart: always
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
postgres:
image: postgres:9.6-alpine
env_file: /opt/redash/env
volumes:
- /opt/redash/postgres-data:/var/lib/postgresql/data
restart: always
nginx:
image: redash/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/certs:/etc/letsencrypt
- /opt/redash/nginx/certs-data:/data/letsencrypt
restart: always
- opt/redash内
docker-compose up -d
- opt/redash内
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 redash.example.com
※ ここでemailアドレスを求められたら、任意のアドレス を入力する。
Congratulations! Your certificate and chain have been saved at:
の文字が表示されたらOK。
- nginxに移動
cd nginx
- nginx.confを編集。
vi nginx.conf
- nginx.confに下記のコードを書き込む。
upstream redash {
server redash:5000;
}
server {
listen 80;
listen [::]:80;
server_name redash.example.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 redash.example.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/redash.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/redash.example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/redash.example.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;
}
}
- opt/redashに移動
cd ..
- opt/redash内
docker-compose restart nginx
done の文字が出たら成功🎉
Eletsencryptは3ヶ月ごとに更新が必要なので、毎月1日の自動更新にしておく。
- opt/redash内
crontab -e
0 0 1 * * docker run -t --rm -v /opt/redash/nginx/certs:/etc/letsencrypt -v /opt/redash/nginx/certs-data:/data/letsencrypt deliverous/certbot renew --webroot --webroot-path=/data/letsencrypt && docker-compose$
📌 コードの詳細の解説
Docker-compose.ymlについて
ports:
- "80:80"
- "443:443"
"80:80"は、ホストマシンのポート80(HTTP)をコンテナのポート80にマッピングします。これにより、ホストのポート80にアクセスすると、NginxがHTTPリクエストを受け取れるようになります。ポート443(HTTPS)も同様です。
volumes:
- /opt/redash/nginx/nginx.conf:/etc/nginx/conf.d/default.conf
- /opt/redash/nginx/certs:/etc/letsencrypt
- /opt/redash/nginx/certs-data:/data/letsencrypt
/opt/redash/nginx/nginx.conf:/etc/nginx/conf.d/default.conf
は、ホスト側のnginx.confファイルをコンテナ内のNginx設定ファイルとしてマウントしています。これにより、ホスト上で設定したNginxの設定をコンテナ内でも使用できるようになります。
/opt/redash/nginx/certs:/etc/letsencrypt
は、SSL証明書が保存されているホストのディレクトリを、コンテナ内のLet's Encryptのディレクトリにマウントしています。
/opt/redash/nginx/certs-data:/data/letsencrypt
は、Let's Encryptの認証データが保存されているホストのディレクトリを、コンテナ内の対応するディレクトリにマウントしています。
nginx/certs
このディレクトリには、SSL証明書ファイルが保存されます。具体的には、Let's Encryptから発行されたSSL証明書や関連する鍵ファイルが格納されます。
nginx/certs-data
このディレクトリは、Let's EncryptがSSL証明書を発行・更新する際に必要なデータが保存されます。具体的には、ウェブサーバーが証明書の認証手続きを行うための認証ファイルを一時的に格納する場所です。
nginx.confについて
listen 80; と listen [::]:80; は、IPv4とIPv6の両方でポート80(HTTP)を読み込む設定です。
location / {
rewrite ^ https://$host$request_uri? permanent;
}
HTTPリクエストをHTTPSへ恒久的にリダイレクト(301リダイレクト)します。
ssl_certificate /etc/letsencrypt/live/redash.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/redash.example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/redash.example.com/chain.pem;
ssl_certificate, ssl_certificate_key, ssl_trusted_certificate は、Let's Encryptから取得したSSL証明書のファイルパスを指定しています。これにより、SSL/TLSによるセキュアな通信が確立されます。
参考
📌 最後に
AWS上で構築したRedashをSSL化し、httpsアクセスを可能にする手順のまとめは下記です!
手順概要:
- SSH接続でサーバーにログイン
- Nginxディレクトリと証明書用ディレクトリを作成
-
nginx.conf
ファイルを作成・編集し、Nginx設定を記述 -
docker-compose.yml
ファイルを編集し、サービスの設定を追加 - Dockerを使用してNginxコンテナを起動
- Certbotを使用してLet's EncryptからSSL証明書を取得
- Nginx設定をHTTPS対応に再編集
- 設定変更後、Nginxを再起動
- 証明書の自動更新設定を追加
最後まで読んでいただきありがとうございます!
気ままにつぶやいているので、気軽にフォローをお願いします!🥺
個人のメディアもあります!よければこちらも〜
Discussion