ECSでunicornを動かすときの注意点

ECSはタスクが停止すると、各コンテナにまず SIGTERM を送ります。 しかし、Railsと一緒によく使われるunicornSIGTERM を受け取ると、gracefulに終了してくれません。

graceful shutdownさせるためには QUITシグナルをmasterプロセスに対して送る必要があります。 Signal handling

aws.amazon.com

デフォルトの停止シグナルは SIGTERM ですが、これは Dockerfile に STOPSIGNAL ディレクティブを追加することによってオーバーライドできます。この停止シグナルは、シャットダウンの命令をアプリケーションに通知します。

やり方としてはshell scriptのハンドラーを書いたり、STOPSIGNAL ディレクティブをDockerfileに追加する方法もあると思いますが、今回の場合は unicorn.rbSignal.trap して自身のmasterプロセスに対してシグナルを送るのが一番簡単だと思います。

before_fork do |server, worker|
  Signal.trap 'TERM' do
  Process.kill 'QUIT', Process.pid
end

参考