はじめに
SpringBootアプリをAWSのec2からデプロイしサービス化を試みたところ、思った以上に躓いたため同じような状況で悩んでいる方の助けになれば幸いです。
開発環境
・ java 11
・ SpringBoot 2.5.6
・ MySQL 8.0
・Apache Tomcat 9.0.73
結論
以下の内容で、無事にサービス化できアプリが正常に起動しました。
実際に、SSH接続が切れてもアプリが起動した状態を保ち、該当のURLでブラウザから動かせる事も確認済みです。
====================================
[Unit]
Description = 任意の文言
After=syslog.target
[Service]
ExecStart = /bin/java -jar /jarファイルのパス
Restart = always
Type = simple
User = ユーザ名
group = グループ名
SuccessExitStatus = 143
KillMode = process
[Install]
WantedBy = multi-user.target
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
・ユーザ名とグループ名の確認方法
ls -l jarファイルのパス
※pwdコマンドで
解説
[Service]
ExecStart = /bin/java -jar /jarファイルのパス
※今回の記事で一番お伝えしたいのは①の部分です。
① /bin/java -jar
② /jarファイルのパス
【イメージ】
ExecStart = ① ②
※①と②の設定の間に半角スペースがあります。
jarファイルのパスの指定②だけでなく、jarファイルを実行する時と同じように(上記の赤文字でハイライトした)「java -jar 」のコマンドの設定①が、「ExecStart = 」以降に必須のようです。「/binディレクトリの配下にjavaコマンドの実行用ファイルがあり、それを「ExecStart = 」以降に設定することでサービスファイルを実行できる」くらいのイメージで大丈夫だと思います。②のjarファイルのパスについては、jarファイルが置いてある階層で「pwd」コマンドを叩けば確認できます。
・サービスファイルの実行用コマンド
sudo systemctl start 〇〇.service
・ステータス確認用コマンド
sudo systemctl status 〇〇.service -l
起動に成功している場合、以下のように緑色の「active (running)」が確認できます。
この状態になれば、アプリが裏側で動き続けてくれるようなので、SSH接続が切れても問題なくアプリが使用できます。
・ログ確認用コマンド
sudo cat /var/log/messages
もし、①のjavaコマンドの指定ができていない場合は、サービスファイルの実行後に起動に失敗し以下のようなエラーがログに出力されます。
Failed at step EXEC spawning ... Exec format error
...main process exited, code=exited,status=203/EXEC
最後に
今回、サービス化用のファイルを作成したのが初めてであったため、解決するのに時間がかかってしまいました。。間違った内容がございましたら、恐れ入りますがご指摘いただければ幸いです。
最後までお読みいただきありがとうございました。
参考にしたサイト
・EC2+RDS+SpringBootアプリケーションでwebページを公開する。
・SpringBootをサービス化(デーモン化)して常駐させる