AWS EC2からプライベートサブネットのRDSに接続する手順
はじめに
AWS環境でEC2インスタンスからプライベートサブネット上にRDSのインスタンスを立てる作業を行いましたので、自分の備忘録のためにここにまとめました。
主にコンソールでの作業で進めています。
セキュリティグループの設定でハマりがちなポイントも含めて記載します。
前提環境
VPCのIPアドレスは説明をわかりやすくするために仮定して説明します。
今回はPostgreSQLを使用して無料枠での作成を行います。
- VPC: 10.0.0.0/16
- パブリックサブネット: 10.0.0.0/20(IGW接続済み)
- プライベートサブネット: 10.0.16.0/20(IGW接続なし)
- EC2: パブリックサブネット上に配置済み
- RDS: PostgreSQLを使用
手順1: 追加プライベートサブネットの作成
RDSサブネットグループには最低2つの異なるAZが必要なため、追加のプライベートサブネットを作成します。
VPCコンソールでの作業
- VPCコンソール → サブネット → サブネットを作成
- 設定項目:
- VPC: 既存のVPC(10.0.0.0/16)を選択
- サブネット名:
private-subnet-2
- アベイラビリティゾーン: 既存プライベートサブネットと異なるAZを選択
- IPv4 CIDRブロック:
10.0.32.0/20
手順2: RDSサブネットグループの作成
RDSコンソールでの作業
- RDSコンソール → サブネットグループ → DBサブネットグループを作成
- 設定項目:
- 名前:
my-db-subnet-group
- 説明:
RDS用サブネットグループ
- VPC: 既存のVPCを選択
- サブネット:
-
10.0.16.0/20
(既存プライベートサブネット) -
10.0.32.0/20
(新規作成サブネット)
-
- 名前:
手順3: RDS用セキュリティグループの作成
EC2コンソールでの作業
- EC2コンソール → セキュリティグループ → セキュリティグループを作成
- 設定項目:
- セキュリティグループ名:
rds-security-group
- 説明:
RDS用セキュリティグループ
- VPC: 既存のVPCを選択
- セキュリティグループ名:
-
インバウンドルールを追加:
- タイプ: PostgreSQL
- ポート: 5432
- ソース: EC2のセキュリティグループを選択
手順4: RDSインスタンスの作成
RDSコンソールでの作業
- RDSコンソール → データベース → データベースを作成
- 主要設定:
- エンジンタイプ: PostgreSQL
- テンプレート: 無料利用枠
- DBインスタンス識別子:
my-rds-instance
- マスターユーザー名:
admin
(任意の名前) - マスターパスワード: 強力なパスワードを設定
- 接続設定:
- VPC: 既存のVPCを選択
- DBサブネットグループ: 作成したサブネットグループを選択
- パブリックアクセス: いいえ
- VPCセキュリティグループ: 作成したRDS用セキュリティグループを選択
手順5: EC2のセキュリティグループ設定
重要:この手順を忘れがちです!
アウトバウンドルールの追加
EC2に割り当てられているセキュリティグループのアウトバウンドルールがデフォルトの「全てのプロトコル」になっている場合は良いのですが、そうでない場合には下記のアウトバウンドルールを追加する必要があります。
- EC2コンソール → セキュリティグループ → EC2のセキュリティグループを選択
- アウトバウンドルール → アウトバウンドルールを編集
- 最低限必要なルール:
- HTTP (ポート80): パッケージダウンロード用
- HTTPS (ポート443): パッケージダウンロード用
- PostgreSQL (ポート5432): RDS接続用
手順6: EC2にPostgreSQLクライアントをインストール
EC2にSSHでログイン後、PostgreSQLクライアントをインストールします。
Amazon Linux 2023の場合
# システムアップデート
sudo dnf update -y
# PostgreSQLクライアントのインストール
sudo dnf install postgresql15 -y
# インストール確認
psql --version
手順7: 接続確認とトラブルシューティング
RDSへの疎通確認
# ❌ pingは応答しない(正常な動作)
ping my-rds-instance.xxxxxxxxxx.ap-northeast-1.rds.amazonaws.com
# → タイムアウトしますが、これは正常です
# ✅ telnetでポート疎通確認(推奨)
telnet my-rds-instance.xxxxxxxxxx.ap-northeast-1.rds.amazonaws.com 5432
# ✅ ncコマンドでの確認(代替手段)
nc -zv my-rds-instance.xxxxxxxxxx.ap-northeast-1.rds.amazonaws.com 5432
telnetがインストールされていない場合は、
# telnetインストール
sudo dnf install telnet -y
telnetの結果例:
# 接続成功の場合
$ telnet my-rds-instance.xxxxxxxxxx.ap-northeast-1.rds.amazonaws.com 5432
Trying 10.0.x.x...
Connected to my-rds-instance.xxxxxxxxxx.ap-northeast-1.rds.amazonaws.com.
Escape character is '^]'.
# 接続失敗の場合(セキュリティグループ問題)
$ telnet my-rds-instance.xxxxxxxxxx.ap-northeast-1.rds.amazonaws.com 5432
Trying 10.0.x.x...
telnet: connect to address 10.0.x.x: Connection timed out
RDSへの接続テスト
# PostgreSQLクライアントでRDSに接続
psql -h my-rds-instance.xxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -U [adminユーザー名] -d postgres
接続パラメータの確認方法:
-
-h
: RDSコンソールのエンドポイント -
-U
: RDS作成時に設定したマスターユーザー名 -
-d
: 初期データベース名(未指定ならpostgres
)
手順8: データベース内容の確認
接続に成功したら、基本的なPostgreSQLコマンドでデータベースを確認できます。
基本的な確認コマンド
-- 接続情報確認
\conninfo
-- データベース一覧
\l
-- テーブル一覧
\dt
-- 現在のユーザー確認
SELECT current_user;
-- PostgreSQLバージョン確認
SELECT version();
-- 終了
\q
よくあるトラブルと解決方法
1. パッケージインストールが固まる
原因: EC2のセキュリティグループにアウトバウンドルールが設定されていない
解決: HTTP/HTTPSのアウトバウンドルールを追加
2. RDSに接続できない
原因: RDSのセキュリティグループがEC2からの接続を許可していない
解決: RDSセキュリティグループのインバウンドルールにPostgreSQLポート(5432)を追加
psql
コマンドで反応がない
3. 確認手順:
-
まずtelnetでポート疎通確認(pingは使用不可)
telnet my-rds-instance.xxxxxxxxxx.ap-northeast-1.rds.amazonaws.com 5432
- セキュリティグループ設定の再確認
- RDSの状態が「利用可能」になっているか確認
4. pingで接続確認しようとして反応がない
原因: RDSはセキュリティ上、ICMPプロトコル(ping)に応答しません
解決: telnetまたはncコマンドでポート疎通確認を使用する
まとめ
AWS環境でEC2からプライベートサブネットのRDSに接続する際は、以下の点に注意:
- RDSサブネットグループには複数AZが必要
- EC2のアウトバウンドルール設定を忘れずに
- セキュリティグループの相互参照設定が重要
- ネットワーク疎通確認を段階的に実施
特にセキュリティグループの設定は見落としがちなので、接続できない場合は必ず確認しましょう。
Discussion