9

を使用して SSH 経由で Amazon EC2 インスタンスに接続しようとしていますboto。インスタンスが作成されてからしばらくすると、ssh接続が確立できることがわかりました。だから私の質問は:

  • インスタンスで SSH が稼働しているかどうかを確認できますか? (もしそうなら、どのように?)
  • または、どのように出力を確認できboto.manage.cmdshell.sshclient_from_instance()ますか? たとえば、出力に が出力された場合はCould not establish SSH connection、もう一度やり直してください。

それは私がこれまでに試したことですが、運がありません:

if instance.state == 'running':
    retry = True
    while retry:
        try:
            print 'Connecting to ssh'
            key_path = os.path.join(os.path.expanduser('~/.ssh'), 'secret_key.pem')
            cmd = boto.manage.cmdshell.sshclient_from_instance(instance,
                                                               key_path,
                                                               user_name='ec2-user')

            print instance.update()
            if cmd:
                retry = False
        except:
            print 'Going to sleep'
            time.sleep(10)

SSH Connection refused, will retry in 5 seconds
SSH Connection refused, will retry in 5 seconds
SSH Connection refused, will retry in 5 seconds
SSH Connection refused, will retry in 5 seconds
SSH Connection refused, will retry in 5 seconds
Could not establish SSH connection

もちろん、しばらくすると同じコードを起動して接続を確立し、使用できるようになるため、すべてが正常に機能しています。cmd.shell()

4

2 に答える 2

7

「SSH 接続が拒否されました。5 秒後に再試行します」というメッセージが boto から送信されています: http://code.google.com/p/boto/source/browse/trunk/boto/manage/cmdshell.py

最初は、「実行中」は、インスタンスが起動を開始したことを示しているだけです。が稼働していない限り、sshdポート 22 への接続は拒否されます。したがって、sshd「実行中」状態の最初の 25 秒以内に が表示されない場合は、当然のことです。

いつ正確に起動するか予測できないためsshd、一定の長い待機期間を定義するだけで時間を無駄にしたくない場合は、ポート 22 が到達可能かどうかを 1 ~ 5 秒間隔でチェックする独自のポーリング コードを実装できます。invoke の場合のみboto.manage.cmdshell.sshclient_from_instance()

特定のホストの特定の TCP ポートが到達可能かどうかをテストする簡単な方法は、socketモジュールを使用することです。

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
    s.connect(('hostname', 22))
    print "Port 22 reachable"
except socket.error as e:
    print "Error on connect: %s" % e
s.close()
于 2013-07-15T14:25:53.590 に答える