はじめに
本記事は、RailsアプリをAWSにデプロイした際に発生する可能性のある
MySQLに繋がらないという事象に対する原因例を紹介します。
原因はかなり初歩的な原因でしたが、筆者はこのエラー原因が特定できずとても苦労したため、
今後同じエラーに遭遇した方の助けになれば幸いです。
開発環境
- Ruby 2.5.1
- Rails 5.2.4.4
- AWS(EC2, RDS)
- MySQL(RDS) 5.6.48
前提条件
- RailsアプリをEC2のWebサーバー上にgitクローン済み。
- 基本的な設定は完了済みで、rake db:create RAILS_ENV=productionのコマンドを実行する手前の状態。
- RDSのDBインスタンスを作成済み。
- Railsのdatabase.ymlは下記の内容です。
database.yml
default: &default
adapter: mysql2
encoding: utf8
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root
password:
socket: /tmp/mysql.sock
production:
<<: *default
database: データベース名
host: <%= ENV['DATABASE_HOST_PRODUCTION'] %>
username: <%= ENV['DATABASE_USER_NAME_PRODUCTION'] %>
password: <%= ENV['DATABASE_PASSWORD_PRODUCTION'] %>
エラー内容
以下のコマンドだとRDSのMySQLに繋がったのですが・・・・
[ec2-user@ip-10-0-1-10 アプリのディレクトリ]$ mysql -h RDSのエンドポイント -u root -P 3306 -p
以下のコマンドだと繋がらず、MySQLに繋がらないというエラーが出ました。
[ec2-user@ip-10-0-1-10 アプリのディレクトリ]$ rake db:create RAILS_ENV=production
Can't connect to MySQL server on '10.0.1.10' (111)
Couldn't create 'データベース名' database. Please check your configuration.
rake aborted!
Mysql2::Error::ConnectionError: Can't connect to MySQL server on '10.0.1.10' (111)
Tasks: TOP => db:create
(See full trace by running task with --trace)
原因/解決策
当初はホスト名の設定ができていなかったので、エンドポイントを環境変数に入れて修正したのですが、
mysqlコマンドだと繋がるのにrakeコマンドだと繋がらないという謎の現象が発生しました。
いろいろ調べたところ、MySQLのパスワードにパスワードに"#"が入っていることが原因でした。
YAMLファイルはコメントアウトの記法が#ということで、パスワードに"#"が入っているとコメントされてしまいます。
パスワードを変更したら無事rakeコマンドが通りました。
みなさんお気を付けください。
まとめ
MySQLのパスワードに"#'を含めるのは良くない。