🐳

(小ネタ)ECS で稼働している Rails アプリケーションをデプロイ無しで直接変更する

に公開

tl;dr

puma で稼働しているのであれば ECS Exec でコンテナに入って、以下のように pumactl コマンド叩くと起動中サービスにその場で変更を反映できる

bundle exec pumactl phased-restart

前提

モチベーション

  • アプリケーションの作りによっては ECS (AWS) 上で稼働させてみないと確認できない要素が存在する
  • ソースコードのちょっとした修正を確認するたびに、デプロイパイプラインを動かして ECS 上に反映するすのが面倒な場合がある
  • ECS 上でのソースコードの変更をそのままコンテナに反映できると楽になりそう

手順

Task に対して ECS Exec を有効化しておく

あらかじめ Task の設定で ECS Exec を有効化しておく必要がある。詳しくは以下を参照。

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ecs-exec.html

コンテナへの接続

ECS で稼働中のコンテナへの接続は ecsta コマンドを利用するのが簡単。

https://github.com/fujiwara/ecsta

基本的に ecsta exec と打てば接続先を選択するだけで接続することができる

https://zenn.dev/snaka/scraps/85c7ab42c44f6f

コンテナ内でのコードの修正

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