2015-03-07 2 views
1

В настоящее время я работаю над кулинарной книгой Python и AWS из публикации O'Reilly. Я в настоящее время смотрю на сценарий запуска запуска, который у меня работал (что - забавная история - я не думал, что работаю, пока я не щелкнул по другому региону в AWS и не увидел, что я создал около 50 экземпляров, пытающихся запустить скрипт. .. Урок для людей, новых для AWS: всегда устанавливайте и знайте свой регион по умолчанию).Сценарий экземпляра запуска из кулинарной книги Python и AWS не создает никаких экземпляров

Теперь по какой-то причине сценарий запускается без ошибок, но в интерактивной оболочке python ничего не печатается и экземпляры не создаются. Я не знаю, что я изменил, чтобы остановить эту работу. В некоторых тестах, которые я сделал (в основном импортируя boto в интерактивном режиме и подключаясь к EC2 оттуда), он, кажется, успешно подключается, поэтому я понятия не имею, что вызывает это.

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

import os 
import time 
import boto 
import boto.manage.cmdshell 

def launch_instance(ami="i-7ef58184", 
        instance_type="t1.micro", 
        key_name="paws", 
        key_extension=".pem", 
        key_dir="~/.ssh", 
        group_name="paws", 
        ssh_port="22", 
        cidr="0.0.0.0/0", 
        tag="paws", 
        user_data=None, 
        cmd_shell=True, 
        login_user="ec2-user", 
        ssh_passwd=None): 
    cmd = None 

    ec2 = boto.connect_ec2() # Crededentials are stored in /etc/boto.cfg 
    ec2 = boto.connect_ec2(debug=2) 
    try: 
     key = ec2.get_all_key_pairs(keynames=[key_name])[0] 
    except ec2.ResponseError, e: 
     if e.code == 'InvalidKeyPair.NotFound': 
       print 'Creating keypair %s' % key_name 
       key = ec2.create_key_pair(key_name) 
       key.save(key_dir) 


     else: 
      raise 
     try: 
      group = ec2.get_all_security_groups(groupnames=[group_name])[0] 
     except ec2.ResponseError, e: 
      if e.code == 'InvalidGroup.NotFound': 
       print'Creating security group %s' % group_name 
       group = ec2.create_security_group(group_name, 
                'A group that allows SSH access') 
      else: 
       raise 
     try: 
      group.authorize('tcp',ssh_port,ssh_port,cidr) 
     except ec2.ResponseError, e: 
      if e.code == 'InvalidPermission.Duplicate': 
       print ('Security group %s already authorized') % group_name 
      else: 
       raise 
      reservation = ec2.run_instances(ami, 
             key_name=key_name, 
             security_groups=[group_name], 
             instance_type=instance_type, 
             user_data=user_data) 
      instance = reservation.instances[0] 
      print 'waiting for instance...' 
      while instance.state != 'running': 
       time.sleep(30) 
       instance.update() 
       print 'Instance is now running' 
       print 'Instance IP is %s' % instance.ip_address 
       instance.add_tag(tag) 


      if cmd_shell: 
       key_path = os.path.join(os.path.expanduser(key_dir), 
             key_name+key_extension) 
       cmd = boto.manage.sshclient_from_instance(instance, 
                  key_path, 
                  username=login_user) 
       return (instance, cmd) 

Может кто-нибудь помочь?

+0

И вы помните, чтобы вызвать 'launch_instance ' –

+0

@ Даррен Доу Добро пожаловать в StackOverflow! Я отредактировал ваш вопрос, надеясь, что его можно понять немного лучше. Надеюсь, вам все равно понравится :) –

+0

@AnttiHaapala Как вы имеете в виду, не помню ли я назвать start_instance? Я полный новичок с точки зрения Python, так что это очень вероятно? –

ответ

1

Ошибка в том, что вы создали весь код, который должен быть запущен в пределах except создания пары ключей. Поскольку вы уже создали ключи, и они доступны, исключение не выбрасывается, и весь блок except пропускается. Вам необходимо указать unindent/dedent Ваш следующий код на 4 места.

try: 
    key = ec2.get_all_key_pairs(keynames=[key_name])[0] 
except ec2.ResponseError, e: 
    if e.code == 'InvalidKeyPair.NotFound': 
      print 'Creating keypair %s' % key_name 
      key = ec2.create_key_pair(key_name) 
      key.save(key_dir) 


    else: 
     raise 

### this should be at this level 
try: 
    ... 

То же самое относится и к обработке групповой безопасности - вы хотите продолжать ли или не поднятая исключение, таким образом, dedent код следующим образом:

try: 
    group.authorize('tcp',ssh_port,ssh_port,cidr) 
except ec2.ResponseError, e: 
    if e.code == 'InvalidPermission.Duplicate': 
     print ('Security group %s already authorized') % group_name 
    else: 
     raise 

### from here on at this level 
reservation = ec2.run_instances(ami, .... 
Смежные вопросы