🔧

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コンソールでの作業

  1. VPCコンソールサブネットサブネットを作成
  2. 設定項目:
    • VPC: 既存のVPC(10.0.0.0/16)を選択
    • サブネット名: private-subnet-2
    • アベイラビリティゾーン: 既存プライベートサブネットと異なるAZを選択
    • IPv4 CIDRブロック: 10.0.32.0/20

手順2: RDSサブネットグループの作成

RDSコンソールでの作業

  1. RDSコンソールサブネットグループDBサブネットグループを作成
  2. 設定項目:
    • 名前: my-db-subnet-group
    • 説明: RDS用サブネットグループ
    • VPC: 既存のVPCを選択
    • サブネット:
      • 10.0.16.0/20(既存プライベートサブネット)
      • 10.0.32.0/20(新規作成サブネット)

手順3: RDS用セキュリティグループの作成

EC2コンソールでの作業

  1. EC2コンソールセキュリティグループセキュリティグループを作成
  2. 設定項目:
    • セキュリティグループ名: rds-security-group
    • 説明: RDS用セキュリティグループ
    • VPC: 既存のVPCを選択
  3. インバウンドルールを追加:
    • タイプ: PostgreSQL
    • ポート: 5432
    • ソース: EC2のセキュリティグループを選択

手順4: RDSインスタンスの作成

RDSコンソールでの作業

  1. RDSコンソールデータベースデータベースを作成
  2. 主要設定:
    • エンジンタイプ: PostgreSQL
    • テンプレート: 無料利用枠
    • DBインスタンス識別子: my-rds-instance
    • マスターユーザー名: admin(任意の名前)
    • マスターパスワード: 強力なパスワードを設定
  3. 接続設定:
    • VPC: 既存のVPCを選択
    • DBサブネットグループ: 作成したサブネットグループを選択
    • パブリックアクセス: いいえ
    • VPCセキュリティグループ: 作成したRDS用セキュリティグループを選択

手順5: EC2のセキュリティグループ設定

重要:この手順を忘れがちです!

アウトバウンドルールの追加

EC2に割り当てられているセキュリティグループのアウトバウンドルールがデフォルトの「全てのプロトコル」になっている場合は良いのですが、そうでない場合には下記のアウトバウンドルールを追加する必要があります。

  1. EC2コンソールセキュリティグループ → EC2のセキュリティグループを選択
  2. アウトバウンドルールアウトバウンドルールを編集
  3. 最低限必要なルール:
    • 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)を追加

3. psqlコマンドで反応がない

確認手順:

  1. まずtelnetでポート疎通確認(pingは使用不可)
    telnet my-rds-instance.xxxxxxxxxx.ap-northeast-1.rds.amazonaws.com 5432
    
  2. セキュリティグループ設定の再確認
  3. RDSの状態が「利用可能」になっているか確認

4. pingで接続確認しようとして反応がない

原因: RDSはセキュリティ上、ICMPプロトコル(ping)に応答しません
解決: telnetまたはncコマンドでポート疎通確認を使用する

まとめ

AWS環境でEC2からプライベートサブネットのRDSに接続する際は、以下の点に注意:

  • RDSサブネットグループには複数AZが必要
  • EC2のアウトバウンドルール設定を忘れずに
  • セキュリティグループの相互参照設定が重要
  • ネットワーク疎通確認を段階的に実施

特にセキュリティグループの設定は見落としがちなので、接続できない場合は必ず確認しましょう。

参考情報

Discussion