この記事では、前回までに作ったStrava APIで取得したサイクリングデータを可視化するStreamlitアプリをAWSクラウドで動かしてみます。以下の記事の続編になります。
前回は、
ステップ1: ネットワーク環境の構築 (VPC)
ステップ2: セキュリティ設定 (IAMロールとセキュリティグループ)
ステップ3: 秘密情報の管理 (Systems Manager Parameter Store)
ステップ4: EC2インスタンスの作成
ステップ5: EC2への接続
まで実装しました。今回は、EC2環境構築、Streamlitアプリデプロイ、動作確認、リソース削除についてです。
ステップ6: EC2環境構築
- パッケージのインストールとアップデート (SSH接続したターミナル内で実行)
# システムを最新の状態に更新 sudo dnf update -y # Git, PostgreSQLサーバー、そしてPythonから使うための開発パッケージをインストール sudo dnf install -y git postgresql15-server postgresql-devel
- pyenv + pyenv-virtualenv 環境構築
以下を参考にさせていただきました。
【Python】Amazon Linux 2023にPython 3.11 + Selenium環境を構築する(前編)|yuu
# Python環境の構築 curl https://pyenv.run | bash # pyenvでインストールできるバージョンを確認 pyenv install -l | grep '3.13\.' # python 3.13.5 をインストール pyenv install 3.13.5 # virtualenv 環境を作成 pyenv virtualenv 3.13.5 strava-pg-env
# .bashrc に以下を追加 export PYENV_ROOT="$HOME/.pyenv" command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH" eval "$(pyenv init -)" eval "$(pyenv virtualenv-init -)"
ステップ7: アプリケーションのデプロイ
- アプリケーションのクローン、virtualenv有効化
cd /home/ec2-user git clone https://github.com/atsushi3hsgw/strava_pg.git # virtualenvを作成して有効化 cd strava_pg pyenv local strava-pg-env # virtualenvを確認 pyenv versions system 3.13.5 3.13.5/envs/strava-pg-env * strava-pg-env --> /home/ec2-user/.pyenv/versions/3.13.5/envs/strava-pg-env (set by /home/ec2-user/strava_pg/.python-version)
- Pythonライブラリのインストール
pip install -r requirements.txt
ステップ8: アプリの自動起動設定
- Streamlitアプリの起動スクリプト作成:
起動スクリプトは、以下の様になります。
virtualenv有効化
Parameter Storeから秘密情報を取得して環境変数にセット
Streamlitアプリを起動
#!/bin/bash # /home/ec2-user/strava_pg/aws/start_strava_segment_efforts.sh set -e # Enable the virtual environment export PYENV_ROOT="$HOME/.pyenv" export PATH="$PYENV_ROOT/bin:$PATH" eval "$(pyenv init -)" eval "$(pyenv virtualenv-init -)" # Force application of the project's pyenv virtual environment # (Unnecessary if .python-version exists) pyenv activate strava-pg-env # Configure AWS Region (Tokyo Region) export AWS_REGION="ap-northeast-1" # Retrieve confidential information from the Parameter Store and set it as an environment variable export STRAVA_CLIENT_ID=$(aws ssm get-parameter --name "/streamlit-app/strava/client_id" --with-decryption --query "Parameter.Value" --output text) export STRAVA_CLIENT_SECRET=$(aws ssm get-parameter --name "/streamlit-app/strava/client_secret" --with-decryption --query "Parameter.Value" --output text) export STRAVA_REDIRECT_URI=$(aws ssm get-parameter --name "/streamlit-app/strava/redirect_uri" --with-decryption --query "Parameter.Value" --output text) # Set the database connection information in the environment variables export DB_USER=$(aws ssm get-parameter --name "/streamlit-app/strava/db_user" --with-decryption --query "Parameter.Value" --output text) export DB_PASSWORD=$(aws ssm get-parameter --name "/streamlit-app/strava/db_passwd" --with-decryption --query "Parameter.Value" --output text) export DB_HOST="localhost" export DB_NAME="strava" # Start the Streamlit application streamlit run strava_segment_efforts.py --server.address 0.0.0.0 --server.port 8501
- systemdサービスファイルの作成:
[Unit] Description=Streamlit App Service After=network.target postgresql.service [Service] User=ec2-user Group=ec2-user WorkingDirectory=/home/ec2-user/strava_pg ExecStart=/home/ec2-user/strava_pg/aws/start_strava_segment_efforts.sh Restart=always [Install] WantedBy=multi-user.target
- サービスの有効化と起動:
sudo systemctl daemon-reload sudo systemctl enable strava_segment_efforts.service sudo systemctl start strava_segment_efforts.service # サービスが正常に起動しているか確認 (qで終了) sudo systemctl status strava_segment_efforts.service
ステップ9: ロードバランサーの作成 (ALB)
Application Load Balancer の「作成」を選択します。
ロードバランサー名: streamlit-app-alb
スキーム: インターネット向け
セキュリティグループ: ステップ2で作成した streamlit-alb-sg を選択します。
リスナーとルーティング:
ロードバランサーの作成画面に戻り、ターゲットグループの「更新ボタン」を押し、今作成した streamlit-app-tg を選択します。
「ロードバランサーの作成」をクリックします。
ステップ10: 動作確認(1)
「ロードバランサー」の一覧で、作成した streamlit-app-alb を選択します。
「詳細」タブにある DNS名 をコピーします。
WebブラウザのアドレスバーにDNS名を貼り付けてアクセスし、Streamlitアプリケーションが表示されることを確認します。ターゲットグループのヘルスチェックが healthy になるまで数分かかるみたいです。
ステップ11: 動作確認(2)
- 今のままでは、Strava認証でエラーになってしまいます。
値の例: http://streamlit-app-alb-2019454863.ap-northeast-1.elb.amazonaws.com
- STRAVA 側の設定で「認証コールバックドメイン」をステップ10で取得したDNS名を使っていないためです。STRAVA のサイトのMy API アプリケーションで「認証コールバックドメイン」を設定して下さい。
値の例: streamlit-app-alb-2019454863.ap-northeast-1.elb.amazonaws.com
- サービス再起動
sudo systemctl restart strava_segment_efforts.service sudo systemctl status strava_segment_efforts.service
WebブラウザのアドレスバーにDNS名を貼り付けてアクセスし、Streamlitアプリケーションが表示されることを確認します。Strava認証が完了してセグメントダッシュボード、ヒートマップが表示されたら成功です。
ステップ12: リソース削除チェックリスト
以下の順序でリソースを削除
[ ] ロードバランサー (ALB) の削除: streamlit-app-alb を選択し、「削除」します。
[ ] ターゲットグループ (TG) の削除: streamlit-app-tg を選択し、「削除」します。
[ ] VPCの削除: 「VPC」>「お使いのVPC」から streamlit-app-vpc を選択し、「VPCを削除」します。(関連リソースも同時に削除されます)
[ ] IAMロールの削除: EC2-Streamlit-SSM-Role を削除します。
[ ] Parameter Store のパラメータ削除: 作成した2つのパラメータを削除します。
[ ] EC2キーペアの削除: streamlit-server で使用したキーペアを削除します。
[ ] セキュリティグループの削除: streamlit-alb-sg と streamlit-ec2-sg を削除します。
次は、AWS Lambda、AWS Rekognition, Line 連携を使ってイケメン判定アプリを作ってみようかな!!