🐳
(小ネタ)ECS で稼働している Rails アプリケーションをデプロイ無しで直接変更する
tl;dr
puma で稼働しているのであれば ECS Exec でコンテナに入って、以下のように pumactl
コマンド叩くと起動中サービスにその場で変更を反映できる
bundle exec pumactl phased-restart
前提
- ECS 上で Rails アプリケーションが稼働している (
production
モード ) - 該当サービスで ECS Exec が有効になっている
モチベーション
- アプリケーションの作りによっては ECS (AWS) 上で稼働させてみないと確認できない要素が存在する
- ソースコードのちょっとした修正を確認するたびに、デプロイパイプラインを動かして ECS 上に反映するすのが面倒な場合がある
- ECS 上でのソースコードの変更をそのままコンテナに反映できると楽になりそう
手順
Task に対して ECS Exec を有効化しておく
あらかじめ Task の設定で ECS Exec を有効化しておく必要がある。詳しくは以下を参照。
コンテナへの接続
ECS で稼働中のコンテナへの接続は ecsta
コマンドを利用するのが簡単。
基本的に ecsta exec
と打てば接続先を選択するだけで接続することができる
コンテナ内でのコードの修正
ECS Exec でコンテナに入って、コードを修正する。
コンテナ内で編集できるよう、開発用のコンテナイメージには vim くらい入れておいても良いかもしれない。
puma プロセスの確認と再起動
コードを変更したら puma の再起動を行う前にプロセスの状態を確認する
ps aux | grep puma
おそらく puma の worker プロセスが複数立ち上がっていると思われる (設定による)
以下のコマンドで puma の woker プロセスを再起動することができる
bundle exec pumactl phased-restart
この後、再度プロセスの状態を確認する
ps aux | grep puma
再起動後しばらく経つと、前回確認したものと異なる pid で worker プロセスが立ち上がっているのが確認できる
これで、ECS で稼働しているコンテナのコードを直接変更できる
Discussion