はじめに
現在、個人開発や友人とのプロジェクトでインフラの構築が必要になったため、次の技術書でAWSの学習をしています。
- AWSではじめるインフラ構築入門 第2版 安全で堅牢な本番環境のつくり方(タイトルが長いため入門書と記載)
入門書のp134、第6章、リスト6.1を参考にAWS環境上の踏み台サーバー経由で同環境内のウェブサーバーに多段接続でアクセスをしました。この際、エラーメッセージ(command not found: ssh.exe
)が表示され、接続できませんでした。その時の対応記録として本記事を執筆しました。ご参考になれば幸いです。
多段接続についてはこちらの記事を参照してください。本記事の趣旨ではないため割愛します。これからは前提条件と環境について説明した後、より詳細に状況が伝わるようにエラーが起こるまでの手順を時系列で並べています。その後、エラーの原因とその解決方法について解説しています。
それでは解説スタートです。
目次
前提と環境について
- PCはMacを使用
- Apple M3
- メモリ:8GB
- 踏み台サーバーとWebサーバーはAWSの同一VPC内に存在。
- 踏み台サーバーはバプリック環境に構築
- Webサーバーはプライベート環境に構築
- IPアドレスやルートテーブル、セキュリティグループ、コマンドのスペルなどは全て正しい前提
- もしIPアドレスやルートテーブルの設定に不備がある場合は、別途解決する必要があり。本記事では解説していないが頻出のエラー。
AWS上にある踏み台サーバーとWebサーバーを図示すると次の通りです。
やっていたこと(時系列)
AWSの技術習得を目的としてAWSで環境構築を実施。Webサーバーを作成した後、そのWebサーバーに踏み台サーバー経由でアクセスすることで、接続と稼働の確認を行おうとしていました。
具体的には、手元の端末(Mac)から、Public subnet内にある踏み台サーバー(bastion)経由でPriate subnet内にある二つのWebサーバー、web01とweb02へアクセスを試みていました。
より具体的な手順は次の通りです。
- AWSで踏み台サーバー、Webサーバーを構築
多段接続するためのconfigファイルを作成。
- .sshフォルダ配下フォルダの構成
. ├── config └── nakagaki.pem(この部分はお使いの認証設定によります)
- configファイルの中身
Host bastion HostName (踏み台サーバーのIPアドレス) User (踏み台サーバーのユーザー) IdentityFile ~/.ssh/(使用中のpemファイル) Host web01 HostName (1つ目のWebサーバーのIPアドレス) User (1つ目のWebサーバーのIPアドレス) IdentityFile ~/.ssh/(使用中のpemファイル) ProxyCommand ssh.exe bastion -W %h:%p Host web02 HostName (2つ目のWebサーバーのIPアドレス) User (2つ目のWebサーバーのIPアドレス) IdentityFile ~/.ssh/(使用中のpemファイル) ProxyCommand ssh.exe bastion -W %h:%p
Terminalで
ssh web01
またはssh web02
を入力し実行- この段階で
command not found: ssh.exe
エラー(今回解決したいエラー)が発生
- この段階で
それではエラーの原因とその解決方法について次から解説していきます。
エラーメッセージの原因について
エラーメッセージ:command not found: ssh.exe
エラーメッセージの原因はMacにssh.exe
コマンドがないからです。
このメッセージはssh.exe
コマンドがご利用中の端末にないですよと知らせてくれています。 入門書ではWindowsを基準にしていたためこのようなエラーに遭遇しました。Windowsだとssh.exe
と書いていると動作しますが、Macの場合はssh
にする必要があるんですね。
これはWindowsとMacの違いによるものです。
WindowsではSSH接続を使用するとき組み込みのSSHクライアントを使用します(こちらを参照。Windows ターミナル SSH | Microsoft Learn)。
そしてWindowsのSSHクライアントではssh.exe
を使用しています(こちらを参照。SSH 経由の PowerShell リモート処理 - PowerShell | Microsoft Learn)。
一方でMacでSSH接続をする場合は、OpenSSHを使用しています。自身で使用しているMacでSSHのバージョンを調べたらOpenSSHでした。バージョンの調べかたは次のコマンドをTerminalで実行してください。ssh -V
そしてOpenSSHで使用しているSSHクライアントがsshです。OpenSSHの公式ページはこちら→ssh(1) - OpenBSD manual pages。
まとめるとSSH接続時にはWidonwsではWindowsに組み込まれているSSHクライアント(ssh.exe
)を使用し、MacではOpenSSHのSSHクライアント(ssh
)を使用しています。そのため、Windowsではssh.exe
と書けば動作しますが、Macではssh
と書かなければ動作しません。
WindowsとMac、Linuxの違いを意識しながらトラブルシュートする必要性を改めて考えさせられた出来事でした。
原因がわかったため次に解決方法を解説します。
エラーメッセージ:の解決方法
ssh.exe
の部分をssh
に変更するとエラーが解決します。
具体的には多段接続するためのファイル(config
)を「変更前」の箇所を「変更後」のように変更してください。変更前のssh.exe
をssh
に変更します。
変更前
ProxyCommand ssh.exe bastion -W %h:%p
変更後
ProxyCommand ssh bastion -W %h:%p
次にconfigファイルの全文を載せていますのでご参考にしてください。下記に記載のIPアドレスやユーザー名、.pem ファイルの名称がご自身の環境に合っていないとエラーの原因になりますのでご注意ください。()
の部分をご自身の環境に置き換えてもらうと助かります。
変更後configファイルの全文
Host bastion HostName (踏み台サーバーのIPアドレス) User (踏み台サーバーのユーザー) IdentityFile ~/.ssh/(使用中のpemファイル) Host web01 HostName (1つ目のWebサーバーのIPアドレス) User (1つ目のWebサーバーのIPアドレス) IdentityFile ~/.ssh/(使用中のpemファイル) ProxyCommand ssh bastion -W %h:%p Host web02 HostName (2つ目のWebサーバーのIPアドレス) User (2つ目のWebサーバーのIPアドレス) IdentityFile ~/.ssh/n(使用中のpemファイル) ProxyCommand ssh bastion -W %h:%p
まとめ
command not found: ssh.exe
が出たときは基本的に次の原因を疑ってみてください。
- コマンドがあるか?
- コマンドがない場合はインストール
- 今回のようにWindowsとMacの違いによるもの
上記のエラー以外にも踏み台サーバーやWebサーバーに繋がらない原因としては次のものも考えられるため、参考になれば幸いです。
- IPアドレス間違い
- スペルミス
- 名称が間違っている
- ユーザー名が違う
- 複数のユーザーや独自の環境設定を行なっている場合は特に当てはまりやすい
- ファイルのパスが間違っている
以上、 ここまで読んでいただきありがとうございました。またお会いできることを楽しみにしています。
参考文献
- AWSではじめるインフラ構築入門 第2版 安全で堅牢な本番環境のつくり方, https://amzn.asia/d/03P6qKf
- \~/.ssh/configについて #SSH - Qiita