Amazon RDS for PostgreSQL で PostgreSQL 拡張機能を使用する - Amazon Relational Database Service

Amazon RDS for PostgreSQL で PostgreSQL 拡張機能を使用する

PostgreSQL は、さまざまな拡張機能やモジュールをインストールすることで、機能を拡張することができます。例えば、空間データを操作するには、PostGIS 拡張機能をインストールして使用します。詳細については、「PostGIS 拡張機能を使用した空間データの管理」を参照してください。別の例として、非常に大きなテーブルへのデータ入力を改善する場合は、pg_partman 拡張機能を使用したデータのパーティション化を検討できます。詳細については、「pg_partman エクステンションによる PostgreSQL パーティションの管理」を参照してください。

RDS for PostgreSQL のバージョンによっては、拡張機能をインストールする際に、以下のように rds_superuser の権限が必要になる場合があります。

  • RDS for PostgreSQL バージョン 12 以前のバージョンでは、拡張機能をインストールする際に rds_superuser の権限が必要となります。

  • RDS for PostgreSQL バージョン 13 以降のバージョンでは、特定のデータベースインスタンスに対する作成権限を持つユーザー (ロール) は、信頼できる拡張機能をインストールして使用することができます。信頼できる拡張機能のリストについては、「PostgreSQL 信頼できるエクステンション」を参照してください。

また、RDS for PostgreSQL DBインスタンスにインストール可能な拡張機能は、rds.allowed_extensions パラメータにリストアップして、正確に指定することができます。デフォルトでは、このパラメータは設定されていないため、ユーザーに権限がある場合は、サポートされている任意の拡張機能を追加できます。このパラメータに拡張機能のリストを追加することで、RDS for PostgreSQL DB インスタンスで使用できる拡張機能を明示的に特定できます。一覧にない拡張機能はインストールできません。この機能は、以下のバージョンで利用できます。

  • RDS for PostgreSQL バージョン 14.1 以降のバージョン

  • RDS for PostgreSQL 13.2 またはそれ以降のマイナーバージョン

  • RDS for PostgreSQL 12.6 またはそれ以降のマイナーバージョン

詳細については、「PostgreSQL エクステンションのインストールを制限する」を参照してください。

rds_superuser ロールの詳細については、「PostgreSQL のロールとアクセス権限について」を参照してください。

orafce 拡張機能の関数の使用

orafce 拡張機能は、Oracle データベースから関数とパッケージのサブセットをエミュレートする関数と演算子を提供します。Oracle 拡張機能を使用すると、Oracle アプリケーションを PostgreSQL に簡単に移植できます。この拡張機能は、RDS for PostgreSQL バージョン 9.6.6 以降でサポートされています。orafce についての詳細は、GitHub で「orafce」を参照してください。

注記

RDS for PostgreSQL では、orafce 拡張機能の一部である utl_file パッケージがサポートされていません。これは、utl_file スキーマ関数が、基になるモストへのスーパーユーザーアクセスに必要なオペレーティングシステムテキストファイルで読み書き操作を実行するためです。マネージド型サービスの RDS for PostgreSQL では、ホストアクセスが許可されません。

orafce エクステンションを使用するには

  1. DB インスタンスの作成で使用したマスターユーザー名を使用して DB インスタンスに接続します。

    同じ DB インスタンスにある別のデータベースで orafce をオンにする場合は、/c dbname psql コマンドを使用します。このコマンドを使用すると、接続を開始した後にプライマリデータベースから変更できます。

  2. CREATE EXTENSION ステートメントを使用して、orafce 拡張機能をオンにします。

    CREATE EXTENSION orafce;
  3. ALTER SCHEMA ステートメントを使用して、oracle スキーマの所有権を rds_superuser ロールに転送します。

    ALTER SCHEMA oracle OWNER TO rds_superuser;

    oracle スキーマの所有者のリストを表示する場合は、\dn psql コマンドを使用します。

pgAudit 拡張機能を使用したセッションレベルおよびオブジェクトレベルでのログ記録

RDS for PostgreSQL DB インスタンスに PostgreSQL Audit (pgAudit) 拡張機能をインストールすることで、セッションレベルまたはオブジェクトレベルでアクティビティをログ記録できます。この拡張機能は、RDS for PostgreSQL の使用可能なすべてのバージョンでサポートされています。基礎となるネイティブ PostgreSQL ログ記録メカニズムを使用します。

pgAudit 拡張機能の詳細については、GitHub で「pgAudit」を参照してください。

セッション監査では、さまざまなソースから監査イベントをログ記録できます。利用可能な場合は、完全修飾コマンドテキストも含めることができます。shared_preload_libraries に pgaudit が含まれるように、DB インスタンスに関連付けられているカスタムパラメータグループを変更します。続いて、次のいずれかのタイプのイベントをログ記録するように pgaudit.log パラメータを設定します。

  • READSELECT および COPY のログ記録 (ソースがリレーションまたはクエリの場合)。

  • WRITEINSERTUPDATEDELETETRUNCATE、および COPY のログ記録 (送信先がリレーションの場合)。

  • FUNCTION – 関数呼び出し、および DO ブロックのログ記録。

  • ROLEGRANTREVOKECREATE ROLEALTER ROLEDROP ROLE など、ロールと権限に関連するステートメントのログ記録。

  • DDLROLE クラスに含まれていない、すべてのデータ定義言語 (DDL) ステートメントのログ記録。

  • MISCDISCARDFETCHCHECKPOINTVACUUMSET など、さまざまなコマンドのログ記録。

セッション監査で複数のイベントタイプをログ記録するには、カンマ区切りリストを使用します。すべてのイベントタイプをログ記録するには、pgaudit.logALL に設定します。DB インスタンスを再起動して、変更を適用します。

オブジェクト監査では、監査のログ記録を絞り込み、特定のリレーションを操作できます。例えば、特定の数のテーブルで、READ オペレーションのログ記録を監査するよう指定できます。

pgAudit 拡張機能を使用するには、pgaudit を RDS for PostgreSQL DB インスタンスの shared_preload_libraries パラメータに追加します。デフォルトの DB パラメータグループの値を編集することはできません。そのため、DB インスタンスのカスタム DB パラメータグループを使用する必要があります。パラメータグループの詳細については、「パラメータグループを使用する」を参照してください。

pgAudit 拡張機能でオブジェクト監査を使用するには

  1. 次のコマンドを使用して、rds_pgaudit というデータベースロールを作成します。

    CREATE ROLE rds_pgaudit;
  2. DB インスタンスに関連付けられている DB カスタムパラメータグループを、次のように変更します。

    1. pgauditshared_preload_libraries パラメータリストに追加します。AWS CLI を使用して、次の操作を実行します。

      aws rds modify-db-parameter-group \ --db-parameter-group-name custom-param-group-name \ --parameters "ParameterName=shared_preload_libraries,ParameterValue=pgaudit,ApplyMethod=pending-reboot" \ --region aws-region
    2. pgaudit.role をロール rds_pgaudit に設定します。AWS CLI を使用して、次の操作を実行します。

      aws rds modify-db-parameter-group \ --db-parameter-group-name custom-param-group-name \ --parameters "ParameterName=pgaudit.role,ParameterValue=rds_pgaudit,ApplyMethod=pending-reboot" \ --region aws-region
  3. DB インスタンスを再起動してパラメータグループへの変更を有効にします。

    aws rds reboot-db-instance \ --db-instance-identifier your-RDS-db-instance \ --region aws-region
  4. 次のコマンドを実行して、pgaudit が初期化されたことを確認します。

    SHOW shared_preload_libraries; shared_preload_libraries -------------------------- rdsutils,pgaudit (1 row)
  5. pgaudit エクステンションを作成するには、次のコマンドを実行します。

    CREATE EXTENSION pgaudit;
  6. 次のコマンドを実行して、pgaudit.rolerds_pgaudit に設定されたことを確認します。

    SHOW pgaudit.role; pgaudit.role ------------------ rds_pgaudit

pgAudit ログ記録をテストするには、監査するサンプルコマンドをいくつか実行します。例えば、次のコマンドを実行します。

CREATE TABLE t1 (id int); GRANT SELECT ON t1 TO rds_pgaudit; SELECT * FROM t1; id ---- (0 rows)

データベースログには、次のようなエントリが含まれます。

... 2017-06-12 19:09:49 UTC:...:rds_test@postgres:[11701]:LOG: AUDIT: OBJECT,1,1,READ,SELECT,TABLE,public.t1,select * from t1; ...

ログの表示方法については、「Amazon RDS ログファイルのモニタリング」を参照してください。

pg_repack 拡張機能を使用して、テーブルやインデックスの膨張を抑制する

pg_repack 拡張機能使用して、テーブルやインデックスの膨張を取り除くことができます。このエクステンションは、RDS for PostgreSQL のバージョン 9.6.3 以降でサポートされています。pg_repack 拡張機能の詳細については、「GitHub プロジェクトのドキュメント」を参照してください。

pg_repack エクステンションを使用するには

  1. 次のコマンドを実行して、RDS for PostgreSQL DB インスタンスに pg_repack 拡張機能をインストールします。

    CREATE EXTENSION pg_repack;
  2. 次のコマンドを実行して、pg_repack によって作成されたテンポラリログテーブルを再パックするための書き込みアクセスを許可します。

    ALTER DEFAULT PRIVILEGES IN SCHEMA repack GRANT INSERT ON TABLES TO PUBLIC; ALTER DEFAULT PRIVILEGES IN SCHEMA repack GRANT USAGE, SELECT ON SEQUENCES TO PUBLIC;
  3. pg_repack クライアントユーティリティを使用してデータベースに接続します。rds_superuser 権限を持つアカウントを使用します。例として、rds_test ロールに rds_superuser 権限があるとします。コマンドの構文を次に示します。

    pg_repack -h db-instance-name.111122223333.aws-region.rds.amazonaws.com -U rds_test -k postgres

    -k オプションを使用して接続します。-a オプションはサポートされていません。

  4. pg_repack クライアントからの応答により、再パッケージされる DB インスタンスのテーブルに関する情報が提供されます。

    INFO: repacking table "pgbench_tellers" INFO: repacking table "pgbench_accounts" INFO: repacking table "pgbench_branches"

PLV8 拡張機能のアップグレードおよび使用

PLV8 は、信頼できる Javascript 言語の PostgreSQL 用エクステンションです。ストアドプロシージャ、トリガー、SQL から呼び出し可能なその他のプロシージャルコードに使用できます。この言語のエクステンションは、PostgreSQL のすべての最新リリースでサポートされています。

PLV8 を使用しており、PostgreSQL を新しい PLV8 バージョンにアップグレードする場合は、新しいエクステンションをすぐに利用できるようになります。次のステップを実行して、カタログメタデータを PLV8 の新しいバージョンと同期させます。これらの手順はオプションですが、メタデータ不一致の警告を回避するために実行することを強くお勧めします。

アップグレードプロセスでは、既存の PLV8 機能がすべて削除されます。そのため、アップグレードする前に、RDS for PostgreSQL DB インスタンスのスナップショットを作成しておくことをお勧めします。詳細については、「DB スナップショットの作成」を参照してください。

カタログメタデータを新しいバージョンの PLV8 と同期させるには

  1. 更新する必要があることを確認します。そのためには、インスタンスに接続されている間に以下のコマンドを実行します。

    SELECT * FROM pg_available_extensions WHERE name IN ('plv8','plls','plcoffee');

    インストールされているバージョンとしてデフォルトのバージョンより低いバージョンが表示された場合は、この手順を実行して、エクステンションを更新する必要があります。例えば、以下の結果セットは更新の必要があることを表します。

    name | default_version | installed_version | comment --------+-----------------+-------------------+-------------------------------------------------- plls | 2.1.0 | 1.5.3 | PL/LiveScript (v8) trusted procedural language plcoffee| 2.1.0 | 1.5.3 | PL/CoffeeScript (v8) trusted procedural language plv8 | 2.1.0 | 1.5.3 | PL/JavaScript (v8) trusted procedural language (3 rows)
  2. RDS for PostgreSQL DB インスタンスのスナップショットを作成していない場合は、作成してください。次のステップは、スナップショットの作成中も続行できます。

  3. DB インスタンスの PLV8 関数の数を取得し、アップグレード後にすべて揃っていることを確認できるようにします。例えば次の SQL クエリ では、plv8、plcoffee、plls で記述されている関数の数が返ります。

    SELECT proname, nspname, lanname FROM pg_proc p, pg_language l, pg_namespace n WHERE p.prolang = l.oid AND n.oid = p.pronamespace AND lanname IN ('plv8','plcoffee','plls');
  4. pg_dump を使用して、スキーマのみのダンプファイルを作成します。例えば、クライアントマシンの /tmp ディレクトリに、ファイルを作成します。

    ./pg_dump -Fc --schema-only -U master postgres >/tmp/test.dmp

    この例では、以下のオプションを使用します。

    • -Fc – カスタム形式

    • -- スキーマのみ – スキーマの作成に必要なコマンド (ここでは関数) のみをダンプする

    • -U – RDS マスターユーザー名

    • database – DB インスタンスのデータベース名

    pg_dump の詳細については、「PostgreSQL ドキュメント」の「pg_dump」を参照してください。

  5. ダンプファイルに存在する "CREATE FUNCTION" DDL ステートメントを抽出します。次の例では grep コマンドを実行して、関数を作成する DDL ステートメントを抽出し、ファイルに保存します。この ddl は後続のステップで関数を再作成するために使用します。

    ./pg_restore -l /tmp/test.dmp | grep FUNCTION > /tmp/function_list/

    pg_restore の詳細については、「PostgreSQL ドキュメント」の「pg_restore」を参照してください。

  6. 関数およびエクステンションを削除します。次の例では、PLV8 ベースのオブジェクトを削除します。CASCADE オプションでは、すべての依存が削除されます。

    DROP EXTENSION pvl8 CASCADE;

    plcoffee または plls に基づくオブジェクトが PostgreSQL インスタンスに含まれている場合は、それらのエクステンションに対してこのステップを繰り返します。

  7. エクステンションを作成します。次の例では、plv8、plcoffee、plls のエクステンションが作成されます。

    CREATE EXTENSION plv8; CREATE EXTENSION plcoffee; CREATE EXTENSION plls;
  8. ダンプファイルおよび "ドライバ" ファイルを使用して関数を作成します。

    次の例では、前に抽出した関数が再作成されます。

    ./pg_restore -U master -d postgres -Fc -L /tmp/function_list /tmp/test.dmp
  9. 次のクエリを使用して、すべての関数が再作成されたことを確認します。

    SELECT * FROM pg_available_extensions WHERE name IN ('plv8','plls','plcoffee');

    PLV8 バージョン 2 では、次の行が結果セットに追加されます。

    proname | nspname | lanname ---------------+------------+---------- plv8_version | pg_catalog | plv8