schedule2019-05-14

psql FATA role "ec2-user" does not exist|Amazon Linux2にPostgreSQL10を入れたとき

Amazon Linux2にPostgreSQL10を入れたときpsqlコマンドは使えたが、操作しようとするとき下記のようなエラーが出た。

psql: FATAL:  role "ec2-user" does not exist

psql: FATAL:  Peer authentication failed for user "postgres"

環境

  • Amazon Linux2
  • postgres10

インストールとバージョンの確認は以下。 パッケージマネージャはyumではなくamazon-linux-extrasを利用した。

$ sudo amazon-linux-extras install postgres10
$ psql -V
psql (PostgreSQL) 10.4

現象

ec2-userで操作すると「ロールec2-userは存在しない」とエラーが出た。 psql -lはデータベースのリストを確認するコマンド。

[ec2-user@hostname ~]$ psql -l
psql: FATAL:  role "ec2-user" does not exist

そこで、psqlの初期ユーザーのpostgresで操作を試みた。 「ユーザー”postgres”のピア認証に失敗した」とエラーがでた。

[ec2-user@hostname ~]$ psql -l -U postgres
psql: FATAL:  Peer authentication failed for user "postgres"

またrootユーザーで試しても同様。

[ec2-user@hostname ~]$ sudo psql -l
psql: FATAL:  role "root" does not exist

[ec2-user@hostname ~]$ sudo psql -l -U postgres
psql: FATAL:  Peer authentication failed for user "postgres"

解決策

psqlの初期ユーザーではなく、実行ユーザーのpostgresで行う。

[ec2-user@hostname ~]$ sudo -u postgres psql -l
could not change directory to "/home/ec2-user": Permission denied
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(3 rows)

psqlの実行権限を変更しないといけない。

実行権限を修正

上記のエラーは設定によるものだった。 実行権限はpg_hba.confで設定できる。

# コピー
$ sudo cp /var/lib/pgsql/data/pg_hba.conf /var/lib/pgsql/data/pg_hba.conf.org

# 確認
$ sudo cat /var/lib/pgsql/data/pg_hba.conf
# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            ident
# IPv6 local connections:
host    all             all             ::1/128                 ident

ローカルからの接続のMETHODがpeerになっていた。 これは実行者のユーザー名とデータベースユーザー名が一致するか検査している。

METHODをtrustにして接続を無条件で許可するか、md5でパスワードを求めるようにか変更すると良い。

設定の詳細はドキュメントにある。