
ローカルマシンから EC2 の PostgreSQL へ接続する
本ブログでは、EC2(AL2023)の PostgreSQL に対し、自分のローカル PC からリモート接続してみたいと思います。
内容としては以下ブログの続きの内容になります。
なお、EC2(AL2023) に PostgreSQL をインストールする方法については下記ブログを参照ください。
本ブログでやることは以下です。
- 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アドレスを指定します。
それでは、実際に設定していきます。
まず現在の listen_addresses の内容を確認
値が localhost なので、今現在は EC2 内からの接続しか受け入れられない状態です。
[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' となっています。
[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 サーバーの再起動が必要なので、そちらもやります。
# 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
上記を見る限り現在は TYPE が host (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 を設定しています。

動作確認
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 アドレスを指定するものだと思い込んでいたので、そこの理解に苦しみました。
普段設定ファイルなどはなかなか触る機会が無いので、今回あれこれ触れてとても面白い検証でした。
本記事がどなたかのお役に立てば幸いです。お疲れ様でした。
参考情報







