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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

AWS(Amazon Web Services)

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

Q&A

2回答

3964閲覧

Mysql2::Error::ConnectionError: が解決できない

K-Y0901

総合スコア0

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

AWS(Amazon Web Services)

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

0グッド

0クリップ

投稿2021/06/22 16:13

前提・実現したいこと

現在、Railsアプリケーションをデプロイしようとしています。
サーバー起動前の準備でEC2にログイン後、Railsアプリケーションのルートディレクトリに移動し、
1, bundle install --path vendor/bundle --without test development
2, bundle exec rails assets:precompile RAILS_ENV=production
のコマンドを打ちました。
その後、
bundle exec rails db:migrate RAILS_ENV=production
を打つと
Mysql2::Error::ConnectionError: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
のエラーが表示されてしまいます

発生している問題・エラーメッセージ

Mysql2::Error::ConnectionError: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

該当のソースコード

.envファイル DB_USERNAME="root" DB_PASSWORD="パスワード" DB_HOST="rds-mysql-server.ctdixudbmqmr.ap-northeast-1.rds.amazonaws.com" DB_DATABASE="Bookers2"
datebase.yml 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'] %>
### 試したこと datebase.yml に socket: /var/lib/mysql/mysql.sock の記述を追加しましたが現状は変わりませんでした また、EC2からは普通にRDSにログインできるため、ユーザ名・パスワード・エンドポイント名・アプリケーション名の記述は正しいと考えられます ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

可能性として、データーベース接続設定用のファイル名を間違えていませんでしょうか?

(誤)datebase.yml -> (正) database.yml

設定内容自体は正しそうですが、ファイル名が違っていると、デフォルトの設定(socket接続)を試みる気がします。
あと、.env の内容は本当に使っているデーターベースのURLやパスワードは書かないほうが良いかと思います。

投稿2021/06/27 14:49

編集2021/06/29 23:45
suama

総合スコア1997

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

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

0

RDSに接続しようとしているのだから、ローカルのソケットファイルを接続情報に設定しているとおかしなことになると思います。
datebase.ymlではproductionのところしか記載してませんが、defaultのところでソケットファイルの設定を記載していませんか?

投稿2021/06/22 16:22

yu_1985

総合スコア7447

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

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

K-Y0901

2021/06/22 16:37

# SQLite version 3.x # gem install sqlite3 # # Ensure the SQLite 3 gem is defined in your Gemfile # gem 'sqlite3' # default: &default adapter: sqlite3 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> timeout: 5000 development: <<: *default database: db/development.sqlite3 # Warning: The database defined as "test" will be erased and # re-generated from your development database when you run "rake". # Do not set this db to the same as development or production. test: <<: *default database: db/test.sqlite3 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'] %> こちら長くなりましたがdatebase.yml の記述になります どちらを修正するべきでしょうか?
yu_1985

2021/06/22 16:52

そこが原因かはわかりませんが、productionだけmysqlでそれ以外はsqliteを使っているのなら、設定のバッティングを防ぐためにdefaultを引き継がずにproductionは独立に設定したほうが良さそうです。 productionのところから <<: *default を消してください。
K-Y0901

2021/06/23 03:21

<<: *defaultの記述を消しても同じ Mysql2::Error::ConnectionError: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) のエラーが出てしまいます、、、
yu_1985

2021/06/23 03:27

host: にRDSのホスト名が入るはずなのでローカルには接続しないはずですが、何らかの原因でローカルに接続しようとしてしまっているように思えますね。 環境変数はきちんと読み込めていますか?
K-Y0901

2021/06/23 04:26

ここで記述するべき環境変数は、RDSで構築したMySQLへEC2から接続するためのものと同じものであるという認識なのですがそちらはあっていますでしょうか? もしそうであればこの環境変数に問題はないと思います
yu_1985

2021/06/23 06:38

それはそうですが、その環境変数が実際にちゃんと読み込めているか、という話です。rails consoleとかで確認してみてください。
K-Y0901

2021/06/23 16:32

何度も申し訳ありません rails console での確認は具体的にどのようなコマンドを打てばよろしいでしょうか? ターミナルでrails c を打ち、試しにDB_USERNAMEと入力したところ、NameError (uninitialized constant DB_USERNAME)と表示されました
yu_1985

2021/06/23 17:03

単にENVと打てば読み込んでる環境変数を全部表示できるはずです。 個別の変数を見るにはENV['変数名'] のような感じかなと。 ちゃんとRails_ENV=productionで実行するのをお忘れなく。
K-Y0901

2021/06/24 08:53

コンソールで確認したところうまく読み込めているようです ENV['変数名']でもそれぞれDB_USERNAME、DB_PASSWORD、DB_HOST、DB_DATABASEを打ったところきちんと値が表示されました 何が原因なのでしょうか?
K-Y0901

2021/06/24 12:52

.envで記述したDB_DATABASEの値とcat config/database.ymlで表示されたdatabaseの値(db/production.sqlite3)が異なるのは正しいでしょうか?
yu_1985

2021/06/24 15:23

貼っていただいたdatabase,ymlにはそのような記載はないように見えますが、別のファイルを貼ったということでしょうか? 貼ったのは一体どのファイルの設定ですか?
K-Y0901

2021/06/24 16:07

おっしゃる通りdatabase,ymlにはそのような記載はありません しかし送っていただいた記事にあるcat config/database.ymlをEC2にログイン状態で打つとDB_DATABASEやDB_HOSTに具体的な値が挿入された状態で表示されました 中には.envで定義した値と同じものもあるのですがDB_DATABASEだけ違う値が表示されています これは何か関係がありますでしょうか? また、DB回りで余計な環境変数が設定されてないかの確認はどのように行えば良いでしょうか? どのような値が表示されていれば正しいのかわかりません
yu_1985

2021/06/24 18:57 編集

ん、まさかローカル(SSH接続元の自分のPC)のソースだけ変更してEC2上のソースに反映していないのですか? それであればEC2上での挙動が変わらないのは当然です。EC2上のソースに更新を反映してください。
K-Y0901

2021/06/25 02:27

"EC2上のソースに更新を反映" とはcloud9上で変更後add,commit,pushをするということでしょうか? それであれば変更後毎回しております
yu_1985

2021/06/25 02:35

どのような環境で開発してどのような環境で動かしているんでしょうか。 git pushして反映されるのはリポジトリ上にだけです。 cloud9とは別のEC2で動かしているなら、自動的にデプロイされる仕組みを作っていない限りpushしただけでは反映されません。
K-Y0901

2021/06/25 03:05

申し訳ありません。自分も今勉強中でカリキュラムに沿って進めているので曖昧な部分はあるのですが、AWS上で開発・操作しております.cloud9で編集し、ssh -i ~/.ssh/practice-aws.pem ec2-user@xx.xx.xx.xx のコマンドを打ってEC2にログインするという流れで開発をしております
yu_1985

2021/06/25 03:24

cloud9で編集したソースはどうやってEC2上に反映していますか? 前述の通り、特に設定をしていなければリポジトリにpushしただけでは反映されません。 EC2上で動かすというのなら、編集したソースを何らかの形でEC2上に反映する必要があります。 そもそもですが、既にEC2上に置いてあるソースはどうやって反映したのでしょうか? その時のやり方を見ながらやってみてください。
K-Y0901

2021/06/25 15:57

まずCloud9から秘密鍵をEC2サーバーに送るためcloud9上で scp -i ~/.ssh/practice-aws.pem ~/.ssh/id_rsa ec2-user@IPアドレス:.ssh/id_rsa GitHubからアプリケーションを取得するためEC2で git clone GitHubのリポジトリのURL master.keyをアップロードするためcloud9で scp -i ~/.ssh/practice-aws.pem config/master.key ec2-user@IPアドレス:GitHubのリポジトリ名/config .envをアップロードするため scp -i ~/.ssh/practice-aws.pem .env ec2-user@IPアドレス:GitHubのリポジトリ名/ これらのコマンドを打ったあとサーバー起動前の準備を行うためEC2で $ cd アプリケーション名 $ bundle install --path vendor/bundle --without test development $ bundle exec rails assets:precompile RAILS_ENV=production $ bundle exec rails db:migrate RAILS_ENV=production を打ったところ上記のエラーが出ました ここまでで何か誤りはありますでしょうか?
yu_1985

2021/06/26 05:56

そこまではいいですが、初回にgit cloneした状態のままでcloud9側での更新分を取り込んでいないのではないでしょうか。 Railsのルートディレクトリでgit pullしてみてください。
K-Y0901

2021/06/26 10:56

git pull 後うまくbundle exec rails db:migrate RAILS_ENV=productionのコマンドが動作しました。 ありがとうございます。 ですが、アプリケーションサーバー(Puma)を起動し動作確認をしたところ、We're sorry, but something went wrong.と表示されてしまいました。 $ sudo tail -f log/production.logでRailsのエラーログを確認したところ同様に Mysql2::Error::ConnectionError (Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)): と vendor/bundle/ruby/2.6.0/gems/mysql2-0.5.3/lib/mysql2/client.rb:90:in `connect' が表示されております。こちらはどのような原因が考えられますでしょうか
yu_1985

2021/06/27 14:49

それは本当にその事象と関連するエラーなんでしょうか? ログは過去に発生したものも当然残っているので、 (DBへの接続エラーが出るならそもそも起動に失敗する可能性が高いため、私見としては多分そのエラーはDBの接続とは関係ありません) そしてDBの接続関係がないのであればこの質問の事象とは別の事象です。 正直情報が少なすぎて何も言えません。 ログの抜粋箇所がエラーと関係あるかどうかが不明なので、まずは事象が発生した時にどのようなログが出るかを確認し、切り分けを行ってください。 その上でこの質問と関係ない事象であれば別の質問をしてください。 繰り返しますが「きちんと切り分けを行った上で」必要であれば必要な情報とともに質問してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問