Aurora for PostgreSQL で拡張機能管理の委任ができるようになりました

2023.12.23

こんにちは、森田です。

以下のアップデートで Aurora for PostgreSQL で拡張機能管理の委任ができるようになりました。

アップデートの概要

データベースの拡張機能の管理のみに絞った権限委任ができるようになります。

権限委任については、今回新たに追加されたrds_extensionを利用することで可能です。

また、拡張機能の中でも一部のみ権限を委任するといった制御もクラスタパラメータグループによって可能です。

では、実際に本記事では、張機能管理の権限委任の手順をご紹介します。

やってみた

クラスタパラメータグループの作成

あとから、クラスタパラメータグループを変更するため、新規で作成を行います。

今回は、PostgreSQL15を使用するため、ファミリーはaurora-postgresql15で作成を行います。

Aurora PostgreSQL の作成

今回のアップデートの対象であるAurora PostgreSQL 15.5を指定します。

また、先ほど作成したクラスタパラメータグループも指定を行い、作成を完了させます。

ロール一覧の確認

Aurora PostgreSQL へ接続を行い、ロール一覧を確認します。

Aurora PostgreSQL へ接続

psql -h  エンドポイント名 -U postgres -p 5432 -d sample -W

ロール一覧

sample=> \du 
                                                                                          List of roles
      Role name      |                         Attributes                         |                                                  Member of                                                   
---------------------+------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------
 postgres            | Create role, Create DB                                    +| {rds_superuser}
                     | Password valid until infinity                              | 
 rds_ad              | Cannot login                                               | {}
 rds_extension       | No inheritance, Cannot login                               | {}
 rds_iam             | Cannot login                                               | {}
 rds_password        | Cannot login                                               | {}
 rds_replication     | Cannot login                                               | {}
 rds_superuser       | Cannot login                                               | {pg_read_all_data,pg_write_all_data,pg_monitor,pg_signal_backend,pg_checkpoint,rds_replication,rds_password}
 rdsadmin            | Superuser, Create role, Create DB, Replication, Bypass RLS+| {}
                     | Password valid until infinity                              | 
 rdswriteforwarduser | No inheritance

実行結果からも今回追加されたrds_extensionが確認できました。

新規ユーザの作成

動作を検証するため新規でユーザの作成を行います。

新規ユーザ作成

CREATE USER newuser WITH PASSWORD 'newpassword';

作成したユーザで拡張機能インストール

作成したユーザでAurora PostgreSQL へ接続を行います。

Aurora PostgreSQL へ接続

psql -h  エンドポイント名 -U newuser -p 5432 -d sample -W

aws_mlの拡張機能をインストールします。

拡張機能インストール

sample=> CREATE EXTENSION IF NOT EXISTS aws_ml CASCADE;
NOTICE:  installing required extension "aws_commons"
ERROR:  permission denied to create extension "aws_commons"
HINT:  Must be rds_superuser to create this extension.

newuserは、拡張機能に関する権限を持っていないため、エラーとなりました。

では、正常にインストールできるように権限を付与します。

クラスタパラメータグループの編集

クラスタパラメータグループの設定値を変更します。

以下のように、rds.allowed_delegated_extensionsの値に*を設定します。

ユーザにロールを付与

再度superuserであるpostgresで Aurora PostgreSQL へ接続を行います。

接続後、以下の実行を行い、ユーザにrds_extensionを付与します。

sample=> GRANT rds_extension TO newuser;
GRANT ROLE
sample=> \dg
                                                                                          List of roles
      Role name      |                         Attributes                         |                                                  Member of                                                   
---------------------+------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------
 newuser             |                                                            | {rds_extension}
 postgres            | Create role, Create DB                                    +| {rds_superuser}
                     | Password valid until infinity                              | 
 rds_ad              | Cannot login                                               | {}
 rds_extension       | No inheritance, Cannot login                               | {}
 rds_iam             | Cannot login                                               | {}
 rds_password        | Cannot login                                               | {}
 rds_replication     | Cannot login                                               | {}
 rds_superuser       | Cannot login                                               | {pg_read_all_data,pg_write_all_data,pg_monitor,pg_signal_backend,pg_checkpoint,rds_replication,rds_password}
 rdsadmin            | Superuser, Create role, Create DB, Replication, Bypass RLS+| {}
                     | Password valid until infinity                              | 
 rdswriteforwarduser | No inheritance                                             | {}

再度拡張機能インストール

作成したユーザで再度 Aurora PostgreSQL へ接続を行い、拡張機能のインストールを行います。

拡張機能のインストール

sample=> CREATE EXTENSION IF NOT EXISTS aws_ml CASCADE;
NOTICE:  installing required extension "aws_commons"
CREATE EXTENSION
sample=> select * FROM pg_available_extensions where name like 'aws%';
    name     | default_version | installed_version |                   comment                   
-------------+-----------------+-------------------+---------------------------------------------
 aws_lambda  | 1.0             |                   | AWS Lambda integration
 aws_commons | 1.2             | 1.2               | Common data types across AWS services
 aws_ml      | 2.0             | 2.0               | ml integration
 aws_s3      | 1.2             |                   | AWS S3 extension for importing data from S3

今度は、エラーなく実行できています。

さいごに

今回は検証のため、クラスタパラメータグループで*を指定しましたが、リスト形式で、拡張機能の指定も可能となっています。

このアップデートにより、Aurora PostgreSQL の権限分離がより柔軟に設定ができるようになりましたのでぜひお試しください。