Railsのプロジェクトをデプロイする際に、Railsの仕様を知らなくてハマってしまった話。
#本番環境
- Rails5.2.3
- Mysql5.7
- EC2 (Amazon Linux AMI 2018.03.0.20190611 x86_64 HVM gp2)
- RDS (エンジンバージョン 5.7.22)
(どんなこと書けばいいかわからない、、、)
#エラーメッセージ
bundle exec rails db:create RAILS_ENV="production"
すると下のようなエラーが出てしまう。
Caused by:
Mysql2::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.`cxngxxxxxxxx`.`ap-northeast-1`.`rds`.`amazonaws`.`com` DEFAULT CHARACTER SET `' at line 1
default: &default
encoding: utf8
adapter: mysql2
database: sochan-db
pool: 5
production:
<<: *default
host: <%= ENV['DATABASE_URL'] %>
port: 3306
username: root
password: <%= ENV['DATABASE_PASSWORD'] %>
DATABASE_URL = "sochan-db.cxngxxxxxxxx.ap-northeast-1.rds.amazonaws.com"
DATABASE_PASSWORD = "hogehoge"
database.yml
がおかしいのかなと思い見てみたけど、特に変なところはないような気がする。
そもそもRDSに繋がっているのかとhostが間違っていないか確認してみた。
[ec2-user@ip-xx-xxx]$ mysql -u root -p -h sochan-db.cxngxxxxxxxx.ap-northeast-1.rds.amazonaws.com
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 37
Server version: 5.7.22-log Source distribution
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
繋がるなー
どこが、間違っているのかさっぱりわからない。
ymlファイルにタブとか**#**が入ってたりするとうまく動かないことがあるらしいので、1行ずつ見ていったけど、特に変なところはなかった。
[ec2-user@ip-xx-xxx]$bundle exec unicorn_rails -c /var/www/rails/project/config/unicorn.conf.rb -D -E production
master failed to start, check stderr log for details
[ec2-user@ip-xx-xxx]$cat log/unicorn.log
I, [2019-07-23T20:02:48.830017 #22402] INFO -- : Refreshing Gem list
I, [2019-07-23T20:02:49.412202 #22402] INFO -- : unlinking existing socket=/var/www/rails/project/tmp/sockets/.unicorn.sock
I, [2019-07-23T20:02:49.412355 #22402] INFO -- : listening on addr=/var/www/rails/project/tmp/sockets/.unicorn.sock fd=9
E, [2019-07-23T20:02:49.470715 #22402] ERROR -- : Unknown database 'sochan-db.cxngxxxxxxxx.ap-northeast-1.rds.amazonaws.com' (ActiveRecord::NoDatabaseError)
unicornを起動しようとしても、databaseがないと言われる。でも、databaseが作れない。
hostとpasswordを直打ちにしてみても、同じエラーがでる。
#結論
エラーメッセージをよく見返すと、databaseの名前にhostが入っていた。
どうやら、 ENV['DATABASE_URL']
という環境変数はRailsの仕様で、database.ymlの内容に関わらず、優先されるらしい。
hostとpasswordを直打ちで試してみた際には、.env
を消していなかったので、database.yml
より優先されて読み込まれることで、databaseの名前がhostになるという現象が起こってしまった。
ENV['DATABASE_URL']
→ ENV['DATABASE_HOST']
に変えることにより無事解決。
#終わりに
rails database_urlとかで検索すると普通に出てきたけど、そこが間違っていると思っていなかったので、うまく検索で見つけられなかった。
ここは、絶対あってるってとこが間違ってました、、、