Amazon Linux 2023 & PostgreSQL16
学習用にAmazon Linux 2023 & PostgreSQL16の環境を構築してみる。
AWSの利用には料金がかかるので注意してください。
1. VPCの作成 & EC2の起動
1.1 VPCの作成
AWSの管理コンソールから、[VPC]を選択して、[VPCを作成]をクリックする。
[作成するリソース]から[VPCなど]を選択して、もろもろを設定していく。
| 項目 | 説明 |
|---|---|
| プロジェクト | 自動で共通の名前をつけてくれる。 例:psql16 |
| アベイラビリティゾーン (AZ) の数 | 学習用なので1つで十分 |
| パブリック・プライベートサブネットの数 | こちらも1つで十分 |
| NATゲートウェイ | 【注記】Zonalで1Az内 |
| VPCエンドポイント | なし |
【注記】NATゲートウェイは料金が発生するが、プライベートサブネットからインターネットに出るために必要
1.2 EC2の起動
[EC2]を選択して、[インスタンスを起動]を押す。
| 項目 | 説明 |
|---|---|
| 名前 | サーバーの名称。 例:psql16-ec2 |
| OSイメージ | Amazon Linux 2023を選択 |
| インスタンスタイプ | 料金が安いt3.microを利用 |
| キーペア | ログイン時に必要になる鍵 |
| ネットワーク設定 | 作成したVPC、private サブネットを選択 |
| セキュリティグループ | ひとまず作成しておく |
| ストレージ | 20GB |
上記の設定ができれば、[インスタンスを起動]する。
1.3 セキュリティグループ & 接続
2つ作成する。
・sgr-psql16-eic: アウトバウンドのみ 0.0.0.0/0
・sgr-psql16-ec2:インバウンドはSSH(22)でEC2のみ、アウトバウンドは 0.0.0.0/0
EC2への接続は、管理コンソールから[EC2]を選択して、先ほど作成した[psql16-ec2]を選択する。
[接続]を押して、[EC2 Instance Connect]を選択する。
[プライベート IP を使用して接続]を選択して、「EC2 Instance Connect エンドポイント」を選択して、[接続]する。
これで別のブラウザ画面が立ち上がってきて、Linux のサーバーに接続できている。
下記のコマンドを打って、NAME等が表示されれば成功である。
$cat /etc/os-release
NAME="Amazon Linux"
VERSION="2023"
ID="amzn"
・・・
外部に接続できているかの確認のコマンドは下記です。
$ curl -I https://google.com
2. PostgreSQL16インストール
2.1 インストール
コンソールで、下記コマンドを実行する。
$ sudo dnf install -y postgresql16-server postgresql16-contrib
結果の出力例
Last metadata expiration check: 22:28:42 ago on Sat Apr 18 12:12:24 2026.
Dependencies resolved.
========================================================================================================================
Package Architecture Version Repository Size
========================================================================================================================
Installing:
postgresql16-contrib x86_64 16.12-1.amzn2023.0.1 amazonlinux 953 k
postgresql16-server x86_64 16.12-1.amzn2023.0.1 amazonlinux 6.9 M
Installing dependencies:
libicu x86_64 67.1-7.amzn2023.0.4 amazonlinux 9.6 M
libxslt x86_64 1.1.43-1.amzn2023.0.3 amazonlinux 183 k
postgresql16 x86_64 16.12-1.amzn2023.0.1 amazonlinux 1.9 M
postgresql16-private-libs x86_64 16.12-1.amzn2023.0.1 amazonlinux 145 k
uuid x86_64 1.6.2-50.amzn2023.0.2 amazonlinux 58 k
Transaction Summary
(省略)
Installed:
libicu-67.1-7.amzn2023.0.4.x86_64 libxslt-1.1.43-1.amzn2023.0.3.x86_64
postgresql16-16.12-1.amzn2023.0.1.x86_64 postgresql16-contrib-16.12-1.amzn2023.0.1.x86_64
postgresql16-private-libs-16.12-1.amzn2023.0.1.x86_64 postgresql16-server-16.12-1.amzn2023.0.1.x86_64
uuid-1.6.2-50.amzn2023.0.2.x86_64
Complete!
インストールが終わったら下記のコマンドを実行して確認する。
$ rpm -qa | grep postgresql
PostgreSQL関連の文字列が表示されれば成功です。
2.2 データベースの初期化 & 起動
初期化はこのコマンドを実行する。
$ sudo postgresql-setup --initdb
サービスの有効化はこちら。
$ sudo systemctl enable postgresql
起動はこちらのコマンド。
$ sudo systemctl start postgresql
サービスが立ち上がっているのか確認はこちらのコマンド。
$ sudo systemctl status postgresql
起動結果の例
● postgresql.service - PostgreSQL database server
Loaded: loaded (/usr/lib/systemd/system/postgresql.service; enabled; preset: disabled)
Active: active (running) since Sun 2026-04-19 10:48:42 UTC; 10s ago
Process: 27368 ExecStartPre=/usr/libexec/postgresql-check-db-dir postgresql (code=exited, status=0/SUCCESS)
Main PID: 27370 (postgres)
Tasks: 7 (limit: 1014)
Memory: 17.6M
CPU: 45ms
CGroup: /system.slice/postgresql.service
├─27370 /usr/bin/postgres -D /var/lib/pgsql/data
├─27371 "postgres: logger "
├─27372 "postgres: checkpointer "
├─27373 "postgres: background writer "
├─27375 "postgres: walwriter "
├─27376 "postgres: autovacuum launcher "
└─27377 "postgres: logical replication launcher "
「q」で状態表示から抜け出せます。
下記コマンドでインストールしたPostgreSQLのバージョンを表示可能です。
sudo -u postgres psql -c "SELECT version();"
2.3 クラスタ(物理的なデータ保存領域)の再作成
初期構築時に注意すべきポイントもあるようなので、クラスタを再作成してみます。
# サービス停止
$ sudo systemctl stop postgresql
# Active: inactive (dead) になっていればOK
$ sudo systemctl status postgresql
○ postgresql.service - PostgreSQL database server
Loaded: loaded (/usr/lib/systemd/system/postgresql.service; enabled; preset: disabled)
Active: inactive (dead) since Tue 2026-04-21 12:38:22 UTC; 25min ago
(省略)
# 確認プロンプトに y で実行
$ sudo rm -rI /var/lib/pgsql/data
# data ディレクトリが消えていればOK
$ sudo ls /var/lib/pgsql/
# もろもろオプションを設定して再作成(*パスワード設定します)
$ sudo -u postgres /usr/bin/initdb \
-D /var/lib/pgsql/data \
-E UTF8 \
--locale=C \
-A scram-sha-256 \
--data-checksums \
-W
下記メッセージが表示されるので、パスワードを設定します。
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.
The database cluster will be initialized with locale "C".
The default text search configuration will be set to "english".
Data page checksums are enabled.
Enter new superuser password:
もう一度パスワードを入力します。
Enter it again:
creating directory /var/lib/pgsql/data ... ok
(省略)
syncing data to disk ... ok
| オプション | 説明 | 出典 |
|---|---|---|
| --locale=C | C/POSIX 以外のロケールを使うと文字処理が遅くなり、通常のインデックスが LIKE で使えなくなる。必要な場合のみロケールを使うべきである。 | https://www.postgresql.org/docs/current/locale.html |
| -A scram-sha-256 | MD5 ハッシュアルゴリズムは現在では安全とは言えないため、md5 から scram-sha-256 への移行が推奨される。移行手順は password_encryption = 'scram-sha-256' を postgresql.conf に設定し、ユーザーがパスワードを再設定した上で pg_hba.conf の認証方式を scram-sha-256 に変更する。 | https://www.postgresql.org/docs/current/auth-password.html |
| --data-checksums | データページはチェックサムで保護され、ページ書き込み時に更新・読み込み時に検証される。チェックサムはクラスタ全体で有効/無効を切り替えるもので、データベースやテーブル単位の指定はできない。 | https://www.postgresql.org/docs/16/checksums.html |
$ sudo systemctl start postgresql
# ロケールの確認方法
$ sudo -u postgres psql -c "SHOW lc_messages;"
Password for user postgres:
lc_messages
-------------
C
(1 row)
# 認証方式
$ sudo -u postgres psql -c "SELECT usename, passwd FROM pg_shadow LIMIT 5;"
Password for user postgres:
usename | passwd
-------------------------------------
postgres | SCRAM-SHA-256$4096:XXXXXXXXXX
(1 row)
# ロケール設定
$ sudo -u postgres psql -c "SHOW data_checksums;"
Password for user postgres:
data_checksums
----------------
on
(1 row)
2.4 次回に向けて
「postgresql16-contrib」をインストールした目的です。
「追加モジュール(拡張機能)」をまとめたパッケージとのこと。
| 項目 | 説明 |
|---|---|
| 拡張機能の提供 | 全文検索、暗号化、統計情報の収集など、特定の用途に特化した機能を追加します。 |
| 物理的な実体 | 通常、/usr/pgsql-16/share/extension/ などのディレクトリに .sql や .control ファイルとしてインストールされます。 |
| 有効化の方法 | パッケージをインストールしただけでは使えません。データベースに接続し、SQLで CREATE EXTENSION 拡張機能名; を実行することで初めて使用可能になります。 |
そのなかでもpgbenchを利用してみたいと思います。
なお、コマンド実行ごとにパスワード入力が求められます。
$ sudo -u postgres createdb pgbench_test
$ sudo -u postgres pgbench -i -s 1 pgbench_test
dropping old tables...
NOTICE: table "pgbench_accounts" does not exist, skipping
NOTICE: table "pgbench_branches" does not exist, skipping
NOTICE: table "pgbench_history" does not exist, skipping
NOTICE: table "pgbench_tellers" does not exist, skipping
creating tables...
generating data (client-side)...
100000 of 100000 tuples (100%) done (elapsed 0.11 s, remaining 0.00 s)
vacuuming...
creating primary keys...
done in 0.23 s (drop tables 0.00 s, create tables 0.01 s, client-side generate 0.13 s, vacuum 0.05 s, primary keys 0.05 s).
下記コマンドで結果が表示されれば導入完了です。
$ sudo -u postgres psql -d pgbench_test -c "\dt"
List of relations
Schema | Name | Type | Owner
----------------------------------------------
public | pgbench_accounts | table | postgres
public | pgbench_branches | table | postgres
public | pgbench_history | table | postgres
public | pgbench_tellers | table | postgres
(4 rows)
次回以降は、このpgbenchを使って色々勉強していきます。
おまけ
# タイムゾーンを変更
$ sudo timedatectl set-timezone Asia/Tokyo
# 確認
$ timedatectl
# cron をインストール
$ sudo dnf install cronie -y
# サービス起動
$ sudo systemctl start crond
# サービス自動起動
$ sudo systemctl enable crond
# 編集
$ sudo crontab -e
# viになるので、下記を深夜0時に終了を設定(viを Escを押下、:wq)
0 0 * * * /sbin/shutdown -h now
# 設定を確認
$ sudo crontab -l