Amazon RDS for PostgreSQL の一般的な DBA タスク - Amazon Relational Database Service

Amazon RDS for PostgreSQL の一般的な DBA タスク

Amazon RDS for PostgreSQL DB インスタンスを管理するときに、データベース管理者 (DBA) は、さまざまなタスクを実行します。これは、PostgreSQL の基本的な機能のいくつかと、RDS for PostgreSQL DB インスタンスでそれらを使用する方法を理解するのに役立ちます。例えば、既に PostgreSQL に精通している DBA であれば、Amazon RDS では DB インスタンスへのシェルアクセスができないことに注意してください。つまり、サーバーハードウェアで PostgreSQL を実行するときと同じ方法では、ログファイルにアクセスできません。PostgreSQL ログファイルについての RDS の使用に関する詳細については、「PostgreSQL データベースのログファイル」を参照してください。

Amazon RDS では、高度な権限を必要とする特定のシステムプロシージャやテーブルへのアクセスを rds_superuser ロールに制限しています。これは RDS for PostgreSQL DB インスタンスで最も権限のある ID です。詳細については、「rds_superuser ロールを理解する」を参照してください。

RDS for PostgreSQL の一般的な DBA タスクの一部を次に示します。

PostgreSQL データベースへのユーザーアクセスのコントロール

RDS for PostgreSQL では、どのユーザーがどのデータベースに接続する権限を持っているかを管理できます。PostgreSQL 環境では、この種の管理を実行するために pg_hba.conf ファイルを変更することがあります。Amazon RDS では、代わりにデータベース許可を使用できます。

PostgreSQL の新しいデータベースは、常にデフォルトの権限セットを使用して作成されます。デフォルト権限では、PUBLIC (すべてのユーザー) がデータベースに接続し、接続しながらテンポラリテーブルを作成できます。

Amazon RDS で特定のデータベースに接続できるユーザーを管理するには、まずデフォルトの PUBLIC 権限を無効にします。次に、より細かく権限を付与しなおします。以下の例のように指定します。

postgres=> REVOKE ALL on database db-name from public; postgres=> GRANT CONNECT, TEMPORARY on database db-name to user/role;

PostgreSQL データベースでの権限の詳細については、PostgreSQL のドキュメントの GRANT コマンドを参照してください。

RDS for PostgreSQL でサポートされているログ記録メカニズムの使用

いくつかのパラメータ、エクステンション、その他の設定可能な項目を設定して、PostgreSQL DB インスタンスで発生するアクティビティのログを作成できます。これには次のものが含まれます。

  • log_statement パラメータは PostgreSQL データベースのユーザー操作のログを作成するのに使用できます。RDS for PostgreSQL のログ記録とログのモニタリング方法の詳細については、「PostgreSQL データベースのログファイル」を参照してください。

  • rds.force_admin_logging_level パラメータにより、DB インスタンス上のデータベースでの Amazon RDS 内部ユーザー (rdsadmin) によるアクションをログに記録されます。出力が PostgreSQL エラーログに書き込まれます。指定可能な値は、disableddebug5debug4debug3debug2debug1infonoticewarningerror、log、fatal、および panic です。デフォルト値は disabled です。

  • rds.force_autovacuum_logging_level パラメータを設定して、PostgreSQL エラーログにさまざまな自動バキュームオペレーションをキャプチャすることができます。詳細については、「自動バキュームおよびバキュームアクティビティのログ記録」を参照してください。

  • pgaudit 拡張は、セッションレベルまたはオブジェクトレベルでアクティビティをキャプチャするようにインストールおよび設定できます。詳細については、「pgaudit 拡張機能を使用したセッションレベルおよびオブジェクトレベルでのログ記録」を参照してください。

  • log_fdw 拡張を使用すると、SQL を使用してデータベースエンジンのログにアクセスすることができます。詳細については、「SQL を使用した DB ログのアクセスのための log_fdw 拡張機能の使用」を参照してください。

  • pg_stat_statements ライブラリは、PostgreSQL バージョン 10 以降の RDS で、shared_preload_libraries パラメータのデフォルトとして指定されています。実行中のクエリを分析するために使用できるのはこのライブラリです。DB パラメータグループで pg_stat_statements が設定されていることを確認してください。このライブラリが提供する情報を使用した RDS for PostgreSQL DB インスタンスのモニタリングの詳細については、「RDS PostgreSQL での SQL 統計」を参照してください。

一般に、ログ記録のポイントは、DBA がモニタリング、パフォーマンスのチューニング、およびトラブルシューティングを実行できるようにすることです。ログの多くは、Amazon CloudWatch または Performance Insights に自動的にアップロードされます。ここでは、DB インスタンスの完全なメトリクスを提供するためにソートおよびグループ化されています。Amazon RDS のモニタリングとメトリクスの詳細については、「Amazon RDS インスタンスでのメトリクスのモニタリング」を参照してください。

pgBadger を使用した PostgreSQL でのログ分析

pgBadger などのログ分析ツールを使用して、PostgreSQL のログを分析できます。pgBadger のドキュメントでは %l パターン (セッションやプロセスに関するログの行) をプレフィックスに含める必要があると説明されています。ただし、最新の RDS log_line_prefix をパラメータとして pgBadger に渡すことでも、レポートが作成されます。

例えば、次のコマンドでは、pgBadger を使用して、2014-02-04 の日付の Amazon RDS for PostgreSQL のログファイルを適切にフォーマットします。

./pgbadger -f stderr -p '%t:%r:%u@%d:[%p]:' postgresql.log.2014-02-04-00

ユーザーパスワードの制御を特定のロールに制限する

データベースユーザーのパスワードの管理担当者を特定のロールに限定できます。これにより、クライアント側でのパスワード管理をより柔軟に制御できます。

静的パラメータ rds.restrict_password_commands でパスワード管理の制限をオンにし、rds_password というロールを使用します。パラメータ rds.restrict_password_commands を 1 に設定すると、rds_password ロールのメンバーユーザーのみが特定の SQL コマンドを実行できます。制限された SQL コマンドは、データベースユーザーのパスワードとパスワードの有効期限を変更するコマンドです。

制限されたパスワード管理を使用するには、DB インスタンスで RDS for PostgreSQL 10.6 以上を実行するようにしてください。rds.restrict_password_commands パラメータは静的であるため、このパラメータを変更するにはデータベースの再起動が必要です。

制限されたパスワード管理がデータベースでオンになっている場合、制限された SQL コマンドを実行しようとすると、「ERROR: must be a member of rds_password to alter passwords」(エラー: パスワードを変更するには rds_password のメンバーであることが必要です) というエラーが表示されます。

制限されたパスワード管理をオンにした場合に制限される SQL コマンドの例を次に示します。

postgres=> CREATE ROLE myrole WITH PASSWORD 'mypassword'; postgres=> CREATE ROLE myrole WITH PASSWORD 'mypassword' VALID UNTIL '2020-01-01'; postgres=> ALTER ROLE myrole WITH PASSWORD 'mypassword' VALID UNTIL '2020-01-01'; postgres=> ALTER ROLE myrole WITH PASSWORD 'mypassword'; postgres=> ALTER ROLE myrole VALID UNTIL '2020-01-01'; postgres=> ALTER ROLE myrole RENAME TO myrole2;

ALTER ROLE が含まれている RENAME TO コマンドのいくつかも制限される場合があります。これらのコマンドが制限されるのは、MD5 パスワードが含まれている PostgreSQL ロールの名前を変更すると、パスワードが消去されるためです。

rds_superuser ロールは、rds_password ロールのデフォルトメンバーであるため、これを変更することはできません。他のロールに対して rds_password ロールのメンバーシップを付与するには、SQL の GRANT コマンドを使用します。rds_password のメンバーシップは、パスワード管理専用の少数のロールにのみ付与することをお勧めします。これらのロールは、他のロールを変更するために、CREATEROLE 属性を必要とします。

パスワード要件 (クライアント側の有効期限や必要な複雑さなど) を確認してください。クライアント側の独自のユーティリティを使用してパスワード関連の変更を制限することをお勧めします。このユーティリティには、rds_password のメンバーであり、CREATEROLE 属性を持つロールが必要です。

rds_superuser ロールを理解する

RDS for PostgreSQL DB インスタンスを作成すると、作成したメインユーザーシステムアカウントが rds_superuser ロールに割り当てられます。rds_superuser ロールは事前に定義された Amazon RDS ロールであり、PostgreSQL のスーパーユーザーロール (通常、ローカルインスタンスでは postgres という名前になります) と類似しています。ただし、制限がいくつかあります。PostgreSQL のスーパーユーザーロールと同様に、rds_superuser ロールは、DB インスタンスに対して最大の権限を持っています。また、ユーザーが DB インスタンスに対して最大のアクセス権を必要としない場合は、ユーザーにこのロールを割り当てないでください。

rds_superuser ロールでは以下の操作を実行できます。

  • Amazon RDS で使用できるエクステンションの追加 詳細については、「Amazon RDS for PostgreSQL でサポートされている PostgreSQL の機能を使用する」および PostgreSQL ドキュメントを参照してください。

  • テーブルスペースを管理する (作成と削除も含む)。詳細については、 RDS for PostgreSQL のテーブルスペース と PostgreSQL のドキュメントの テーブルスペース セクションを参照してください。

  • pg_stat_activity コマンドを使用して、rds_superuser ロールが割り当てられていないすべてのユーザーを表示し、pg_terminate_backend コマンドと pg_cancel_backend コマンドを使用して、それらのユーザーの接続を停止する。

  • rds_superuser ロール以外のすべてのロールに対して rds_replication ロールを付与する/取り消す。詳細については、PostgreSQL のドキュメントの「GRANT」セクションを参照してください。

前述のように、rds_superuserロールはpostgresスーパーユーザーができることのすべてはできません。例えば、データベースに接続するときに rds_superuserCONNECT 権限をバイパスできません。このロールは、rds_superuser 権限を持つべく作成されたユーザーに対して、特別に付与する必要があります。

次の例は、ユーザーを作成して、ユーザーに rds_superuser ロールを付与する方法を示しています。

postgres=> CREATE ROLE bus_app_admin WITH PASSWORD 'change_me' LOGIN; CREATE ROLE postgres=> GRANT rds_superuser TO bus_app_admin; GRANT ROLE