EC2踏み台サーバー経由でRDSアクセス

## 構成図
![構成図.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729481/45509645-ac2f-3e0c-af1b-78ecc0bf0508.png)  

以下参考資料をベースに上記の構成を作成していきます。  
[AWSのEC2からRDSに接続してmySQLを操作。EC2踏み台サーバー構築メモ](https://photo-tea.com/p/aws-ec2-to-rds-connection/)

### ネットワーク
ベースにしている参考資料の設定値をほぼそのまま使います。

* VPC  
  |Name|CIDR|
  |---|---|
  |rds-ec2-ssh_vpc|10.0.0.0/16|
* サブネット
  |Name|CIDR|用途|
  |---|---|---|
  |rds-ec2-ssh_publicSubnet-a|10.0.0.0/24|踏み台サーバー(EC2)用|
  |rds-ec2-ssh_privateSubnet-a|10.0.100.0/24|RDS用|
  |rds-ec2-ssh_privateSubnet-c|10.0.101.0/24|RDS用(RDSの仕様上複数AZを指定する必要があるため)|
* インターネットゲートウェイ
  |Name|
  |---|
  |rds-ec2-ssh_igw|
* ルートテーブル(パブリックサブネット用。Name: public_rtb)
  |送信先|ターゲット|
  |0.0.0.0/0|igw-××××(上で作ったインターネットゲートウェイ)|
  |10.0.0.0/16|local|
* ルートテーブル(プライベートサブネット用。Name: private_rtb)
  |送信先|ターゲット|
  |10.0.0.0/16|local|

### セキュリティ

* 踏み台サーバー(EC2)用のセキュリティグループ
  * Name: ec2-ssh_sg
  * インバウンドルール
    |タイプ|プロトコル|ポート範囲|送信元|
    |---|---|---|---|
    |SSH(22)|TCP(6)|22|0.0.0.0/0(※1)|
  * アウトバウンドルール
    |タイプ|プロトコル|ポート範囲|送信元|
    |---|---|---|---|
    |すべてのトラフィック|すべて|すべて|0.0.0.0/0|
  外部からのアクセスはSSHのみ許可。踏み台サーバー(EC2)からのアクセスはすべて許可

> ※1クライアントの接続元を特定のIPアドレスに制限したい場合は許可するIPアドレスを指定する。

* RDS用のセキュリティグループ
  * Name: rds-ec2_sg
  * インバウンドルール
    |タイプ|プロトコル|ポート範囲|送信元|
    |---|---|---|---|
    |PostgreSQL(5432)|TCP(6)|5432|10.0.0.0/16|
  * アウトバウンドルール
    |タイプ|プロトコル|ポート範囲|送信元|
    |---|---|---|---|
    |すべてのトラフィック|すべて|すべて|0.0.0.0/0|
  VPC内からの5432ポートのみ許可。RDSからのアクセスはすべて許可

### EC2
![ec2_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729481/6a3fd45b-30fd-a257-aecd-33ba4432f344.png)  

* 名前とタグ: rds-ec2-ssh_ec2_linux2
* アプリケーションおよびOSイメージ(Amazonマシンイメージ): Amazon Linux 2(無料利用枠)※2
* キーペア
  * キーペアのタイプ: RSA
  * プライベートキーファイル形式: .pem
※ここで作成したキーファイルは必ずダウンロードして保存しておいてください。

* ネットワーク設定
  * ネットワーク: rds-ec2-ssh_vpc
  * サブネット: rds-ec2-ssh_publicSubnet-a
  * 自動割り当てパブリック IP: 有効化
  * セキュリティグループ: ec2-ssh_sg

> ※2 デフォルトの「Amazon Linux 2023」はssh-rsa署名が使用できず、TeraTerm4.×系からSSH接続が出来ないようです。(CloudShellからなら接続できる)  
> TeraTerm5以降からならrsa-sha2-256およびrsa-sha2-512プロトコルを使用して接続可能だが、2023/7/10時点ではベータ版までしかリリースされていない模様。

### RDS
* サブネットグループ
  * 名前: rds-ec2-ssh_sng
  * 説明: rds-ec2-ssh_sng(空にできないので適当に)
  * VPC: rds-ec2-ssh_vpc
  * アベイラビリティーゾーン: ap-northeast-1a, ap-northeast-1c
  * サブネット: rds-ec2-ssh_privateSubnet-a(10.0.100.0/24), rds-ec2-ssh_privateSubnet-c(10.0.101.0/24)

![rds_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729481/f4ebe81e-300a-12ef-62fd-a19b23c7bd6f.png)  

* エンジンのオプション
  * エンジンのタイプ: Aurora(PostgreSQL Compatible)
  * エンジンバージョン: Aurora PostgreSQL(Compatible with PostgreSQL 14.6)

* 設定
  * DB クラスター識別子: 
  * マスターユーザー名: postgres(デフォルト。メモしておくこと)
  * マスターパスワード: (適当にパスワードポリシーを満たしている値。メモしておくこと)

* 接続
  * Virtual Private Cloud (VPC): rds-ec2-ssh_vpc
  * DB サブネットグループ: rds-ec2-ssh_sng
  * 既存の VPC セキュリティグループ: rds-ec2_sg

* 追加設定
  * 最初のデータベース名: test(適当に)

### EC2の踏み台サーバーに入る
ここは二パターン紹介します。

***CloudShellを使用する***
ローカルにSSHクライアントをインストールしたくないあるいはめんどくさい人向け。  
![cloudshell_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729481/b7e07aaf-ed0f-2553-2487-4b38308eafb1.png)

* フッターにあるアイコンからCloudShellを立ち上げる。  
  ![cloudshell_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729481/4c4e054f-5d54-448f-a171-00a99f46d525.png)

* 「ファイルのアップロード」を押下して、踏み台サーバー(EC2)を立ち上げた際にダウンロードしたキーファイル(.pemのやつ)をアップロードする。

* アップロードしたキーファイルの権限を600にする。
  ```terminal
  chmod 600 `キーファイル名`.pem
  ```

> 権限を絞らないと、下記のような警告がでて踏み台サーバーにアクセスできない。
> ![cloudshell_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729481/a8015f22-48a9-eaf1-1b9d-23f87ddb2100.png)

* 以下のコマンドで踏み台サーバーにアクセスできる。
  ```terminal
  ssh -i `キーファイル名`.pem ec2-user@`踏み台サーバーのパブリックIPv4アドレス`
  ```

***TeraTarmを使用する***  
![ssh_teraterm_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729481/6808530d-5f02-6095-8601-0d49468aa8e6.png)

* 「ホスト(T)」に ``ec2-user@`踏み台サーバーのパブリックIPv4アドレス` ``を入力して「OK」を押下。  
  ![ssh_teraterm_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729481/8c2ebe43-6728-6538-ce7f-441dc705bd6c.png)

* そのまま「続行」を押下。  
  ![ssh_teraterm_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729481/2ce0b11e-5d11-4f27-1ce8-a82be1f51187.png)

* 「ユーザ名(N)」が`ec2-user`であることを確認。

* 「認証方式」を`RSA/DSA/ECDSA/ED25519鍵を使う`にし、踏み台サーバー(EC2)を立ち上げた際にダウンロードしたキーファイル(.pemのやつ)を指定。

* 「OK」を押下。  
  ![ssh_teraterm_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729481/8a66f235-27ef-0f72-659d-31dc3db644f1.png)

* 踏み台サーバーにアクセス成功。

### RDSのPostgreSQLに接続する

踏み台サーバー(EC2)に入ることができたら、そこからRDSに接続します。

* 以下コマンドで`psql`コマンドをインストールする。
  ```terminal
  // yumパッケージ更新
  sudo yum update
  // このコマンドで`postgresql14`をいうパッケージがあることを確認
  sudo amazon-linux-extras
  // `postgresql14`をインストール
  sudo amazon-linux-extras install -y postgresql14
  ```

  > 普通にyum installでインストールしたものはバージョンが古かったらしく、認証方式が合わなくてログインができなかった。  
  > 多分コマンドが間違っていた気もするので要検証。一先ずamazoninuxなら上のやり方でインストールできる。

* 以下コマンドでRDS(ライターインスタンスの方)にログイン。
  ```terminal
  psql -h `エンドポイント` -p 5432 -U postgres -d test
  ```

  |オプション||
  |---|---|
  |-h|RDS「接続とセキュリティ」の「エンドポイント」の接続したい方|
  |-p|ポート番号|
  |-U|ユーザー名|
  |-d|接続するデータベース名|

  パスワード入力を要求されるので、RDS作成時にメモしたマスターパスワードを入力。