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"]
これで無事通信が成功しました。