LinuxのログオンユーザーIDから直接PostgreSQLにアクセスする方法

## はじめに
先日、何年かぶりに自身のLinux検証環境にPostgreSQLをインストールしました。かなりご無沙汰だったため、ほとんど使い方を忘れてしまっていたので、下記リンク先のマニュアルを参考にチュートリアルを実施しました。ちなみにインストールしたPostgreSQLのバージョンは16.3です。

https://www.postgresql.org/docs/16/tutorial-start.html

チュートリアルを実施するなかで、いの一番に実施した方が後々便利になると感じたのは、LinuxのログオンユーザーIDから直接PostgreSQLにアクセスできるようにすることです。本記事では、その設定方法をご紹介します。

## データベースの設定
最初にデータベース・サーバーが稼働していることを確認します。
```
$ sudo systemctl status postgresql-16
[sudo] testuser のパスワード:
● postgresql-16.service - PostgreSQL 16 database server
     Loaded: loaded (/usr/lib/systemd/system/postgresql-16.service; enabled; preset: disabled)
     Active: active (running) since Sun 2024-05-26 17:23:52 JST; 26min ago
       Docs: https://www.postgresql.org/docs/16/static/
    Process: 1318 ExecStartPre=/usr/pgsql-16/bin/postgresql-16-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
   Main PID: 1337 (postgres)
      Tasks: 7 (limit: 22820)
     Memory: 66.3M
        CPU: 1.647s
     CGroup: /system.slice/postgresql-16.service
             tq1337 /usr/pgsql-16/bin/postgres -D /var/lib/pgsql/16/data/
             tq1389 "postgres: logger "
             tq1393 "postgres: checkpointer "
             tq1395 "postgres: background writer "
             tq1403 "postgres: walwriter "
             tq1404 "postgres: autovacuum launcher "
             mq1407 "postgres: logical replication launcher "

 5月 26 17:23:52 localhost.localdomain systemd[1]: Starting PostgreSQL 16 database server...
 5月 26 17:23:52 localhost.localdomain postgres[1337]: 2024-05-26 17:23:52.746 JST [1337] LOG:  ログ出力をログ収集プロセスにリダイレクトしています
 5月 26 17:23:52 localhost.localdomain postgres[1337]: 2024-05-26 17:23:52.746 JST [1337] ヒント:  ここからのログ出力はディレクトリ"log"に現れます。
 5月 26 17:23:52 localhost.localdomain systemd[1]: Started PostgreSQL 16 database server.
```
### データベースの作成
createdbコマンドでデータベースを作成します。
```
$ createdb mydb
```
PostgreSQLインストール直後の状態だと、下記のエラーが出力されて、データベースの作成に失敗します。
```
createdb: エラー: ソケット"/run/postgresql/.s.PGSQL.5432"のサーバーへの接続に失敗しました: FATAL:  ロール"testuser"は存在しません
```
これは、下記リンク先のドキュメントにも記載されていますが、PostgreSQLに接続可能なユーザーとして、現状Linuxにログオンしているtestuserという名前のユーザー(ロールとも言います)が定義されていないために発生します。

https://www.postgresql.org/docs/16/tutorial-createdb.html

PostgreSQLインストール直後は、「postgres」という名前のユーザーがデフォルトの接続可能なユーザーとして定義されているため、PostgreSQLへのアクセスにはこのユーザーを使用する必要があります。
```
# su postgres
bash-5.1$
```
:::note warn
ログオン中のtestuserから直接postgresユーザーにスイッチしようとすると、postgresユーザーのパスワードを聞かれてしまいます。その為、一旦rootにスイッチした後に、postgresユーザーに切り替えることにしています。
:::
postgresユーザーへスイッチ後、再度「createdb」コマンドでデータベースを作成します。(データベース名は「mydb」としています。)
```
bash-5.1$ createdb mydb
bash-5.1$
```
今度はエラーとならずに正常にデータベースを作成することができました。

### LinuxログオンユーザーIDをROLE登録
「psql」というユーティリティーを使用して、上記で作成したデータベースに接続します。
```
bash-5.1$ psql mydb
psql (16.3)
"help"でヘルプを表示します。

mydb=#
```
「mydb=#」の所にSQL文を入力していきます。ここでは、Linuxログオンユーザー名(testuser)をROLE名として設定するSQL文としています。ROLE名の後に「LOGIN」を付与することがポイントです。
```
mydb=# CREATE ROLE testuser LOGIN;
CREATE ROLE
```
CREATE ROLEという文言のみが返ってきたら、ROLE作成は完了です。ROLEの作成方法については、下記リンク先のドキュメントを参照ください。

https://www.postgresql.org/docs/16/database-roles.html

pg_rolesという名前のシステム・カタログに対してSELECT文を発行し、「testuser」という名前のROLEが出力されることを確認します。
```
mydb=# SELECT * FROM pg_roles;
           rolname           | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolconnlimit | rolpassword | rolvaliduntil | rolbypassrls | rolconfig |
oid
-----------------------------+----------+------------+---------------+-------------+-------------+----------------+--------------+-------------+---------------+--------------+-----------+--
-----
 postgres                    | t        | t          | t             | t           | t           | t              |           -1 | ********    |               | t            |           |
  10
：
：
(略)
：
：
 testuser                    | f        | t          | f             | f           | t           | f              |           -1 | ********    |               | f            |           | 1
6389
```
上記のSELECT文の出力結果から、問題なく「testuser」という名前のROLEが作成されていることが確認できます。これで作業は終了なので、データベース、及び、postgresユーザーからログオフします。

```
mydb=# exit
bash-5.1$ exit
```
### LinuxログオンユーザーIDでの接続確認
ログオンユーザーIDのシェルに戻ったことを確認後、「psql mydb」コマンドを実行します。
```
$ psql mydb
psql (16.3)
"help"でヘルプを表示します。

mydb=>
```
無事、ログオンユーザーIDでPostgreSQLのデータベースに接続できるようになりました。

## さいごに
本記事では、Linuxログオンユーザーから直接PostgreSQLのデータベースに接続できるようにするための方法をご紹介しました。必須の作業というわけではありませんが、毎度毎度「postgres」ユーザーに切り替えるのは手間ですし、時間が経ったら「postgres」ユーザーの存在自体忘却の彼方となっているかもしれません。。。
ですので、今後LinuxにPostgreSQLをインストールして使ってみようと思われた方は、本記事に記載の内容を参考にLinuxログオンユーザーから直接PostgreSQLにアクセスできる設定をされることをお奨めします。