AWS

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
sakai
三重出身の28歳。前職はメーカーで働いていて、プログラミングスクールに通って未経験からWeb業界に転職しました。Railsをメインで使っていて、AWSも少しできます。音楽を聞くこととYoutubeを見るのが好きです。最近はへきトラ劇場にハマってます

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です