tech2分で読める

AWS Systems Manager (Session Manager) を用いたセキュアなDB接続手法

SSH鍵管理や22番ポート開放を排したセキュアなDB接続手法として、AWS Systems Manager (Session Manager) の導入手順と、ローカル環境(Mac/DBeaver)からの接続方法、およびポート競合時の対処法について解説します。

#aws#ssm#database#dbeaver#mac#security

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 を前提に、以下のツールを使用します。

  1. DBeaver (DBクライアント)
  2. AWS CLI (インストール済みの前提)
  3. Session Manager Plugin (SSM接続用プラグイン)
  4. 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トンネル機能は使用しません。

設定手順

  1. DBeaverを起動し、「新しい接続」「MySQL」 (または対象DB) を選択します。
  2. 各タブを以下の通り設定します。

SSHタブ

  • SSHトンネルの使用: OFF (チェックを外す)
    • ※SSM経由でトンネルを確立するため、DBeaverのSSH機能は利用しません。

一般タブ

項目設定値備考
Server Hostlocalhostローカルポートへ接続するため
Port3306ポートフォワードで指定するローカルポート
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)のインスタンスID
  • host: 接続先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による一元的な権限管理とログ記録
  • 柔軟な接続: ローカルポートマッピングにより、任意のツールから接続可能

本番・ステージング環境への安全なアクセス手段として、ぜひ活用を検討してください。

RK

1997年生まれ

ITエンジニア

インフラ・SRE