AWSでAurora PostgreSQLのプロキシを設定する方法

はいさい！ちゅらデータぬオースティンやいびーん！んながんじゅーやみ？（みんな、元気ね？）

# 概要
AWSのRDSサービスでAurora版のPostgreSQLを立ち上げて、Lambdaなど、その他のAWSサービスでデータベース・プロキシが使えるようにする

### RDSのプロキシとは何か？
AWSの各サービスがRDSデータベースへ張る<a href="http://www.kab-studio.biz/Programing/JavaA2Z/Word/00000420.html#:~:text=SQL%E3%81%A7%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9,%E3%81%8C%E3%80%8C%E3%82%B3%E3%83%8D%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%80%8D%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82">コネクション</a>を管理するものです。

通常なら、自前のアプリで<a href="http://www.cresc.co.jp/tech/java/Servlet_Tutorial/Lesson_910.htm">コネクション・プール</a>を作って、データベースとの接続を管理するものですが、複数のアプリが同じようにコネクション・プールで複数のコネクションを張っていたとしたら、いかがでしょうか？

我々が提供サービスが拡張されると、アプリ越しのデータベースとの接続を管理することが困難になります。データベースが維持するコネクション数が多くなると、パフォーマンスが悪くなります。また、新しいコネクションを張ること自体が最も大きい負荷だとされています。

そこで、一定数のコネクションを張って、それらを各アプリに割り当ててくれるのが、RDSプロキシです。

つまり、RDSプロキシは、複数のアプリに渡って使えて、AWSが管理してくれる、コネクション・プールなのです。

しかも、IAM認証も使えば、各アプリにRDS認証情報を渡す必要がなくなり、セキュリティ性も改善できます。

# 目次
1. Aurora PostgreSQLのサーバーレス・データベースを作る
1. Secret Managerでデータベース認証情報を登録する
1. Security Groupの設定を調整する
1. RDSプロキシを作る

# Aurora PostgreSQLのサーバーレス・データベースを作る
まず、接続の対象となるデータベースを作ります。

今回は、サーバーレスv2のPostgreSQLを使いますが、プロキシと使えるバージョンが限られているようで、なお、AWSドキュメントでは具体的にどのバージョンがサーバーレスでプロキシと使えるのか、明確ではないです。

なので、本記事を書いた現時点（2022/07/25）で、Aurora PostgreSQL 13.7で出来ましたので、これを使って作ります。

## RDSにアクセスする
AWSにログインして、サービス検索でRDSを探します。
![スクリーンショット 2022-07-25 8.56.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/77d3da66-da43-7d4b-548e-7629e6ff4faf.png)
### `データベース`のメニューを開く
![スクリーンショット 2022-07-25 8.58.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/4385fc5e-adaf-d567-c3fc-13fac69804b6.png)
## データベースを作成する
`データベースを作成`のオレンジ色のボタンをクリックします。
![スクリーンショット 2022-07-25 9.00.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/a9e5c331-2af3-4530-59d3-5012c8708566.png)
### 各設定を埋め込む
`標準作成`と`Amazon Aurora`を選択します。
![スクリーンショット 2022-07-25 9.06.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/eba2157a-9194-b2f9-b293-0ed1099f85d2.png)
次は`Amazon Aurora PostgreSQL 互換エディション`を選択し、バージョンを`13.7`にします。
![スクリーンショット 2022-07-25 9.07.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/b621407a-949a-2412-763b-f87885af167f.png)
また、今回はテスト用ということで、`開発/テスト`のテンプレートを選択します。

次は、RDSデータベース・クラスターの名前をつけて、Postgresのマスターユーザーとパスワードを設定します。

筆者は、自動生成を使いますが、独自のパスワードを入れてもいいです。
![スクリーンショット 2022-07-25 9.10.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/d166733c-878b-36f7-e95a-91fee69b65c2.png)

`インスタンスの設定`はそのままですが、要領の範囲を低くしてもいいかと思います。
![スクリーンショット 2022-07-25 9.13.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/6f389e3b-04b9-4e24-86c3-26679f336f87.png)
`接続`では、新しいVPCを作るようにします。既存のVPCを使うことももちろん問題ありません。
![スクリーンショット 2022-07-25 9.15.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/6797f3cf-fa09-5952-d69e-865afecf7e4a.png)
新しいSecurity Groupも作っておきます。
![スクリーンショット 2022-07-25 9.16.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/e877311c-58a0-400f-5415-f35d87456a74.png)
データベース認証では、IAM認証を有効にします。
![スクリーンショット 2022-07-25 9.17.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/c1243c82-3148-f656-c470-ad5765ad334a.png)
他の設定を調整していただいてもいいですが、最後に`データベースの作成`をクリックします
![スクリーンショット 2022-07-25 9.19.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/2eefef68-d873-5c2a-3b43-250cba60648e.png)

## 重要：自動生成のパスワードを控える
自動生成でデータベースのパスワードを作ってもらうことにした方は、以下のボタンをクリックしてパスワードを控えてください。

この画面を開かないと、あとからパスワードを知る方法がないので、データベースを作り直す羽目になるど！
![スクリーンショット 2022-07-25 9.20.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/0da87236-b980-0411-b62b-f6bee08a1137.png)
そしてこの画面でコピーできます。
![スクリーンショット 2022-07-25 9.22.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/94f8b34a-1815-76ed-cb92-eaab3cce1f11.png)

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

![スクリーンショット 2022-07-25 9.24.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/e21b9fa5-d396-3aae-bf97-b0fd4e50d8b3.png)
`新しいシークレットを保存する`をクリックします。
![スクリーンショット 2022-07-25 9.24.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/548003c9-4d79-d03e-3e2f-1d6a909fac1e.png)
そして、`Amazon RDSデータベースの認証情報`を選択し、先ほどコピーしたパスワードをペーストします。また、ユーザー名も上記のRDSデータベース作成時に設定した`master`とします。
![スクリーンショット 2022-07-25 9.25.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/4b1e17f5-2f5a-6801-b013-77d9bd9a12a4.png)
`データベース`の設定で、先ほど作成したデータベースを選択します。
![スクリーンショット 2022-07-25 9.27.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/d64f4260-7ba1-3e22-3f28-f77625b79fa7.png)
`次`のボタンをクリックし、次のページで名前だけを記入するので十分です。
![スクリーンショット 2022-07-25 9.28.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/a6cbad8b-8db5-465e-b283-1334ab3e5f69.png)
残りの設定は全て初期値でいいので、`次`を連打して、最後に`保存`ボタンをクリックしてください。

すると、無事に作成できたはず！
![スクリーンショット 2022-07-25 9.30.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/2eef6623-9648-7730-d405-324db8287482.png)

# Security Groupの設定を調整する
各アプリでプロキシにアクセスできるようにするのと、プロキシがRDSデータベースにアクセスできるようにするために、Security Groupの設定を調整します。
##　プロキシがRDSデータベースにアクセスできるようにする
`EC2`の`セキュリティ・グループ`のメニューにアクセスします。
![スクリーンショット 2022-07-25 9.33.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/f96b0bba-f394-cd53-39aa-225fc99c93ee.png)
先ほど作成して`my-proxy-sg`を検索して開きます。
![スクリーンショット 2022-07-25 9.35.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/a8c96f55-9af1-e46e-be50-162f6c7ee987.png)
`インバウンドのルールを編集`をクリックします。
![スクリーンショット 2022-07-25 9.35.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/0d09119d-705d-0237-f612-fdd0691231b1.png)
このSecurity Group、つまり`my-proxy-sg`をインバウンドのルールとして追加します。

こうすることで、RDSデータベースとRDSプロキシを同じ`my-proxy-sg`に設定すれば、通信ができるのです。
![スクリーンショット 2022-07-25 9.38.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/52a16add-7a65-30ae-4c64-fb6a2972c5cc.png)

## アプリ側のSecurity Groupを作成し、`my-proxy-sg`に追加する
そして、次は、アプリ側で使うSecurity Groupを追加します。

上記のように、`my-proxy-sg`を使えば接続できるのですが、アプリとデータベースでSecurity Groupを分けることを推奨します。アプリではIPアドレスを公開することがあるからです。

`セキュリティグループを作成`をクリックし、名前と先ほど新規で作成したVPCを入力します。

名前は`my-application-sg`としますが、任意です。
![スクリーンショット 2022-07-25 9.43.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/710198d5-83e3-24ba-2c3a-23bfd51f6b2a.png)

インバウンドの接続ルールはお任せします。

### `my-proxy-sg`に`my-application-sg`からのインバウンドを許可する
もう一度`my-proxy-sg`に戻って、`インバウンドルールを編集`のボタンをクリックします。

そして以下のように、`my-application-sg`からのアクセスを許可します。
![スクリーンショット 2022-07-25 9.49.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/27968886-a904-505e-25aa-418066f08d25.png)

これでは、プロキシを作る準備が整いました！

# RDSプロキシを作る
最後に、RDSプロキシを作成します。

RDSコンソールに戻って、`プロキシ`のリンクをクリックします。
![スクリーンショット 2022-07-25 9.50.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/6aca540a-1359-04a5-a4fb-9998e41d42be.png)

そして、`プロキシを作成`をクリックします。
![スクリーンショット 2022-07-25 9.51.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/a23ff67e-1d16-4c67-f1e8-c5693d7bfc6c.png)
エンジンの互換性を`PostgreSQL`にし、プロキシ識別子（名前）を入力します。値は任意です。

TLSも有効にする必要があります。なぜなら、IAM認証を使う場合はTLSが必須だからです。
![スクリーンショット 2022-07-25 9.52.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/2120e5be-4458-eb66-01bb-dc2f0779e942.png)
`ターゲットグループの設定`では、先ほど作成したデータベースを選択します。

もし、作成したデータベースが表示されていなければ、Postgresのバージョンがサポートされていないものである可能性が高いので、違うバージョンでデータベースを作り直して見てください。
![スクリーンショット 2022-07-25 9.55.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/32a5c181-27f4-a9e7-549d-50bdd71453d1.png)
`接続`では、Secret Managerで保存した認証情報を選択します。

また、IAMロールを新規するのと、IAM認証を必須にもします。
![スクリーンショット 2022-07-25 9.57.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/b5a30f69-d846-5aad-523c-ee74187bf407.png)
`追加の接続設定`では、`my-proxy-sg`のSecurity Groupを指定します。
![スクリーンショット 2022-07-25 9.59.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/9f472419-1bcf-e905-51b6-3f7671e0b250.png)
そうすると、無事に作成できます！
![スクリーンショット 2022-07-25 12.25.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/3cbbf23c-3851-8471-b1e7-a3067511ec8b.png)

# まとめ
ここまで、プロキシの使い方を紹介してまいりましたが、いかがでしょうか？

次の記事では、Lambda関数でこのプロキシを使って接続する方法をご紹介します。

続きはこちら！

https://qiita.com/tronicboy/items/eb91f57a6ec14418c629