こんにちは、アプリケーションサービス部 ディベロップメントサービス2課の木田です。
本記事ではAWS初心者の方向けに、パブリックサブネット上のEC2からプライベートサブネット上のRDS(MySQL)に接続してみよう!という内容です。
また、筆者自身が躓いた点も記述してあります。筆者の失敗から学んで頂ければ幸いです!
構成

前提
EC2(Amazon Linux2)が構築され・SSH接続確認済みであること
セキュリティグループの作成
まず、RDS用のセキュリティグループを作成します。
EC2からのアクセスのみを許可するように設定します。
セキュリティグループの作成画面(EC2 ⇨ セキュリティグループ ⇨ セキュリティグループを作成)まで進み、以下のように入力してください。
基本的な詳細
| 設定項目 | 項目入力値 |
|---|---|
| セキュリティグループ名 | db-sg(任意) |
| 説明 | Security Group For RDS(任意) |
| VPC | EC2があるVPC |
インバウンドルール
「ルールを追加」を選択します。
| 設定項目 | 項目入力値 |
|---|---|
| タイプ | MYSQL/Aurora |
| プロトコル | ※TCP |
| ポート範囲 | ※3306 |
| ソース | カスタム/EC2のセキュリティグループID |
| 説明 | 空欄(任意) |
※タイプを選択すると自動入力されます。
アウトバウンドルール、タグはここではデフォルトのまま進みます。 「セキュリティグループの作成」を選択し、RDS用のセキュリティグループが作成できました。

筆者が躓いた点
当初、インバウンドルールにEC2のパブリックIPを設定していたため、EC2からRDSが接続できませんでした。
RDSとEC2は同一VPC内に存在するので、RDSのセキュリティグループのインバウンドで許可するのはEC2のセキュリティグループID or EC2のプライベートIPとなります。
セキュリティグループIDを指定すると、指定されたセキュリティグループに関連付けられたリソースのプライベート IP (ここではEC2のプライベートIP)が許可されることになります。運用的な観点から、今回はセキュリティグループIDで設定しました。
プライベートサブネットの作成
次にRDS用のプライベートサブネットを作成します。
本記事ではシングルAZで構成していますが、後述するRDSのサブネットグループとして、異なるAZにそれぞれ最低サブネットを1つ用意する必要があります。
サブネットの作成画面(VPC ⇨ サブネット ⇨ サブネットの作成)まで進み、以下のように入力してください。
VPC
| 設定項目 | 項目入力値 |
|---|---|
| VPC ID | EC2と同一上のVPC |

サブネットの設定
| 設定項目 | 項目入力値 |
|---|---|
| サブネット名 | db-private-subnet-1(任意) |
| アベイラビリティゾーン | EC2があるアベイラビリティゾーン |
| IPv4 CIDR ブロック | 使用済みでない任意の値 |

1つ目のサブネット項目を入力後、「新しいサブネットを追加」を選択し、同様に2つ目のサブネットの内容を入力します。
| 設定項目 | 項目入力値 |
|---|---|
| サブネット名 | db-private-subnet-2(任意) |
| アベイラビリティゾーン | 1つ目で作成したサブネットと別のアベイラビリティゾーン |
| IPv4 CIDR ブロック | 使用済みでない任意の値 |

「サブネットを作成」を選択し、サブネットが作成されました。
サブネットグループの作成
次にRDS用のサブネットグループを作成します。
サブネットグループの作成画面(RDS ⇨ サブネットグループ ⇨ DBサブネットグループを作成)まで進み、以下のように入力してください。
サブネットグループの詳細
| 設定項目 | 項目入力値 |
|---|---|
| 名前 | db-subnet-group(任意) |
| 説明 | Subnet Group For RDS(任意) |
| VPC | EC2があるVPC |

サブネットを追加
| 設定項目 | 項目入力値 |
|---|---|
| アベイラビリティゾーン | 作成したプライベートサブネットがあるアベイラビリティゾーン(2つ) |
| サブネット | 作成した2つのプライベートサブネット |

RDSの起動
RDSを起動させます。
RDSの作成画面まで進みます(RDS ⇨ データベースの作成 )。
設定項目が多く冗長的なため、今回設定する必要のある項目のみ後述します。他の項目はデフォルト値のまま進んでいただいて構いません。
エンジンのオプション
| 設定項目 | 項目入力値 |
|---|---|
| エンジンのタイプ | MySQL |

テンプレート
| 設定項目 | 項目入力値 |
|---|---|
| テンプレート | 開発/テスト |

設定
| 設定項目 | 項目入力値 |
|---|---|
| DBインスタンス識別子 | test-db(任意) |
| マスターパスワード/パスワードの確認 | 任意のパスワード(覚えておいてください) |

インスタンスの設定
| 設定項目 | 項目入力値 |
|---|---|
| DBインスタンスクラス | バースト可能クラス (t クラスを含む) / db.t3.micro |

接続
| 設定項目 | 項目入力値 |
|---|---|
| VPC | EC2があるVPC |
| サブネットグループ | 今回作成したサブネットグループ |
| 既存のセキュリティグループ | 今回作成したセキュリティグループ |

データベースの作成を選択します。
データベースは数分で起動が完了します。起動後、データベースのエンドポイントをメモしておいてください。
EC2からRDSへ接続
まず、EC2にSSH接続してください。
EC2にMySQLクライアントがない場合は以下のコマンドでインストールしてください。
$ sudo yum install mysql
インストール完了確認後、以下のコマンドでRDSに接続してください。
$ mysql -u admin -p -h データベースのエンドポイント
パスワード入力が求められますので、設定したパスワードを入力してください。
以下のように表示されれば接続成功です。

まとめ
ご一読いただきありがとうございました。
パブリックサブネット上のEC2からプライベートサブネット上のRDS(MySQL)に接続してみました。
筆者にとってはセキュリティグループ辺りで躓いたことが「基礎からしっかり固めよう!」と改めて思う良いきっかけになりました。
この記事をご覧になった皆さんにも何かの参考になれば幸いです。