Auroraで追加ユーザを作成しSecrets Managerで管理・ローテーションする
はじめに
Amazon Aurora(以下、Aurora)のクラスターを作成すると、作成過程でマスタユーザも作成されます。マスタユーザは管理者権限をもち、データベースに対するあらゆる操作が可能です。しかし、最小権限の原則に従うと、日常的な運用でマスタユーザを使うことは推奨されません。例えば、読み取り専用など権限を絞ったユーザを使用するべきです。この記事ではAuroraの追加ユーザを作成し、認証情報をAWS Secrets Manager(以下、Secrets Manager)で管理できるようにします。
Auroraクラスターの作成
Aurora and RDSのページを開き、「データベース」⇒「データベースの作成」をクリックします。
今回はSQLの操作をクエリエディタから行いたいため、Aurora (PostgreSQL Compatible)を選択します。

テンプレートは「開発/テスト」を選択します。DBクラスター識別子は任意の値を入力します。マスタユーザ名はデフォルトのpostgresで、認証情報はSecrets Managerで管理するオプションを選択します。

クエリエディタを使用するため、「RDS Data APIの有効化」にチェックを入れます。

追加設定で任意のデータベース名を入力します。

他の設定項目はデフォルトとします。「データベースの作成」をクリックします。
クラスターが作成されます。

Secrets Managerにデータベース認証情報が作成されています。

マスタユーザでクエリエディタに接続
Aurora and RDSのページで「クエリエディタ」を選択します。
「データベースに接続します」のダイアログが表示されたら、クラスターを選択します。「Secrets Manager ARNと接続する」オプションを選択し、ARNとデータベースの名前を入力します。

「データベースに接続します」をクリックすると、接続されクエリエディタが表示されます。

テーブルを作成します。

CREATE TABLE films (
code char(5) CONSTRAINT firstkey PRIMARY KEY,
title varchar(40) NOT NULL
);
データを作成します。

insert into films (code, title) values ('10000', 'test');
作成されたことが確認できます。

追加ユーザの作成
マスタユーザで接続したまま、クエリエディタでユーザを作成します。
CREATE USER reader_user WITH password '<任意のパスワード>';
filmsテーブルへの読み取り権限を設定します。
GRANT SELECT ON TABLE public.films TO reader_user;
追加ユーザのシークレット作成
Secrets Managerのページから「新しいシークレットを保存する」を選択します。
シークレットのタイプは「Amazon RDSデータベースの認証情報」を選択します。作成したユーザ名とパスワードを入力します。

先ほど作成したクラスター(DBインスタンス)を選択し、「次」をクリックします。

シークレットに任意の名前をつけます。他はデフォルトで「次」をクリックします。

ローテーションを設定します。ここでは以下のように設定しました。

ローテーション関数名を指定します。ローテーション戦略は「シングルユーザ」を選択します。

確認画面で「保存」をクリックします。
保存が完了すると、ローテーションリソースをセットアップしている旨のメッセージが表示されます。

ローテーションリソースのセットアップが完了すると、ローテーション用のLambda関数が作成されます。
VPCエンドポイント作成
Auroraクラスターをプライベートサブネットに作成した場合、ローテーション用のLambda関数がVPCエンドポイントもしくはNat Gateway経由でSecrets Managerにアクセスできる必要があります。
AWS Secrets Managerでシークレットが正常にローテーションできなかった時の対応方法 | DevelopersIO
ここではVPCエンドポイントを作成します。
VPCのページを開き、「エンドポイント」⇒「エンドポイントを作成」をクリックします。

「AWSのサービス」を選択します。

「サービス」ではSecrets Managerのサービス名を選択します。

Lambda関数があるVPCとサブネットを選択します。「プライベートDNS名を有効化」にチェックを入れます。

セキュリティグループは、Lambda関数のセキュリティグループまたはVPCのCIDRからのHTTPSトラフィックを許可しているものを選択します。なければ作成します。

追加ユーザでクエリエディタに接続
Aurora and RDSのページで「クエリエディタ」を選択します。
「データベースに接続します」のダイアログが表示されたら、クラスターを選択します。「Secrets Manager ARNと接続する」オプションを選択し、先ほど作成したシークレットのARNとデータベースの名前を入力します。

filmsテーブルを参照できます。

しかし、読み取り権限しか付与されていないため、データを挿入しようとすると42501エラーとなります。

ERROR: permission denied for table films; SQLState: 42501
追加ユーザのパスワードをローテーションしてクエリエディタに接続
追加ユーザ用に作成したシークレットのページを開き、「すぐにシークレットをローテーションさせる」をクリックします。

「ローテーションさせる」をクリックします。

ローテーションが成功した場合、緑色のメッセージが表示されます。

赤いメッセージでエラーが表示される場合、以下の記事を参考に、Lambda関数のセキュリティグループやルーティング設定を見直してください。
AWS Secrets Managerでシークレットが正常にローテーションできなかった時の対応方法 | DevelopersIO
パスワードが自動生成のものに変更されています。

再度クエリエディタを開き、シークレットのARNで接続します。
正常に接続され、先ほどと同様に更新権限がないことが確認できます。

念のため、シークレットのARNではなくユーザ名/パスワードを入力しても、正常に接続できることが確認できます。

ちなみに、ユーザ名/パスワードを使用してクエリエディタに接続すると、自動的にSecrets Managerにシークレットが保存されます。これにより、次回以降の入力の手間を削減できます。ただし、今回は既に手動で作成したシークレットがあるため、不要であれば削除します。

How Amazon RDS uses AWS Secrets Manager - AWS Secrets Manager
おわりに
この記事では、Auroraでマスタユーザ以外の追加ユーザを作成し、接続情報をSecrets Managerで管理する手順を実施しました。
ローテーション方法にシングルユーザと交代ユーザがあることは知らなかったため、学びになりました。また、Secrets ManagerのVPCエンドポイントが必要といった見落としがちな点も再確認できました。
この記事がどなたかの参考になれば幸いです。






