PostgreSQL データベース設定
idp-server のマルチテナント環境で必要なPostgreSQL設定の手順と動作確認方法について説明します。
1. 構築手順概要
データベースを構築するには、以下の順序で設定を行います。
┌─────────────────────────────────────────────────────────────────┐
│ 1.1 PostgreSQL設定 │
│ ───────────────────────────────────────────────────────────── │
│ • shared_preload_libraries に pg_cron を追加 │
│ • cron.database_name = 'postgres' を設定 │
│ • PostgreSQL再起動が必要 │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 1.2 DB_OWNER ユーザー作成 │
│ ───────────────────────────────────────────────────────────── │
│ • idp (DB_OWNER) - Flyway実行、pg_cronジョブ実行 │
│ ※ 拡張への権限付与に必要なため先に作成 │
└─────────────────────────────────── ──────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 1.3 拡張インストール・権限設定 │
│ ───────────────────────────────────────────────────────────── │
│ • pg_cron 拡張(postgres DB、クロスデータベースモード) │
│ • pg_partman 拡張(idpserver DB、partmanスキーマ) │
│ • idp ユーザーへの権限付与(cron, partman スキーマ) │
│ ※ Flywayが partman.create_parent() を使うため必須 │
└───────────────────────────────────────────── ────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 1.4 アプリケーションユーザー作成 │
│ ───────────────────────────────────────────────────────────── │
│ • idp_admin_user - 管理API用(BYPASSRLS) │
│ • idp_app_user - アプリケーション用(RLS適用) │
│ ※ Flyway前でも後でもOK(デフォルト権限で自動付与) │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 1.5 Flywayマイグレーション │
│ ───────────────────────────────────────────────────────────── │
│ • テーブル作成、partman.create_parent() でパーティション設定 │
│ • archive スキーマ・関数作成 │
│ • RLSポリシー設定 │
│ ※ partman 拡張が必要 │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 1.6 pg_cronジョブ登録 │
│ ───────────────────────────────────────────────────────────── │
│ • partman-maintenance(partman.run_maintenance_proc()) │
│ • archive-processing(archive.process_archive()) │
│ ※ Flywayでテーブル・関数が作成された後に登録 │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────── ──────────────────────────────────┐
│ 1.7 S3エクスポート設定(オプション・AWS環境のみ) │
│ ───────────────────────────────────────────────────────────── │
│ • aws_s3 拡張インストール │
│ • IAMロール作成・関連付け │
│ • エクスポート関数の設定 │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 1.8 動作確認 │
│ ───────────────────────────────────────────────────────────── │
│ • ユーザー権限、RLS、パーティション、ジョブの確認 │
└─────────────────────────────────────────────────────────────────┘
重要: 1.2(idp作成)→ 1.3(拡張・権限付与)→ 1.5(Flyway)→ 1.6(pg_cronジョブ)の順序は厳守してください。
- idp への権限付与のため、拡張インストール前に idp ユーザーが必要
- Flyway DDL が
partman.create_parent()を呼び出すため、pg_partman 拡張が先に必要 - pg_cron ジョブが
archive.*関数を参照するため、Flyway 実行後にジョブ登録 - 1.4(アプリケーションユーザー)は 1.5(Flyway)の前後どちらでも可(ローカルDocker環境と同じ順序)
2. 設定手順
2.1 PostgreSQL設定
postgresql.conf の設定
パーティショニング機能には以下の設定が必要です:
shared_preload_libraries = 'pg_cron'
cron.database_name = 'postgres'
Note: pg_partman_bgw(pg_partman のバックグラウンドワーカー)は使用せず、pg_cron でパーティション管理をスケジュール実行しています。
設定後、PostgreSQLの再起動が必要です。
設定確認
SHOW shared_preload_libraries;
SHOW cron.database_name;
期待結果:
shared_preload_libraries
--------------------------
pg_stat_statements,pg_cron
cron.database_name
--------------------
postgres
2.2 DB_OWNER ユーザー作成
2.2.1 環境変数の設定
※パスワードは変更してください。
export IDP_DB_HOST=localhost
export IDP_DB_PORT=5432
export IDP_DB_NAME=idpserver
export DB_OWNER_USER=idp
export DB_OWNER_PASSWORD=<password>
2.2.2 idp ユーザー作成
重要: BYPASSRLS権限を持つユーザーを作成するには、スーパーユーザー権限が必要です。
- オンプレミス環境: PostgreSQLスーパーユーザー(例:
postgres)で実行 - AWS RDS環境: マスターユーザー(
rds_superuserロールを持つユーザー)で実行
-- superuser で実行
-- psql -h $IDP_DB_HOST -p $IDP_DB_PORT -U <superuser> -d $IDP_DB_NAME
CREATE USER idp WITH PASSWORD '<password>';
GRANT CONNECT ON DATABASE idpserver TO idp;
GRANT USAGE ON SCHEMA public TO idp;
GRANT CREATE ON SCHEMA public TO idp;
GRANT ALL PRIVILEGES ON DATABASE idpserver TO idp;
-- BYPASSRLS 権限付与(Flyway実行とpg_cronジョブ実行に必要)
ALTER USER idp BYPASSRLS;
2.2.3 確認
SELECT rolname, rolsuper, rolbypassrls
FROM pg_roles
WHERE rolname = 'idp';
期待結果:
rolname | rolsuper | rolbypassrls
---------+----------+--------------
idp | f | t