はじめに
AWS上でRDSとやり取りをするリソースがRDSとは異なるVPCに配置されている場合、通信を行うためにはいくつかの設定が必要になります。
本記事ではそれらの設定手順とエラーポイントについてまとめていきます。
※RDSの通信相手はEC2を利用しています。
前提条件
・コンソール操作で各種リソースを作成
・データベースの作成における、エンジンのタイプなど一部の設定値に関しては要件に応じて読み替えてください。
RDSの作成
①VPCの作成
・作成するリソースで「VPCなど」を選択
・VPCエンドポイントで「なし」を選択
・その他の設定はデフォルト
②DBサブネットグループの作成
・①で作成したVPCを選択
・①で作成したVPCのサブネットが存在するAZを2つとも選択
・①で作成したVPCのプライベートサブネットを2つとも選択
③データベースの作成
・作成方法で「標準作成」を選択
・エンジンのタイプは「MySQL」を選択
・テンプレートは「無料利用枠」を選択
・認証情報管理は「セルフマネージド」を選択
・①で作成したVPCを選択
・②で作成したDBサブネットグループを選択
・その他の設定はデフォルト
※セキュリティグループは一旦、「default」のまま
EC2の作成
①VPCの作成
・作成するリソースで「VPCなど」を選択
・VPCエンドポイントで「なし」を選択
・IPv4 CIDR ブロックで①のVPCと重複しないようCIDRを設定
・その他の設定はデフォルト
②EC2の作成
・AMIは「Amazon Linux 2023」を選択
・インスタンスタイプは「t2.micro」を選択
・キーペア (ログイン)は「キーペアなしで続行 (推奨されません)」を選択
・①で作成したVPCを選択
・サブネットはプライベートサブネットを選択
・ファイアウォール (セキュリティグループ)は「セキュリティグループを作成」を選択
・既存のインバウンドルール(任意のSSH接続の許可)を削除
・その他の設定はデフォルト
※以下は「EC2 Instance Connect Endpoint」によるEC2接続を行う設定のため、必要な場合のみ実施
③セキュリティグループの作成
・①で作成したVPCを選択
・アウトバウンドルールに②で作成したセキュリティグループへのSSH接続を許可するルールを設定
④セキュリティグループの修正
・②で作成したセキュリティグループの修正
・インバウンドルールに③で作成したセキュリティグループからのSSH接続を許可するルールを設定
⑤EC2 Instance Connect Endpointの作成
・サービスカテゴリで「EC2 インスタンス接続エンドポイント」を選択
・①で作成したVPCを選択
・③で作成したセキュリティグループを選択
・①でEC2インスタンスを作成したサブネットを選択
※VPC > Endpointsから作成する
⑥EC2インスタンスへの接続
・EC2 Instance Connectタブを選択
・接続タイプで「EC2 Instance Connect エンドポイントを使用して接続する」を選択
・⑤で作成したエンドポイントを選択
VPC間接続のための設定
①ピアリング接続の作成
・EC2およびRDSが配置されているVPCをそれぞれ選択
・ステータスが「承諾の保留中」になるため、アクションからリクエストを承諾
※対象のVPCのCIDRが重複している場合、以下のメッセージが表示されピアリング接続の作成できない
②ルートテーブルの修正
・EC2およびRDSが配置されているサブネットに紐づくルートテーブルへルートを追加
・通信先には通信先のVPCのCIDRを指定
・ターゲットで「ピアリング接続」を選択し、①で作成したピアリング接続を選択
③セキュリティグループの作成
・RDS用のセキュリティグループを作成
・RDSが配置されているVPCを選択
・インバウンドルールにEC2で使用しているセキュリティグループからのポート3306のTCP接続(タイプで「MYSQL/Aurora」を選択)を許可するルールを設定
※EC2へアタッチしているセキュリティグループは送信先入力時の一覧からは確認できないため、セキュリティグループIDを別途メモしておく必要がある。
・RDSで使用しているセキュリティグループを変更
接続確認
mysql -h [RDSエンドポイント名] -P 3306 -u [ユーザ名] -p
エラーポイント
mysql -h [RDSエンドポイント名] -P 3306 -u [ユーザ名] -p
①RDSのセキュリティグループ不備
・設定済みのインバウンドルールを削除
ERROR 2003 (HY000): Can't connect to MySQL server on '[RDSエンドポイント名]:3306' (110)
②EC2側のルートテーブル不備
・RDS側のCIDRへのルート削除
ERROR 2003 (HY000): Can't connect to MySQL server on '[RDSエンドポイント名]:3306' (110)
③RDS側のルートテーブル不備
・EC2側のCIDRへのルートを削除
ERROR 2003 (HY000): Can't connect to MySQL server on '[RDSエンドポイント名]:3306' (110)
④EC2側のVPCでDNS解決の設定不備
・DNS解決の有効化を解除
ERROR 2005 (HY000): Unknown MySQL server host '[RDSエンドポイント名]' (-2)
※RDS側のVPCでのDNS設定は影響しない
まとめ
異なるVPC間でRDS↔EC2の通信を確立する方法を実施してみました。
EC2以外のリソースを用いて通信をする場合でも、本記事で紹介した設定内容と変わるものではないかと思いますので参考になればと思います。