はじめに
RailsでPostgreSQLを使おうとしたところ結構ハマったので解決方法まとめました
#環境
MacBook Air
Mojave 10.14.6
Cloud9
エラーの原因と解決方法
【エラー1】 FATAL: role "ec2-user" does not exist
PostgreSQL上に"ec2-user" というロールが存在しないという意味
※ロールとは権限をまとめたもの、ロールを設定しないとテーブルを作れなかったりする
本来はユーザーにロールを付与するものなので別物だが、上記のエラーはユーザーと
言い換えてもいいと思う
PostgreSQL上に"ec2-user"を作成してもいいが、PostgreSQLにはデフォルトで
"postgres"というロールが存在するのでそれを使うこともできる
そもそもログインユーザー名がローカルユーザー名になっているのはdatabase.ymlにusernameが抜けているからなので以下のようにusernameを追加すればOK
default: &default
adapter: postgresql
encoding: unicode
username: postgres
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
development:
<<: *default
database: sample_development
test:
<<: *default
database: sample_test
production:
<<: *default
database: sample_production
これで"ec2-user"ではなく"postgres"でアクセスされるようになるはずなのでロールが存在しないエラーは解決すると思う
【エラー2】 FATAL: Peer authentication failed for user "postgres"
Peer認証を使っているため
※Peer認証とはUNIXユーザーとPostgreSQL内のユーザー名を比較して同じのがあればOK
なのでそもそもPostgreSQL内にec2-userのユーザーを作っておけば上記のエラーが出ない
今回は"postgres"を使用しており、これはUNIXユーザー名ではないのでエラーが起きたと考えられる
sudo vim /var/lib/pgsql9/data/pg_hba.conf
でpg_hba.confを開き、「peer」を「trust」か「md5」にする
「trust」 条件なしで認証
「md5」 パスワードが必要
設定を変更したあとは、sudo service postgresql restartでPostgreSQLを再起動しないと変更内容が反映されないので注意
【エラー3】 fe_sendauth: no password supplied
database.ymlにpasswordが設定されていないと出てくる
【エラー4】 FATAL: password authentication failed for user "postgres"
database.ymlで指定しているpasswordが間違っていると出てくる
なお、PostgreSQLのデフォルトユーザーであるpostgresのパスワードはNULLになっておりどのパスワードでも解除できないので、あらかじめパスワードを設定しておく必要がある
さらにpg_hba.confの認証方法をmd5にしてしまうとパスワードを入力しないとそもそもPostgreSQLにアクセスできないのでパスワードを設定するときは一度peerかtrustにしておく