実現したいこと
Rails + NginxのアプリをAWS Fargateでデプロイしたいです。
前提
AWSFargateを使用。
タスク定義(サービス)は1つで、その中にnginxコンテナとrailsコンテナ(puma)の2つを含んでいます。
サービス起動したところ、デプロイ自体は成功し、AWS上のコンテナも動いている。
しかし、いざアプリをパブリックIPでみようとしたら、nginxの502 Bad Gatewayの
エラーが出ました。
発生している問題・エラーメッセージ
ECSのサービスのログを見ると、nginxのコンテナで以下のエラー
connect() to unix:///myapp/tmp/sockets/puma.sock failed (2: No such file or directory) while connecting to upstream
さらにAWS上に存在するコンテナの中をECS Execを使って覗きました。
下記の通り、ディレクトリまでは存在を確認しましたが、肝心のpuma.sockがあるべきところになかったです。
nginxコンテナ
1#以下コマンドでnginxコンテナ内に入る。 2% aws ecs execute-command \ 3--cluster xxxx \ 4--task xxxxx \ 5--container nginx \ 6--interactive \ 7--command "bash" 8 9#lsコマンドでファイル一覧を表示。myappディレクトリ確認 10% ls 11・・・ myapp ・・・ 12 13#socketsディレクトリへ移動 14% cd myapp/tmp/sockets 15 16#lsコマンドでファイル一覧を表示。何も表示されなかった。 17sockets % ls 18sockets %
railsコンテナ
1#以下コマンドでrailsコンテナ内に入る。 2% aws ecs execute-command \ 3--cluster xxxx \ 4--task xxxxx \ 5--container rails \ 6--interactive \ 7--command "bash" 8 9#lsコマンドでファイル一覧を表示。tmpディレクトリ確認 10myapp % ls 11・・・ tmp ・・・ 12 13#socketsディレクトリへ移動 14myapp% cd tmp/sockets 15 16#lsコマンドでファイル一覧を表示。何も表示されなかった。 17tmp/sockets % ls 18tmp/sockets %
該当のソースコード
DockerFile(Rails)
1FROM ruby:3.1.1 2 3RUN apt-get update && apt-get install -y curl apt-transport-https wget && \ 4curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \ 5echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \ 6apt-get update && apt-get install -y yarn 7 8RUN apt-get update -qq && apt-get install -y build-essential yarn 9RUN apt-get install -y nodejs npm && npm install n -g && n 16 10 11RUN mkdir /myapp 12WORKDIR /myapp 13COPY Gemfile /myapp/Gemfile 14COPY Gemfile.lock /myapp/Gemfile.lock 15 16RUN bundle install 17COPY . /myapp 18 19RUN yarn install --check-files 20 21COPY entrypoint.sh /usr/bin/ 22RUN chmod +x /usr/bin/entrypoint.sh 23ENTRYPOINT ["sh", "entrypoint.sh"] 24 25RUN mkdir -p myapp/tmp/sockets 26 27# for aws 28VOLUME /myapp/public 29VOLUME /myapp/tmp 30 31#第一パターン→失敗 32#CMD /bin/sh -c "rm -f tmp/pids/server.pid && bundle exec puma -C config/puma.rb" 33 34EXPOSE 3000 35#第二パターン→失敗 36CMD bash -c "bundle exec puma -C config/puma.rb"
puma.rb
1worker_timeout 3600 if ENV.fetch("RAILS_ENV", "development") == "development" 2 3port ENV.fetch("PORT") { 3000 } 4 5environment ENV.fetch("RAILS_ENV") { "development" } 6 7pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" } 8 9app_root = File.expand_path("../..", __FILE__) 10bind "unix://#{app_root}/tmp/sockets/puma.sock" 11 12stdout_redirect "#{app_root}/log/puma.stdout.log", "#{app_root}/log/puma.stderr.log", true 13
nginx.conf
1upstream myapp { 2 # 転送先のurl 3 server unix:///myapp/tmp/sockets/puma.sock; 4} 5 6server { 7 listen 80; 8 server_name localhost ssagara-communication-board.com; 9 10 access_log /var/log/nginx/access.log; 11 error_log /var/log/nginx/error.log; 12 #ドキュメントルート 13 root /myapp/public; 14 15 client_max_body_size 100m; 16 error_page 404 /404.html; 17 error_page 505 502 503 504 /500.html; 18 try_files $uri/index.html $uri @myapp; 19 keepalive_timeout 5; 20 21 location @myapp { 22 proxy_set_header X-Real-IP $remote_addr; 23 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 24 proxy_set_header Host $http_host; 25 proxy_pass http://myapp; 26 } 27}
なお、バインドマウントについて。
railsのdockerFileの下部にVOLUMEで指定をしている、
またECSのタスク定義で、nginxのコンテナには以下の設定してます。
"volumesFrom": [ { "sourceContainer": "rails" } ],
試したこと
何回かDockerFile末尾のコマンドを作り替えつつ、動かしてますが今のところ進歩なしです。
なぜpuma.sockが作られないんでしょうか。
もしかして、ECSのタスク定義やサービスの設定側の問題の可能性はありますか?
今のところ、railsのdockerfileのコマンドのミスもしくはpuma.rbの記述ミスで、puma.sock作られないのかと考えてます。
ちなみに、ローカルでは下記docker-compose.ymlを使って正常に動作してます。
services: app: build: . command: bash -c "bundle exec puma -C config/puma.rb" volumes: - .:/myapp - public-data:/myapp/public - tmp-data:/myapp/tmp ports: - "3000:3000" depends_on: - db web: build: nginx volumes: - public-data:/myapp/public - tmp-data:/myapp/tmp ports: - "80:80" depends_on: - app

回答1件
あなたの回答
tips
プレビュー