概要
AWS CodeDeployを使ってSpringBootをEC2にデプロイするようにした。
bashのスクリプトを使って、javaコマンドのバックグラウンド実行(&)で起動したところデプロイが終わらなかった。
もう少し正確にいうと、スクリプトは期待通りに動作し、Bootアプリケーションも起動したのだが、CodeDeployがアプリが起動済なことを認識してくれなかった。
原因と対策
どうも単にjavaコマンドでバックグラウンド実行すると、標準入出力を掴んでしまい、そうするとCodeDeployがスクリプトの終了を検知してくれない模様。
標準入出力を適当にリダイレクトするようにしたら解決した。
プロダクション環境なんかではログ設計・出力が精査された状態なら、 /dev/null に捨ててもいいかもしれない。
詳細
appspec.ymlはこんな感じ
version: 0.0
os: linux
files:
- source: sample-app.jar
destination: /home/ubuntu
permissions:
- object: /home/ubuntu
pattern: "*.jar"
owner: ubuntu
hooks:
ApplicationStop:
- location: stop.bash
timeout: 300
runas: ubuntu
ApplicationStart:
- location: start.bash
timeout: 300
runas: ubuntu
起動スクリプトはこんな感じ
#!/usr/bin/env bash set -eu readonly APPLICATION_ROOT_DIR="/home/ubuntu" # 単純なバックグラウンド実行だとCodeDeploy側で終了を検知してくれない # java -jar "${APPLICATION_ROOT_DIR}/sample-app.jar &" # 標準入出力をログにリダイレクトするようにした java -jar "${APPLICATION_ROOT_DIR}/sample-app.jar" \ >> "${APPLICATION_ROOT_DIR}/sample-app.log" \ 2>&1 &
補足
serviceとして起動する方法もあるみたい
参考
ApplicationStart hook is pending after starting process in background