はいさい!ちゅらデータぬオースティンやいびーん!んながんじゅーやみ?(みんな、元気ね?)
概要
AWSのRDSサービスでAurora版のPostgreSQLを立ち上げて、Lambdaなど、その他のAWSサービスでデータベース・プロキシが使えるようにする
RDSのプロキシとは何か?
AWSの各サービスがRDSデータベースへ張るコネクションを管理するものです。
通常なら、自前のアプリでコネクション・プールを作って、データベースとの接続を管理するものですが、複数のアプリが同じようにコネクション・プールで複数のコネクションを張っていたとしたら、いかがでしょうか?
我々が提供サービスが拡張されると、アプリ越しのデータベースとの接続を管理することが困難になります。データベースが維持するコネクション数が多くなると、パフォーマンスが悪くなります。また、新しいコネクションを張ること自体が最も大きい負荷だとされています。
そこで、一定数のコネクションを張って、それらを各アプリに割り当ててくれるのが、RDSプロキシです。
つまり、RDSプロキシは、複数のアプリに渡って使えて、AWSが管理してくれる、コネクション・プールなのです。
しかも、IAM認証も使えば、各アプリにRDS認証情報を渡す必要がなくなり、セキュリティ性も改善できます。
目次
- Aurora PostgreSQLのサーバーレス・データベースを作る
- Secret Managerでデータベース認証情報を登録する
- Security Groupの設定を調整する
- RDSプロキシを作る
Aurora PostgreSQLのサーバーレス・データベースを作る
まず、接続の対象となるデータベースを作ります。
今回は、サーバーレスv2のPostgreSQLを使いますが、プロキシと使えるバージョンが限られているようで、なお、AWSドキュメントでは具体的にどのバージョンがサーバーレスでプロキシと使えるのか、明確ではないです。
なので、本記事を書いた現時点(2022/07/25)で、Aurora PostgreSQL 13.7で出来ましたので、これを使って作ります。
RDSにアクセスする
データベースのメニューを開く
データベースを作成する
各設定を埋め込む
標準作成とAmazon Auroraを選択します。

次はAmazon Aurora PostgreSQL 互換エディションを選択し、バージョンを13.7にします。

また、今回はテスト用ということで、開発/テストのテンプレートを選択します。
次は、RDSデータベース・クラスターの名前をつけて、Postgresのマスターユーザーとパスワードを設定します。
筆者は、自動生成を使いますが、独自のパスワードを入れてもいいです。

インスタンスの設定はそのままですが、要領の範囲を低くしてもいいかと思います。

接続では、新しいVPCを作るようにします。既存のVPCを使うことももちろん問題ありません。

新しいSecurity Groupも作っておきます。

データベース認証では、IAM認証を有効にします。

他の設定を調整していただいてもいいですが、最後にデータベースの作成をクリックします

重要:自動生成のパスワードを控える
自動生成でデータベースのパスワードを作ってもらうことにした方は、以下のボタンをクリックしてパスワードを控えてください。
この画面を開かないと、あとからパスワードを知る方法がないので、データベースを作り直す羽目になるど!

そしてこの画面でコピーできます。

Secret Managerでデータベース認証情報を登録する
上記で取得したデータベースの認証情報を、次は、Secret Managerに登録します。

新しいシークレットを保存するをクリックします。

そして、Amazon RDSデータベースの認証情報を選択し、先ほどコピーしたパスワードをペーストします。また、ユーザー名も上記のRDSデータベース作成時に設定したmasterとします。

データベースの設定で、先ほど作成したデータベースを選択します。

次のボタンをクリックし、次のページで名前だけを記入するので十分です。

残りの設定は全て初期値でいいので、次を連打して、最後に保存ボタンをクリックしてください。
Security Groupの設定を調整する
各アプリでプロキシにアクセスできるようにするのと、プロキシがRDSデータベースにアクセスできるようにするために、Security Groupの設定を調整します。
## プロキシがRDSデータベースにアクセスできるようにする
EC2のセキュリティ・グループのメニューにアクセスします。

先ほど作成してmy-proxy-sgを検索して開きます。

インバウンドのルールを編集をクリックします。

このSecurity Group、つまりmy-proxy-sgをインバウンドのルールとして追加します。
こうすることで、RDSデータベースとRDSプロキシを同じmy-proxy-sgに設定すれば、通信ができるのです。

アプリ側のSecurity Groupを作成し、my-proxy-sgに追加する
そして、次は、アプリ側で使うSecurity Groupを追加します。
上記のように、my-proxy-sgを使えば接続できるのですが、アプリとデータベースでSecurity Groupを分けることを推奨します。アプリではIPアドレスを公開することがあるからです。
セキュリティグループを作成をクリックし、名前と先ほど新規で作成したVPCを入力します。
名前はmy-application-sgとしますが、任意です。

インバウンドの接続ルールはお任せします。
my-proxy-sgにmy-application-sgからのインバウンドを許可する
もう一度my-proxy-sgに戻って、インバウンドルールを編集のボタンをクリックします。
そして以下のように、my-application-sgからのアクセスを許可します。

これでは、プロキシを作る準備が整いました!
RDSプロキシを作る
最後に、RDSプロキシを作成します。
RDSコンソールに戻って、プロキシのリンクをクリックします。

そして、プロキシを作成をクリックします。

エンジンの互換性をPostgreSQLにし、プロキシ識別子(名前)を入力します。値は任意です。
TLSも有効にする必要があります。なぜなら、IAM認証を使う場合はTLSが必須だからです。

ターゲットグループの設定では、先ほど作成したデータベースを選択します。
もし、作成したデータベースが表示されていなければ、Postgresのバージョンがサポートされていないものである可能性が高いので、違うバージョンでデータベースを作り直して見てください。

接続では、Secret Managerで保存した認証情報を選択します。
また、IAMロールを新規するのと、IAM認証を必須にもします。

追加の接続設定では、my-proxy-sgのSecurity Groupを指定します。

そうすると、無事に作成できます!

まとめ
ここまで、プロキシの使い方を紹介してまいりましたが、いかがでしょうか?
次の記事では、Lambda関数でこのプロキシを使って接続する方法をご紹介します。
続きはこちら!



