先に結論
JSランタイムのGemのmini_racerが何故かAWS ECS(Fargate)の環境下でセグメンテーション違反を起こし、Rails全体をクラッシュさせていた。
mini_racerを使わずに、nodejsを使うことで回避した。
症状
- 特定のページでいきなりPumaが落ちる
- AWSのECS環境でのみ落ちて、ローカルだと再現しない
- Fargate(Dockerコンテナ)を利用
ログ
ログの最新はこのような記載…何が原因かもよくわからずにいきなりpumaが落ちていることが分かる。
2024-06-03T08:14:48.983Z 7fbb3194d000-7fbb3194e000 r--p 00029000 103:00 567812 /lib/x86_64-linux-gnu/ld-2.31.so
2024-06-03T08:14:48.983Z 7fbb3194e000-7fbb3194f000 rw-p 0002a000 103:00 567812 /lib/x86_64-linux-gnu/ld-2.31.so
2024-06-03T08:14:48.983Z 7fbb3194f000-7fbb31950000 rw-p 00000000 00:00 0
2024-06-03T08:14:48.983Z 7fff19abe000-7fff1a4bd000 rw-p 00000000 00:00 0 [stack]
2024-06-03T08:14:48.983Z 7fff1a55e000-7fff1a562000 r--p 00000000 00:00 0 [vvar]
2024-06-03T08:14:48.983Z 7fff1a562000-7fff1a564000 r-xp 00000000 00:00 0 [vdso]
2024-06-03T08:14:48.983Z ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
2024-06-03T08:14:49.857Z bin/start_server.sh: line 24: 38 Aborted (core dumped) RAILS_ENV=${RAILS_ENV} bundle exec pumactl -F config/puma.rb start
エラーログを相当遡ると遡ると、mini_racerのセグメンテーション違反で落ちていることが分かる。
2024-06-03T08:14:48.776Z /usr/local/bundle/gems/mini_racer-0.12.0/lib/mini_racer.rb:228: [BUG] Segmentation fault at 0x00007fbb2c828008
2024-06-03T08:14:48.776Z ruby 3.0.5p211 (2022-11-24 revision ba5cf0f7c5) [x86_64-linux]
2024-06-03T08:14:48.776Z -- Control frame information -----------------------------------------------
2024-06-03T08:14:48.776Z c:0146 p:---- s:0924 e:000923 CFUNC :eval_unsafe
2024-06-03T08:14:48.776Z c:0145 p:0010 s:0918 e:000917 BLOCK /usr/local/bundle/gems/mini_racer-0.12.0/lib/mini_racer.rb:228
2024-06-03T08:14:48.776Z c:0144 p:0010 s:0915 e:000914 METHOD /usr/local/bundle/gems/mini_racer-0.12.0/lib/mini_racer.rb:348
なるほど、なにかしらのJSが動くページで落ちていた様子。
対応
mini_racerの使用を取りやめ、nodejsをランタイムとして利用。
ExecJSが勝手にnodejsを認識してくれるため、特に設定変更せずに載せ替えが可能。
具体的には…
- Gemfileからmini_racerを削除
- Dockerコンテナ生成時に処理される、DockerFileでnodejsをインストールするコマンドを追記
例
RUN apt-get install -y nodejs
をして、再度コンテナを上げ直したら問題なく起動した。