🔑

AWSで構築したRedashをSSL化する方法

2024/09/01に公開

こんにちは!@Ryo54388667です!☺️

普段は都内でエンジニアとして業務をしてます!
主にTypeScriptやNext.jsといった技術を触っています。

AWSで構築したRedashをSSL化する方法を紹介していきます!

📌 Redashとは?

カテゴリーとしては、BIツール(Business Intelligence Tool)のひとつに含まれます。Redash(リダッシュ)は、データを「見える化」するためのオープンソースです。

通常、簡易的に構築するだけではSSL化がされておらず、httpsのアクセスができない状態です。今回は、AWS上で構築したRedashをSSL化する手順を紹介していきます!

📌 手順

前提条件

  • AWS上にRedash環境を構築済み
  • キーペアを所定のディレクトリに配置済み

コマンド

  1. ターミナルで下記のコマンドを入力。ホスト名の箇所は変更してください。
ssh -i "redash.pem" ubuntu@xxxxxxxxxx.ap-northeast-1.compute.amazonaws.com
  1. opt/redash内
mkdir nginx
  1. redash/nginx内
mkdir certs
mkdir certs-data
  1. redash/nginx内
touch nginx.conf
  1. redash/nginx内
vi nginx.conf
  1. 下記のコードを書き込む(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/;
    }
}
  1. opt/redash内に戻る
cd ..
  1. opt/redash 内のdocker-compose.ymlファイルを編集する
vi docker-compose.yml
  1. 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
  1. opt/redash内
docker-compose up -d
  1. 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。

  1. nginxに移動
cd nginx
  1. nginx.confを編集。
vi nginx.conf
  1. 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;
 }
}
  1. opt/redashに移動
cd ..
  1. opt/redash内
docker-compose restart nginx

done の文字が出たら成功🎉

Eletsencryptは3ヶ月ごとに更新が必要なので、毎月1日の自動更新にしておく。

  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によるセキュアな通信が確立されます。

参考

https://redash.io/help/open-source/admin-guide/https-ssl-setup/

https://gist.github.com/arikfr/64c9ff8d2f2b703d4e44fe9e45a7730e

📌 最後に

AWS上で構築したRedashをSSL化し、httpsアクセスを可能にする手順のまとめは下記です!

手順概要:

  1. SSH接続でサーバーにログイン
  2. Nginxディレクトリと証明書用ディレクトリを作成
  3. nginx.confファイルを作成・編集し、Nginx設定を記述
  4. docker-compose.ymlファイルを編集し、サービスの設定を追加
  5. Dockerを使用してNginxコンテナを起動
  6. Certbotを使用してLet's EncryptからSSL証明書を取得
  7. Nginx設定をHTTPS対応に再編集
  8. 設定変更後、Nginxを再起動
  9. 証明書の自動更新設定を追加

最後まで読んでいただきありがとうございます!
気ままにつぶやいているので、気軽にフォローをお願いします!🥺

https://x.com/Ryo54388667/status/1826573962010071238

個人のメディアもあります!よければこちらも〜
https://ryotablog.jp/blogs/my-seo-todo-list

Discussion