Spring bootで作成したWebアプリをEC2にデプロイしたが、systemd にサービス登録して起動するとエラーになり起動しない。
でも手動でコマンドをたたくと起動する・・・なぜ?
sudo vi /usr/lib/systemd/system/~.service を下記の通り作成
[Unit]
Description=[Webアプリ名]
After=syslog.target
[Service]
User=ec2-user
ExecStart=/usr/bin/java -jar /home/ec2-user/app/[Webアプリ名]-0.0.1-SNAPSHOT.jar
SuccessExitStatus=143
[Install]
WantedBy=multi-user.target
systemd再読み込み, サービス開始, サービス状態確認
sudo systemctl daemon-reload
sudo systemctl start [サービス名]
sudo systemctl -l status [サービス名]
手動で起動すると普通に動作する
java -jar /home/ec2-user/app/[Webアプリ名]-0.0.1-SNAPSHOT.jar
どうやらDB接続関係でエラーッポイ
DBはH2をファイルベースで使用しているため、DBファイルの読み書き関係な気がする。
手動で起動した時下記のファイルが作成されていた。
/home/ec2-user/database.mv.db
このファイルに権限をとりあえず与えてみる
sudo chmod 777 /home/ec2-user/database.mv.db
結果、状況は変わらずエラー
実行ステータスを見比べてみると
手動
(/home/ec2-user/app/[Webアプリ名]-0.0.1-SNAPSHOT.jar started by ec2-user in /home/ec2-user)
自動
(/home/ec2-user/app/[Webアプリ名]-0.0.1-SNAPSHOT.jar started by ec2-user in /)
作業ディレクトリが違う?
sudo vi /usr/lib/systemd/system/~.service を下記に変更
[Unit]
Description=[Webアプリ名]
After=syslog.target
[Service]
User=ec2-user
ExecStart=/usr/bin/java -jar /home/ec2-user/app/[Webアプリ名]-0.0.1-SNAPSHOT.jar
WorkingDirectory=/home/ec2-user/app ←作業ディレクトリ追加
SuccessExitStatus=143
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl start ~.service
sudo systemctl status ~
Active: active (running) since Tue 2024-03-05 12:05:47 JST; 11s ago
問題なく稼働した!
EC2のアドレスにアクセスしてみる。
http://[EC2パブリックIP]:8080
問題なく表示された。
原因はおそらく、作業ディレクトリが [ / ] となっていたため、DBファイルを出力しようとしてもできずにエラーとなっていたっポイ。
今回の反省は、作業ディレクトリはきちんと設定する & アプリ起動時に作成されるファイルの作成先は認識しておくか決めておく。