ローカルマシンから EC2 の PostgreSQL へ接続する

ローカルマシンから EC2 の PostgreSQL へ接続する

2026.02.10

本ブログでは、EC2(AL2023)の PostgreSQL に対し、自分のローカル PC からリモート接続してみたいと思います。

内容としては以下ブログの続きの内容になります。
https://dev.classmethod.jp/articles/connecting-to-local-postgresql-with-password/

なお、EC2(AL2023) に PostgreSQL をインストールする方法については下記ブログを参照ください。
https://dev.classmethod.jp/articles/installing-postgresql-on-ec2-al2023/

本ブログでやることは以下です。

  • listen_addresses の変更
  • pga_hba.conf の変更
  • EC2 の セキュリティグループの修正
  • ローカル PC からの接続テスト

やってみた

EC2 にアクセスし、PostgreSQL サーバーが起動しているか確認
Active: active (running) なので OK。もし起動していなければ sudo systemctl start postgresql を実行します。

[ec2-user@ip-10-0-11-35 ~]$ sudo systemctl status postgresql
● postgresql.service - PostgreSQL database server
...
     Active: active (running) since Tue 2026-02-03 00:56:53 UTC; 7s ago
...

listen_addresses の変更

前提として listen_addresses とは、PostgreSQL サーバーがホスト(今回で言うと EC2 インスタンス)のどのネットワークインターフェースからの接続を受け付けるのかを決める設定です。ドキュメントは以下です。

listen_addresses (string)
クライアントアプリケーションからの接続をサーバが監視するTCP/IPアドレスを指定します。
...
listen_addressesは接続要求を受け付けるインタフェースを制御します。

https://www.postgresql.jp/document/17/html/runtime-config-connection.html

listen_addresses には PostgreSQL サーバーが稼働しているホストのネットワークインタフェースを指定します。以下の OSS-DB の例題の説明も読むとわかりやすいです。また、本ブログにて後述のおまけの部分で listen_addresses を EC2 のプライベート IP を指定した上での動作確認もしているので理解の助けになれば幸いです。

PostgreSQLサーバはlisten_addressesで指定したネットワークインタフェース上のportで指定したポート番号への接続を監視します。ネットワークインタフェースとしては自ホストのホスト名あるいはIPアドレスを指定しますが、* を指定すると利用可能なすべてのインタフェースを監視しますので、通常は listen_addresses = '*' と指定すれば良いです。
複数のネットワークインタフェースを持ち、そのうちの特定のインタフェースでの接続のみを許可したい場合は、そのインタフェースの名前またはIPアドレスを指定します。

https://oss-db.jp/sample/silver_management_06/118_211006

それでは、実際に設定していきます。
まず現在の listen_addresses の内容を確認
値が localhost なので、今現在は EC2 内からの接続しか受け入れられない状態です。

listen_addresses の値の確認
[ec2-user@ip-10-0-11-35 ~]$ psql -U postgres -d postgres
Password for user postgres: 
psql (17.7)
Type "help" for help.

postgres=# SHOW listen_addresses;
 listen_addresses 
------------------
 localhost
(1 row)

listen_addresses の値は、postgresql.conf ファイルで設定されているので現在の内容を確認します。
確認すると、以下のように #listen_addresses = 'localhost' となっています。

postgresql.conf ファイルの設定確認
[ec2-user@ip-10-0-11-35 ~]$ sudo cat /var/lib/pgsql/data/postgresql.conf

...

# - Connection Settings -

#listen_addresses = 'localhost'		# what IP address(es) to listen on;
                   					# comma-separated list of addresses;
					                # defaults to 'localhost'; use '*' for all
                 					# (change requires restart)
...
上記の日本語訳
#listen_addresses = 'localhost'	 # どのIPアドレスでリッスンするか;
                                 # カンマ区切りのアドレスリスト;
                                 # デフォルトは 'localhost'; すべての場合は '*' を使用
                                 # (変更には再起動が必要)

設定ファイルである postgresql.confでは、 "#" から始まる行はコメント行となりますが、設定値がコメントされている場合はデフォルト値が使用されるので、現在は先に確認した通り "localhost" が値として設定されている状態です。

listen_addresses 設定を変更します。今回は、特定のインタフェースではなく、利用可能な全てのインタフェースからの接続を受け付けたいので、値は * とします。その上で、設定ファイルのコメント文にある通り、変更の反映には PostgreSQL サーバーの再起動が必要なので、そちらもやります。

listen_addresses の変更
# postgresql.conf のバックアップを取っておく
[ec2-user@ip-10-0-11-35 ~]$ sudo cp /var/lib/pgsql/data/postgresql.conf /var/lib/pgsql/data/postgresql.conf.backup

# 念の為 diff で両ファイルの差分を確認 -> 何も表示されないので完全一致、OK
[ec2-user@ip-10-0-11-35 ~]$ sudo diff /var/lib/pgsql/data/postgresql.conf /var/lib/pgsql/data/postgresql.conf.backup
(何も表示されない)

# vim で listen_addresses の値を変更
[ec2-user@ip-10-0-11-35 ~]$ sudo vi /var/lib/pgsql/data/postgresql.conf

# listen_addresses が変更されたか確認 -> OK
[ec2-user@ip-10-0-11-35 ~]$ sudo cat /var/lib/pgsql/data/postgresql.conf | grep "listen_addresses"
listen_addresses = '*'		# what IP address(es) to listen on;

# PostgreSQL サーバーの再起動
[ec2-user@ip-10-0-11-35 ~]$ sudo systemctl restart postgresql

# 設定値が変更されているか確認 -> OK
[ec2-user@ip-10-0-11-35 ~]$ psql -U postgres -d postgres
Password for user postgres: 
psql (17.7)
Type "help" for help.

postgres=# SHOW listen_addresses;
 listen_addresses 
------------------
 *
(1 row)

pg_hba.conf の設定を編集

前項にて、listen_addresses を変更し、サーバー側のネットワークインタフェース受け入れ体制を整えました。一方で、「どこからのクライアント接続を許可するのか」の設定はまだできていないので、pg_hba.conf にてそれを設定していきます。

現在の設定内容を確認
# 設定ファイルの編集前にバックアップ
[ec2-user@ip-10-0-11-35 ~]$ sudo cp /var/lib/pgsql/data/pg_hba.conf /var/lib/pgsql/data/pg_hba.conf.backup 

# 2つのファイルが同じか確認 -> 何も表示されないので完全一致。OK
[ec2-user@ip-10-0-11-35 ~]$ sudo diff /var/lib/pgsql/data/pg_hba.conf /var/lib/pgsql/data/pg_hba.conf.backup
(何も表示されない)

# 現在の設定内容を確認
[ec2-user@ip-10-0-11-35 ~]$ 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                                     md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            ident
# IPv6 local connections:
host    all             all             ::1/128                 ident
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     peer
host    replication     all             127.0.0.1/32            ident
host    replication     all             ::1/128                 ident

上記を見る限り現在は TYPEhost (TCP/IP 接続受け入れを示す) の設定はありますが、ADDRESS はいずれも IPv4, IPv6 のローカルループバックアドレスとなっており、外部環境からの接続を受け付ける設定はありません。なお、pg_hba.conf の各種設定については以下ドキュメントに記載があります。

host
このレコードは、TCP/IPを使用した接続に対応します。
...
address
このレコードに対応しているクライアントマシンのアドレス。

https://www.postgresql.jp/document/17/html/auth-pg-hba-conf.html

そのため、今回は外部環境 (自分のローカル PC) からの接続を受け付けたいので、設定ファイルの末尾に以下内容を追記します。

# IPv4 remote connections:
host    all             all             <ローカル PC の IP>/32               md5

設定ファイルを vim で編集し保存。内容が変更されているか確認

# 設定を変更
[ec2-user@ip-10-0-11-35 ~]$ sudo vi /var/lib/pgsql/data/pg_hba.conf

# 設定が変更されているか確認 -> 追記されているので OK
[ec2-user@ip-10-0-11-35 ~]$ 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                                     md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            ident

(略)

# IPv4 remote connections:
host    all             all             <ローカル PC の IP>/32             md5

pg_hba.conf ファイルを編集後、設定を反映させるために PostgreSQL サーバーをリロード

# 設定を再読み込み
[ec2-user@ip-10-0-11-35 ~]$ sudo systemctl reload postgresql

では、現時点で ローカルマシン から接続できるか確認します -> 1分ほど待ちましたがエラーで接続ができません。

リモート環境から実施
$ psql -h <EC2 パブリック IPv4> -U postgres -d postgres

psql: error: connection to server at "<EC2 パブリック IPv4>", port 5432 failed: Network is unreachable
	Is the server running on that host and accepting TCP/IP connections?

上記エラーになる原因は、EC2 インスタンスのセキュリティグループにて、ポート 5432 が開かれていないためです。
そのため、以下のように 5432 ポートのインバウンドルールを追加します。ソースはリモート環境がある マイ IP を設定しています。

スクリーンショット 2026-02-05 13.13.06

動作確認

listen_addreses および pg_hba.conf の設定、SG の修正が完了したので、再度動作確認をしていきます。
以下の通り、ローカルマシンから EC2(AL2023) の PostgreSQL サーバーに接続ができました。

リモート環境から実施
$ psql -h <EC2 パブリック IPv4> -U postgres -d postgres
Password for user postgres: 
psql (14.12 (Homebrew), server 17.7)
WARNING: psql major version 14, server major version 17.
         Some psql features might not work.
Type "help" for help.

postgres=# 

検証は以上です。

おまけ: listen_addresses に EC2 のプライベート IP を指定してみる

現在は listen_addresses* の状態

[ec2-user@ip-10-0-11-35 ~]$ psql -U postgres -d postgres -c 'SHOW listen_addresses'
Password for user postgres: 
 listen_addresses 
------------------
 *
(1 row)

値を EC2 のプライベート IP に変更

# vim で編集
[ec2-user@ip-10-0-11-35 ~]$ sudo vi /var/lib/pgsql/data/postgresql.conf

# 変更できたか確認。OK
[ec2-user@ip-10-0-11-35 ~]$ sudo cat /var/lib/pgsql/data/postgresql.conf | grep "listen_addresses"
listen_addresses = '10.0.11.35'	        # what IP address(es) to listen on;

# 設定読み込みのため PostgreSQL サーバーを再起動
[ec2-user@ip-10-0-11-35 ~]$ sudo systemctl restart postgresql

# 変更できたか確認 -> OK
[ec2-user@ip-10-0-11-35 ~]$ psql -U postgres -d postgres -c 'SHOW listen_addresses'
Password for user postgres: 
 listen_addresses 
------------------
 10.0.11.35
(1 row)

リモート環境から接続。接続できました。当たり前ですが listen_addresses は、サーバー側のネットワークインターフェースの IP を指定するものですね。理解できました。

リモート環境から実行
$ psql -h <EC2 パブリック IPv4> -U postgres -d postgres
Password for user postgres: 
psql (14.12 (Homebrew), server 17.7)
WARNING: psql major version 14, server major version 17.
         Some psql features might not work.
Type "help" for help.

postgres=# 

終わりに

今回は、自分のローカル PC から EC2 にインストールした PostgreSQL サーバーに接続してみました。設定自体はそんなに難しいものではなかったのですが、listen_addresses をずっとクライアントの IP アドレスを指定するものだと思い込んでいたので、そこの理解に苦しみました。
普段設定ファイルなどはなかなか触る機会が無いので、今回あれこれ触れてとても面白い検証でした。

本記事がどなたかのお役に立てば幸いです。お疲れ様でした。

参考情報

https://dev.classmethod.jp/articles/connecting-to-local-postgresql-with-password/
https://dev.classmethod.jp/articles/installing-postgresql-on-ec2-al2023/
https://www.postgresql.jp/document/17/html/runtime-config-connection.html
https://oss-db.jp/sample/silver_management_06/118_211006
https://www.postgresql.jp/document/17/html/auth-pg-hba-conf.html
https://teratail.com/questions/256499
https://www.conversion.co.jp/tecblog/20210126/

この記事をシェアする

FacebookHatena blogX

関連記事