AWS CodeDeployでSpringBootのデプロイが終わらない #AWS
概要
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