EC2でStreamlitを起動し、独自ドメインでHTTPS接続するまで(備忘録)

この記事では、EC2にStreamlitをインストールし、独自ドメインでHTTPS接続するまでの手順をメモします。(個人的な備忘録です)
環境情報
| 項目名 | 値 | 
|---|---|
| 動作環境 | EC2(Amazon Linux 2023 AMI) | 
| ドメイン取得 | お名前.com | 
| DNS | Route 53 | 
| 実行PC | MacBook Air M2(2023) | 
VPC/サブネット/EC2の作成
このあたりはいつも通りなので流れだけ。。
- VPCの作成
- サブネットの作成
- インターネットゲートウェイの作成
- ルーティングを設定(0.0.0.0をIGWへ)
- EC2/セキュリティグループを作成
のちほどcertbotを使ってSSL化するので、http(80)、https(443)からは全開放しておきます。
自身のIPからは全ポート開放。
Elastic IPの取得
AWSコンソール>EC2>ネットワーク&セキュリティ>Elastic IPから固定パブリックIPを取得します。
その後作成したEC2へ関連付けします。
Streamlitのインストール
まずは疎通確認のためにEC2へStreamlitをインストールします。
# MacBook Air
## EC2へSSH
$ ssh -i "xxxxxx.pem" ec2-user@xxx.xxx.xxx.xxx
# EC2
## pipのインストール
$ curl -O https://bootstrap.pypa.io/get-pip.py
$ python3 get-pip.py --user
$ pip install streamlit
## streamlit起動
$ streamlit hello
接続確認
Streamlitはデフォルトで8501ポートで起動するため、
http://xxx.xxx.xxx.xxx:8501
で接続確認。

IPでの接続はOK!
ドメインの取得
今回はお名前.comでドメインを取得しました。
Route53の設定
取得したドメインでRoute53のホストゾーンを作成し、Aレコードを追加します。
NSレコードの4つのルーティング先をメモしておきます。

ホストゾーンの作成

Aレコードの追加

NSレコードをメモ
ネームサーバーの変更
お名前.com上でドメインのネームサーバーをNSレコードの内容に修正します。

ドメインでのアクセスを確認(HTTP)
ここまでの設定でドメインでのアクセスが可能となっているはずなので、
http://ドメイン名:8501
でアクセスできることを確認します。
ポートの変更
現在のままだと8501ポートでのアクセスとなっているので、nginxを使って
http://ドメイン名
でアクセスできるように変更します。
# nginxのインストール
$ sudo yum install nginx
$ sudo service nginx start
$ sudo mkdir /etc/nginx/sites-available
$ sudo mkdir /etc/nginx/sites-enabled
# 設定ファイル変更
$ sudo vim /etc/nginx/nginx.conf
# ~省略
http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile            on;
    tcp_nopush          on;
    keepalive_timeout   65;
    types_hash_max_size 4096;
    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*; # 追加
# 省略~
$ sudo chmod 777 /etc/nginx/sites-available # ファイルを追加できるように権限を変更
$ sudo chmod 777 /etc/nginx/sites-enabled # ファイルを追加できるように権限を変更
# nginxのルーティング設定を追加、80から8501にルーティング
$ echo '''server {
    listen       80;
    server_name  <ドメイン名>;
    location / {
        proxy_pass http://0.0.0.0:8501/;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}''' > /etc/nginx/sites-available/<ドメイン名>
$ ln -s /etc/nginx/sites-available/<ドメイン名> /etc/nginx/sites-enabled/<ドメイン名> # シンボリックリンクを作成
$ sudo service nginx restart # nginxを再起動
streamlit用の設定ファイルも準備します。
$ mkdir ~/.streamlit
$ echo '''[server]
port=8501
headless=true
[browser]
serverAddress = "<ドメイン名>" # ドメイン名やIPアドレス
serverPort = 8501''' > ~/.streamlit/config.toml
$ streamlit hello # streamlitの起動
上記でポートの転送設定は完了です。
http://ドメイン名でアクセスできるか確認します。

ドメイン名でアクセスできた!
SSLの設定
最後にhttps接続できるよう、certbotでSSLの設定を行います。
# certbotの設定
$ sudo yum install certbot-nginx
$ sudo certbot --nginx
## 以降順番に質問に答えていきます。
## 下記がでればOK
Congratulations! You have successfully enabled
https://yourdomain.com
# cron設定
sudo yum install cronie
sudo crontab -e
## 以下を追記
39      1,13    *       *       *       root    certbot renew --no-self-upgrade && systemctl restart nginx
https://ドメイン名でアクセスできるか確認します。

HTTPSでアクセスできた!
おわりに
手順は長いですが、比較的簡単にStreamlitをEC2上で動作させることができました。
これからこの環境にさまざまなAppを作って公開していこうと思います!
参考資料
下記ページを参考にさせていただきました。





Discussion