Как проверить, было ли установлено соединение SSH с экземпляром AWS

Я пытаюсь подключиться к экземпляру Amazon EC2 через SSH, используя 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()


person Vor    schedule 21.03.2013    source источник


Ответы (2)


Сообщение «Соединение SSH отклонено, повторная попытка через 5 секунд» исходит от boto: http://code.google.com/p/boto/source/browse/trunk/boto/manage/cmdshell.py.

Первоначально «работает» просто означает, что экземпляр начал загружаться. Пока sshd не работает, соединения с портом 22 отклоняются. Следовательно, то, что вы наблюдаете, абсолютно ожидаемо, если sshd не появляется в течение первых 25 секунд «работающего» состояния.

Поскольку невозможно предсказать, когда точно появится sshd, и в случае, если вы не хотите тратить время, просто определяя постоянный длительный период ожидания, вы можете реализовать свой собственный код опроса, который, например. С интервалом от 1 до 5 секунд проверяется доступность порта 22. Только если это вызывает 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()
person Dr. Jan-Philip Gehrcke    schedule 15.07.2013
comment
Спасибо, это очень умно. - person Vor; 15.07.2013

У меня есть 2 части: одна, чтобы проверить, работает ли экземпляр, а другая, чтобы проверить, доступен ли экземпляр.

# Get instance status till it is running
status_output=$(aws ec2 describe-instance-status --instance-ids $instance_id)
instance_status=$(jq -n "$status_output" | jq .InstanceStatuses[0] | jq .InstanceState.Name)
echo $instance_status
while [ ${instance_status:1:-1} != running ]
do
    status_output=$(aws ec2 describe-instance-status --instance-ids $instance_id)
    instance_status=$(jq -n "$status_output" | jq .InstanceStatuses[0] | jq .InstanceState.Name)
    echo $instance_status
done

# Get instance reachability till it is ready 
status_output=$(aws ec2 describe-instance-status --instance-ids $instance_id)
instance_reachability=$(jq -n "$status_output" | jq .InstanceStatuses[0] | jq .InstanceStatus.Status)
echo $instance_reachability
while [ ${instance_reachability:1:-1} != ok ]
do
    status_output=$(aws ec2 describe-instance-status --instance-ids $instance_id)
    instance_reachability=$(jq -n "$status_output" | jq .InstanceStatuses[0] | jq .InstanceStatus.Status)
    echo $instance_reachability
done
person David Millet    schedule 16.09.2020