踏み台EC2を経由してRDSに接続したい

## :triangular_flag_on_post: やりたいこと
今回、踏み台用のEC2を作成し、RDSへ接続してみます！
EC2をパブリックサブネット、RDSをプライベートサブネットに配置する想定です。
なお、VPCやサブネットは作成済みの前提で進めますのであしからず:zipper_mouth:

## :gear: セキュリティグループの作成
まずはEC2・RDSに設定するセキュリティグループの作成から。

**EC2**
EC2へはsshで繋ぎたいので、ポート22を許可してあげます。
CIDRブロックには許可するIPアドレスを指定します。
`0.0.0.0/0`を入力すればどこからでもアクセスできる状態になりますが、
今回パブリックサブネットに作成するためセキュリティ的に危険なので、自端末のIPアドレスを指定してください。
特定のIPアドレスのみを許可する場合は/32とします。
例：`〇.〇.〇.〇/32`
![image-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788032/75ac1a3b-0b28-9be2-f11b-07e5e084af17.png)


**RDS**
今回RDSはPostgreSQLを使用するため、ポート5432を指定します。
ソースには先程作成したEC2のセキュリティグループを指定すると、EC2からのみの接続を許可している状態になります！
![image-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788032/5cf6b995-e6d1-51e2-f578-d12a28b786b2.png)

## :globe_with_meridians: 踏み台EC2の作成
EC2の作成手順です。
AMIは、Amazon Linux 2023 を使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788032/059ab238-0fff-c6bf-32fd-1bbb713ccb51.png)


インスタンスタイプは用途に応じて選んでください。
今回は無料利用枠対象のt2.microを使用します。
![image-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788032/255a6b7a-61d1-1865-b04b-8388d2d72f78.png)


続いてキーペアを選びます。:key:
事前に作成しておくか、「新しいキーペアの作成」をクリックすると以下の画面が表示されるので、ここから作成することもできます。
![image-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788032/13de100d-52c4-29a8-bcbc-1ac13211476f.png)

`キーペアのタイプ：RSA`
`プライベートキーファイル形式：.pem`

で作成してください。

後はネットワーク設定。
事前に作成しているVPC・パブリックサブネットを指定します。
以下の点だけは注意して、残りはデフォルトの設定で問題ありません。
- パブリック IP の自動割り当て：有効化
- セキュリティグループ：先程作成したEC2用のセキュリティグループ


## :blue_book: RDSの作成
RDSの作成手順です。
標準作成を選択します。
![image-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788032/877393de-f0e3-35be-91c2-152c86a33ba6.png)


エンジンを選択します。
今回はPostgreSQLです。
![image-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788032/81e00449-6760-88b6-ca02-c82a7dfb4cdf.png)


任意のユーザー名・パスワードを設定してください。
![image-9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788032/ecd7907d-49ec-e249-ae9d-50755c459e21.png)


接続の設定は事前に作成しているVPC・プライベートサブネットを指定します。
セキュリティグループも先程作成したものを指定してください。

:loudspeaker: 注意点として、追加設定のタブを開くとデータベース名を指定する欄があります。
ここを入力しないとデータベースを作成してくれないので注意してください。
ここでは`test_db`としておき、パラメータグループもデフォルトのままにしておきます。
![image-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788032/34594105-94d2-0463-193a-9e7c062557f5.png)



## :fist: 接続してみる
いよいよDB接続していきます！
A5:SQL Mk-2（A5M2）を使って接続します。
「サーバー名」はRDSインスタンスのエンドポイントを指定します。
それ以外はRDS作成時に設定したものを指定してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788032/de915900-4bc2-171d-ac83-e51420b5fe48.png)



EC2経由で接続するには「SSH2トンネル」タブに設定します。
- SSH2ホスト名：踏み台EC2の「パブリック IPv4 DNS」
- ユーザーID：「ec2-user」
- 秘密鍵ファイル：キーペアのファイルパス

![image-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788032/c0b2d0e2-ce6f-b9e0-28c6-e29c0ccf2049.png)


接続すると、以下のようなエラーが出て接続に失敗しました。
```
no pg_hba.conf entry for host "10.1.8.58", user "postgres", database "test_db", no encryption
```


調べたところ、RDSのPostgreSQL15以上はパラメータグループの設定でSSL接続を強制する設定になっているらしいです。

デフォルトのパラメータグループは設定変更が出来ないため、カスタムパラメータグループを作成し、`rds.force_ssl`を0に変更します。
![image-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788032/b4a0ed3b-3377-98a0-32cb-58f5f7c9db21.png)


 作成したパラメータグループをRDSに設定すると、無事DBに接続出来ました。:raised_hands:

### 蛇足:snake:
調査の過程でTeraTermでEC2に接続を試みて、うまく接続できない事態が発生しました。
AmazonLinux2023ではssh-rsa署名が使えなくなっているらしく、Tera Term-5 RC 5.0 beta1版を使う必要がありました。
これで地味に詰まってました・・・。


## まとめ
踏み台経由でデータベースへ接続するのはよくある構成だと思います。
AWSに不慣れだと躓くポイントがいっぱいありますが、小さなことからコツコツ頑張っていきましょう:thumbsup: