AWS Systems Manager (Session Manager) を用いたセキュアなDB接続手法
SSH鍵管理や22番ポート開放を排したセキュアなDB接続手法として、AWS Systems Manager (Session Manager) の導入手順と、ローカル環境(Mac/DBeaver)からの接続方法、およびポート競合時の対処法について解説します。
AWS Systems Manager (Session Manager) を用いたセキュアなDB接続手法
従来の「踏み台サーバー(Bastion)へのSSH接続」によるDBアクセスは、SSH鍵の管理やセキュリティグループでのインバウンドポート開放(22番)など、セキュリティと運用管理の両面で課題がありました。
本記事では、これらの課題を解決する AWS Systems Manager (SSM) Session Manager を用いたDB接続手法について、具体的なセットアップ手順と接続方法を解説します。
なぜ SSM (Session Manager) なのか
SSM Session Manager を利用することで、踏み台サーバーをパブリックサブネットに配置する必要がなくなり、よりセキュアな構成を実現できます。
従来のSSH接続との比較
| 項目 | 従来のSSH踏み台 | SSM Session Manager |
|---|---|---|
| インターネット公開 | 必要 (パブリックIP必須) | 不要 (完全プライベートでOK) |
| ポート開放 | 22番 (SSH) の開放が必要 | インバウンド開放不要 (アウトバウンドのみ) |
| 認証方式 | SSH鍵ペアの管理が必要 | IAM認証 (鍵管理不要) |
| アクセス制御 | その都度設定 | IAMポリシー で一元管理 |
| 操作ログ | OS内ログ設定が必要 | S3/CloudWatchへ自動保存 |
環境構築 (macOS)
本手順では macOS を前提に、以下のツールを使用します。
- DBeaver (DBクライアント)
- AWS CLI (インストール済みの前提)
- Session Manager Plugin (SSM接続用プラグイン)
- AWS Credentials (IAMユーザー設定)
AWS SSM Plugin のインストール
AWS CLIに加え、ポートフォワード機能を利用するためのプラグインが必要です。 以下のコマンドでインストールを行います。
Apple Silicon (M1/M2/M3...) の場合:
# バンドルをダウンロード curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/mac_arm64/sessionmanager-bundle.zip" -o "sessionmanager-bundle.zip" # 解凍 unzip sessionmanager-bundle.zip # インストール実行 sudo ./sessionmanager-bundle/install -i /usr/local/sessionmanagerplugin -b /usr/local/bin/session-manager-plugin
Intel Mac の場合:
ダウンロードURLの mac_arm64 部分を mac に変更してください。
インストール後、以下のコマンドで正常性を確認します。
$ session-manager-plugin The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.
DBeaverでの接続設定
SSMのポートフォワード機能を利用するため、DBeaver側では「ローカルホストへの接続」として設定します。SSHトンネル機能は使用しません。
設定手順
- DBeaverを起動し、「新しい接続」 → 「MySQL」 (または対象DB) を選択します。
- 各タブを以下の通り設定します。
SSHタブ
- SSHトンネルの使用: OFF (チェックを外す)
- ※SSM経由でトンネルを確立するため、DBeaverのSSH機能は利用しません。
一般タブ
| 項目 | 設定値 | 備考 |
|---|---|---|
| Server Host | localhost | ローカルポートへ接続するため |
| Port | 3306 | ポートフォワードで指定するローカルポート |
| Database | (DB名) | 接続対象のDB名 |
| User name | (DBユーザー名) | |
| Password | (DBパスワード) |
DBへの接続実行
SSMの ポートフォワード (Port Forwarding) 機能を利用し、AWS上のDBポートをローカルPCのポートにマッピングします。
1. ポートフォワードの開始
ターミナルで以下のコマンドを実行し、セッションを開始します。
aws ssm start-session \ --target {EC2インスタンスID} \ --document-name AWS-StartPortForwardingSessionToRemoteHost \ --parameters '{"host":["{RDSのエンドポイント}"],"portNumber":["3306"], "localPortNumber":["33306"]}'
target: SSMエージェントが導入された踏み台(EC2)のインスタンスIDhost: 接続先RDSのエンドポイントportNumber: RDS側のポート番号localPortNumber: ローカルPC側で受付けるポート番号
2. 接続確認
セッションが確立すると以下のように表示されます。 このターミナルウィンドウは、接続中は 開いたまま にしてください。
Starting session with SessionId: xxxx-xxxx... Port 3306 opened for sessionId xxxx-xxxx... Waiting for connections...
3. クライアントからの接続
DBeaver等のクライアントから接続テストを行い、正常に疎通できることを確認してください。
補足:ローカルDBとのポート競合について
開発環境などでDocker (MySQLコンテナ) やローカルDBを起動している場合、デフォルトのポート 3306 が既に使用されていることがあります。
競合時のエラー
ポート 3306 が既に使用されている状態で aws ssm start-session を実行すると、ポートバインドに失敗し、セッションが開始されません(または即座に終了します)。
対処法:ローカルポートの変更
この場合、localPortNumber パラメータを変更し、空いているポート(例: 3307)を使用します。
コマンド例 (3307番ポートを使用):
aws ssm start-session \ --target {EC2インスタンスID} \ --document-name AWS-StartPortForwardingSessionToRemoteHost \ --parameters '{"host":["{RDSのエンドポイント}"],"portNumber":["3306"], "localPortNumber":["3307"]}'
DBeaver設定の変更:
DBeaver側の接続設定でも、ポート番号を 3306 から 3307 に変更してください。これにより、ローカルのDocker環境とAWS接続環境を共存させることが可能です。
まとめ
SSM Session Manager を利用することで、以下のメリットが得られます。
- セキュリティ向上: ポート開放や鍵管理のリスクを排除
- 運用負荷軽減: IAMによる一元的な権限管理とログ記録
- 柔軟な接続: ローカルポートマッピングにより、任意のツールから接続可能
本番・ステージング環境への安全なアクセス手段として、ぜひ活用を検討してください。