その他

RailsアプリをFargateへデプロイするときにハマった点(WebサーバーとRailsがソケット通信できない)

RailsのモノリスアプリをFargateへデプロイする際にハマった点について備忘録としてメモしていきたいと思います。WebサーバーにNginxを使っていて、RailsとNginxそれぞれがサービス上のコンテナの中で起動しているという状態とします。

ハマったエラー

どうしてもNginxとRailsが通信できずにハマっていました。

connect() to unix:/usr/src/web/tmp/unicorn.sock failed (2: No such file or directory) while connecting to upstream,

解決法

Nginxの設定ファイルが以下です。

upstream unicorn {
  server unix:/usr/src/web/tmp/unicorn.sock;
}

そして、Rails側でもUnicornをかませてUNIXドメインソケットを使って通信できる状態にしています。

listen "#{rails_root}/tmp/unicorn.sock"

きちんと設定しているのにも関わらずNo such file or directoryでNginx側がファイルを見つけられませんでした。

UNIXドメインソケットとは

こちらの記事が分かりやすかったです。

UNIX ドメインソケットではプロセス間通信にファイルシステムを利用する(拡張子 .sock という場合が多い)その為、 同じホストでのプロセス間通信 として利用される

ポイントはUNIXドメインソケットが同じホストでのプロセス間通信として利用されるという点です。NginxとRailsは異なるコンテナ(つまり異なるホスト)で動いているので、ファイルを見つけられなかったということになります。

対応としては、Volumeを使ってファイルの参照ができるので、タスク定義の中でNginx側のコンテナの編集でボリュームソースを設定できる項目があるので、そこでRailsコンテナの指定を行いました。
そして、Rails側のDockerfileでVolumeを作成する記載をしました。

VOLUME ["/usr/src/web"]

これで無事通信が成功しました。

ABOUT ME
酒井 駿
名古屋工業大学大学院卒業後、豊田合成(株)で品質管理を経験し、その後スタートアップ・マネーフォワードを経て、2024年11月に株式会社EGGHEAD創業。 製造業とエンジニアリング、両方の現場の知見を活かし、製造業における生成AIを活用した業務改善やシステム開発を支援します。