ECSでunicornを動かすときの注意点
ECSはタスクが停止すると、各コンテナにまず SIGTERM
を送ります。
しかし、Railsと一緒によく使われるunicornは SIGTERM
を受け取ると、gracefulに終了してくれません。
graceful shutdownさせるためには QUITシグナルをmasterプロセスに対して送る必要があります。 Signal handling
デフォルトの停止シグナルは SIGTERM ですが、これは Dockerfile に STOPSIGNAL ディレクティブを追加することによってオーバーライドできます。この停止シグナルは、シャットダウンの命令をアプリケーションに通知します。
やり方としてはshell scriptのハンドラーを書いたり、STOPSIGNAL
ディレクティブをDockerfileに追加する方法もあると思いますが、今回の場合は
unicorn.rb
に Signal.trap
して自身のmasterプロセスに対してシグナルを送るのが一番簡単だと思います。
before_fork do |server, worker| Signal.trap 'TERM' do Process.kill 'QUIT', Process.pid end