この記事では、Vagrantで構築したローカル開発環境から、AWS上のEC2インスタンスを踏み台にして、Amazon DocumentDBへ安全に接続する方法を紹介します。
公開鍵ではなくパスワード認証を使いたいケースに対応し、接続中に発生する「client_loop: send disconnect: Broken pipe」というエラーの原因とその対処法も丁寧に解説します。
前提条件
以下の環境を前提としています。
- Vagrant上に構築されたUbuntuの仮想マシン
- AWS上に立ち上げたEC2インスタンス
- AWSのDocumentDBが適切に構築され、EC2インスタンスと同じVPC内にある
- EC2にはパスワード認証でSSH接続できるように設定済み(セキュリティグループなど含む)
SSHトンネルを使ってDocumentDBに接続する
まず、ローカルのVagrant環境から、AWSのEC2を経由してDocumentDBに接続するには、SSHトンネルを使います。
SSHトンネルとは、暗号化された安全な通信の通り道を作る仕組みです。
以下は、パスワード認証を使ったSSHトンネルのコマンド例です。
ssh -L 27017:ドキュメントDBのエンドポイント:27017 \
-o PubkeyAuthentication=no \
-o PreferredAuthentications=password \
-o PasswordAuthentication=yes \
ユーザー名@EC2のIPアドレス
-L 27017:...:27017:ローカルのポート(27017)をDocumentDBへ転送PubkeyAuthentication=no:公開鍵による認証を使わないPreferredAuthentications=password:パスワードによる認証を優先ユーザー名@EC2のIPアドレス:AWSのEC2にログインするための情報
このコマンドを実行すると、ローカルマシンのlocalhost:27017に接続することで、実際はEC2を経由してDocumentDBへ通信が流れます。
「client_loop: send disconnect: Broken pipe」エラーの原因と対処法
このエラーは、SSH接続が途中で切れてしまったことを意味しています。原因としては以下のようなものがあります。
通信のアイドル時間によるタイムアウト
一定時間何も操作がないと、サーバーが接続を切断してしまうことがあります。
サーバー側のSSH設定が厳しい
SSHサーバー(EC2側)の設定で、アイドル状態のクライアントをすぐに切断するようになっている可能性があります。
クライアント側の設定不足
SSHクライアント(Vagrant側)の設定が最適化されていない可能性もあります。
サーバー側のSSH設定を確認・修正する
EC2インスタンスにSSHでログインし、次のファイルを編集します。
sudo nano /etc/ssh/sshd_config
以下の項目がなければ追加、または調整します。
ClientAliveInterval 60
ClientAliveCountMax 3
この設定は「60秒ごとにクライアントに確認メッセージを送り、それに3回応答がなければ切断する」という意味です。これにより、タイムアウトまでの時間が延長されます。
設定を保存したら、次のコマンドでSSHサービスを再起動します。
sudo systemctl restart ssh
クライアント側(Vagrant)のSSH設定を調整する
Vagrant上のホームディレクトリにある以下の設定ファイルを編集します。
nano ~/.ssh/config
次のように設定を追加します。
Host 任意のホスト名
HostName EC2のIPアドレス
User ユーザー名
PubkeyAuthentication no
PreferredAuthentications password
PasswordAuthentication yes
ServerAliveInterval 60
ServerAliveCountMax 3
この設定は、通信が途切れないように定期的にサーバーに信号を送り続けるものです。
これにより「Broken pipe」エラーの発生を防ぐことができます。
DocumentDBへの接続確認
SSHトンネルが正しく張られていれば、Node.jsやMongoDBクライアントから、以下のようにローカルのポートに接続するだけで、DocumentDBにアクセスできます。
mongodb://localhost:27017
接続確認には、MongoDBのクライアントツール(例:Compass)やNode.jsのライブラリ(例:mongoose)を使うと便利です。
まとめ
Vagrant環境からAWSのDocumentDBに接続するには、EC2インスタンスを踏み台にしてSSHトンネルを構築するのが安全で便利な方法です。パスワード認証を使いたい場合は、SSHの設定を工夫すれば問題なく動作します。
一方で、「Broken pipe」のようなエラーは、適切なSSH設定を行うことで回避可能です。クライアント側とサーバー側の両方にタイムアウト対策を施すことで、安定した接続を維持できます。
安全な設計と効率的な接続で、快適な開発環境を築いていきましょう。


コメント