【お知らせ】GENDAアドベントカレンダー
GENDAアドベントカレンダーのお知らせです。
GENDAアドベントカレンダーは、株式会社GENDAに所属するメンバーがお送りするアドベントカレンダーです。
12月1日からの25日間、GENDAのプロダクト開発や組織開発に関わるメンバーが、毎日多種多様なテーマの記事をお届けする予定となっております。
今回の課題
streamlitで作成したアプリをEC2にgit cloneして$ streamlit run
コマンドを実行し、アプリをEC2上で動かすところまで実装できた。
しかし、EC2から抜けると$ streamlit run
が停止してしまうことに気づいた。
なので、今回は$ streamlit run
がEC2上で動き続けるように、streamlitアプリのデーモン化に挑戦した。
実装手順
streamlitアプリを動かし続けるために以下の手順で実装した。
-
service
ファイルを作成する。 - 各種コマンドを実行する。
※streamlitのinstallやstreamlit_app.py
の用意は、既に終わっているものとします。
1. service
ファイルを作成する。
systemdのservice
ファイルを作成する。
以下のような、/etc/systemd/system/streamlit_app.service
を作成する。
[Unit]
Description=デーモン化のテスト
After=network.target
[Service]
Type=simple
WorkingDirectory=/home/ssm-user/streamlit
ExecStart=/home/ssm-user/.pyenv/shims/streamlit run /home/ssm-user/streamlit/streamlit_app.py
Restart = on-failure
[Install]
WantedBy=multi-user.target
上記のファイルの意味は以下の通り。
Unit セクション
Description
サービスの説明。
After
このサービスが依存するターゲットやユニットを指定し、そちらの処理が完了するまで待機する。
今回はnetwork.target
を設定しているので、ネットワークの設定が完了するまで、
上記のファイルに記述の処理の実行を待機するようになっている。
Service セクション
Type
ExecStart
で指定したコマンドでサービスの処理を起動した時に、サービスの「起動完了」の判定タイミングを指定する。
simple
はデフォルトの設定値で、プロセスが起動した時点で起動完了となる。
WorkingDirectory
サービスが実行される作業ディレクトリを指定する。
ExecStart
サービスを開始する際に実行されるコマンドを指定する。
サービスが開始する際に、streamlit run
コマンドが実行されるように指定しているイメージ。
※Streamlitを/home/ssm-user/.pyenv/shims/streamlit
にインストールしてあり、/home/ssm-user/streamlit/streamlit_app.py
にstreamlitのコードがある。
Restart
サービスの再起動条件を指定する。
on-failure
は、サービスが失敗した場合に再起動することを示している。
Installセクション
WantedBy
サービスをどのターゲットに関連付けるかを指定する。
multi-user.target
は通常、ユーザーがログインする際に起動するターゲット。
サービスはこのターゲットに関連付けられて実行される。
2. 各種コマンドを実行する。
1.streamlit_app.service
の変更をsystemdに変更させる。
$ sudo systemctl daemon-reload
2.streamlit_app.service
を起動時に自動的に有効化する。
$ sudo systemctl enable streamlit_app.service
3.streamlit_app.service
を起動する。
$ sudo systemctl start streamlit_app.service
4.streamlit_app.service
の現在の状態を表示する。
※サービスが正常に動作しているかなどを確認できるので、問題が発生していれば対応する。
$ sudo systemctl status streamlit_app.service
参考