質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

2回答

2375閲覧

Dockerで開発したRailsコンテナ, NginxをAWS EC2にデプロイしてRDS MySQLに接続したい。

taig

総合スコア4

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

1クリップ

投稿2021/12/10 05:27

編集2021/12/10 06:32

Dockerで開発したappコンテナ(railsアプリケーション)と、webコンテナ(Nginx)をAWS EC2にデプロイしてRDS MySQLに接続したいと考えています。

以下のリンクを参考にして、AWSの設定や、Dockerでの開発を行いました。
リンク

自身のローカルで動かした場合には正しく動いていたのですが、AWSにデプロイする作業のときに上手く動かなかったため、質問させていただきます.

.env等gitignoreに含まれるファイルの転送やDBの作成、migrateを行ったあと、
http://ipアドレス にアクセスしたところ、ERR_CONNECTION_TIMED_OUTとなってしまいます。

EC2からRDSのMySQLに接続したところ、テーブルは作成されていたため、問題ないと考えています。
また、webコンテナのログを確認したところ、アクセスログはついているため、
外部 → webコンテナ 問題なし
webコンテナ → appコンテナ の部分で問題が発生しているような気がします。

解決方法について、ご教示いただけますと幸いです。
宜しくお願い致します。

問題がありそうなファイルについては以下のようになっています。

#nginx.conf # プロキシ先の指定 # Nginxが受け取ったリクエストをバックエンドのpumaに送信 upstream myapp { # ソケット通信したいのでpuma.sockを指定 server unix:///myapp/tmp/sockets/puma.sock; } server { listen 80; # ドメインもしくはIPを指定 ローカル server_name IPアドレス;  #server_name localhost; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; # ドキュメントルートの指定 root /myapp/public; client_max_body_size 100m; error_page 404 /404.html; error_page 505 502 503 504 /500.html; try_files $uri/index.html $uri @myapp; keepalive_timeout 5; # リバースプロキシ関連の設定 location @myapp { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_pass http://myapp; } }
#puma.rb threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }.to_i threads threads_count, threads_count # port ENV.fetch("PORT") { 3000 } environment ENV.fetch("RAILS_ENV") { "development" } plugin :tmp_restart app_root = File.expand_path("../..", __FILE__) bind "unix://#{app_root}/tmp/sockets/puma.sock" stdout_redirect "#{app_root}/log/puma.stdout.log", "#{app_root}/log/puma.stderr.log", true
#database.yml default: &default adapter: mysql2 encoding: utf8 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> # PasswordとUsernameはdocker-compose.ymlと合わせます username: root password: password host: db development: <<: *default database: myapp_development test: <<: *default database: myapp_test production: <<: *default database: <%= ENV['DB_DATABASE'] %> adapter: mysql2 encoding: utf8mb4 charset: utf8mb4 collation: utf8mb4_general_ci host: <%= ENV['DB_HOST'] %> username: <%= ENV['DB_USERNAME'] %> password: <%= ENV['DB_PASSWORD'] %>

Dockerfile

1FROM ruby:2.7.1 2 3# リポジトリを更新し依存モジュールをインストール 4RUN apt-get update -qq && \ 5 apt-get install -y build-essential \ 6 nodejs 7 8# yarnパッケージ管理ツールインストール 9RUN apt-get update && apt-get install -y curl apt-transport-https wget && \ 10 curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \ 11 echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \ 12 apt-get update && apt-get install -y yarn 13# Node.jsをインストール 14RUN curl -sL https://deb.nodesource.com/setup_14.x | bash - && \ 15 apt-get install -y nodejs 16 17# ルート直下にwebappという名前で作業ディレクトリを作成(コンテナ内のアプリケーションディレクトリ) 18RUN mkdir /myapp 19WORKDIR /myapp 20 21# ホストのGemfileとGemfile.lockをコンテナにコピー 22ADD Gemfile /myapp/Gemfile 23ADD Gemfile.lock /myapp/Gemfile.lock 24 25# bundle installの実行 26RUN gem install bundler 27RUN bundle install 28# RUN bundle update 29 30# ホストのアプリケーションディレクトリ内をすべてコンテナにコピー 31ADD . /myapp 32 33# puma.sockを配置するディレクトリを作成 34RUN mkdir -p tmp/sockets

Gemfile

1 2source 'https://rubygems.org' 3git_source(:github) { |repo| "https://github.com/#{repo}.git" } 4 5gem 'rails', '6.0.3' 6gem 'mysql2' 7gem 'aws-sdk-s3', '1.46.0', require: false 8gem 'image_processing', '1.9.3' 9gem 'mini_magick', '4.9.5' 10gem 'active_storage_validations', '0.8.2' 11gem 'bcrypt', '3.1.13' 12gem 'faker', '2.1.2' 13gem 'will_paginate', '3.1.8' 14gem 'bootstrap-will_paginate', '1.0.0' 15gem 'bootstrap-sass', '3.4.1' 16gem 'puma', '4.3.6' 17gem 'sassc', '2.1.0' 18gem 'sass-rails', '6' 19gem 'webpacker', '4.0.7' 20gem 'turbolinks', '5.2.0' 21gem 'jbuilder', '2.9.1' 22gem 'bootsnap', '1.4.5', require: false 23#API_KEYを環境変数として管理する(Keyを外部流出させないための措置) 24gem 'dotenv-rails' 25#アプリケーション内でHTTPリクエストを投げたい場合に使うクラス 26gem 'httpclient' 27 28group :development, :test do 29 gem 'sqlite3', '1.4.1' 30 gem 'byebug', '11.0.1', platforms: [:mri, :mingw, :x64_mingw] 31end 32 33group :development do 34 gem 'web-console', '4.0.1' 35 gem 'listen', '3.1.5' 36 gem 'spring', '2.1.0' 37 gem 'spring-watcher-listen', '2.0.1' 38end 39 40 41group :production do 42end

以下、タイムアウト時の画面
タイムアウト時の画面

# docker-compose.yml version: '3' services: app: build: context: . # ローカルと本番の切り替え command: bundle exec puma -C config/puma.rb -e production # command: bundle exec puma -C config/puma.rb # ======================== volumes: - .:/myapp - public-data:/myapp/public - tmp-data:/myapp/tmp - log-data:/myapp/log networks: - myapp-network # ローカルの場合はコメントアウトを解除 # depends_on: # - db # db: # image: mysql:5.7 # environment: # MYSQL_ROOT_PASSWORD: password # MYSQL_USER: user # MYSQL_PASSWORD: password # MYSQL_DATABASE: myapp_development # volumes: # - db-data:/var/lib/mysql # networks: # - myapp-network # ================================= web: build: context: ./nginx_docker volumes: - public-data:/myapp/public - tmp-data:/myapp/tmp ports: - 80:80 depends_on: - app networks: - myapp-network volumes: public-data: tmp-data: log-data: db-data: networks: myapp-network: external: true

以下、EC2のセキュリティグループ
イメージ説明

EC2にSSHで接続し、docker logs myapp_web_1でログを確認したところ、以下のようになるため、Nginxまでは到達しているような気がしているのですが、どうでしょうか。
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yu_1985

2021/12/10 06:00

タイムアウトってことはそもそもEC2にリクエストが届いていないのでは、と思うのですが、どこでタイムアウトになってますか? タイムアウトが出た画面のスクリーンショットを貼ってください。 また、docker-compose.ymlの内容とEC2のセキュリティグループの設定も貼ってください。
taig

2021/12/10 06:33

タイムアウトが出た画面、 docker-compose.ymlの内容、 EC2のセキュリティグループの設定 を追記致しました。 ご確認していただけると幸いです。 よろしくお願いいたします。
yu_1985

2021/12/10 06:40

全部301になってますけど、もしかしてrailsの設定でforce_sslを設定してたりしませんか? それかnginxでやってるかですが そのあたりの設定はどうなってますかね
taig

2021/12/10 06:58 編集

production.rbのforce sslがtrueとなっており、先程falseに変更して確認してみたところ、無事解決することができました。 ありがとうございます。 先程のご指摘で解決することでき、ベストアンサーにさせていただきたいので、再度回答に返信していただくことは可能でしょうか。 また、もしよろしければ、このforce sslがtrueであることによって、どのような問題があったのか、教えていただくことは可能でしょうか。 宜しくお願い致します。
yu_1985

2021/12/10 07:02

回答にまとめて書きます
guest

回答2

0

ベストアンサー

質問欄のやり取りのまとめですが、直接的な原因はRailsでforce_sslを有効化していたことです。

今回、EC2ではセキュリティグループで443番ポートを許可していないので、80番ポートに届いたリクエストをRailsが443番ポートにリダイレクトしてしまい、接続できずにタイムアウトになっていたものと思われます。

ちなみにこの状態で443番ポートを許可してもサーバ側に443番ポートでListenしているものがなにもないのでどのみち接続はできません。

個人的にはフレームワークにリダイレクトさせるのは混乱の元なのでやめたほうが良いと思います。
アプリケーションにはアプリケーションとしての処理だけをさせたほうがシンプルですね。
nginxを使っているならnginxにリダイレクトさせればいいですし、もしALBを使ってるならALBにリダイレクトさせればいいです。

投稿2021/12/10 07:09

yu_1985

総合スコア7447

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taig

2021/12/10 07:23

本当に困っていた問題だったので、解決して頂き、ありがとうございました。 また、ご丁寧に解説して頂き、ありがとうございます。
guest

0

ERR_CONNECTION_TIMED_OUT

サーバーへ接続できないようで、DNS、ALBなどの設定は大丈夫ですか?
nginxまでアクセスできたら、nginxのログ出るので、多分nginxまで到着していない気がします。

全体像を掴めるために、AWSシステム構成図を自分で書いて、一つずづ確認すれば問題特定できるはずです。

投稿2021/12/10 06:04

heroyct

総合スコア434

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問