从Python和AWS cookbook启动实例脚本不会创建任何实例

时间:2015-03-07 12:10:16

标签: python amazon-web-services boto

我目前正在通过O&#Re; Reilly出版的Python和AWS食谱。我目前正在查看我工作的启动实例脚本(哪个 - 有趣的故事 - 我认为没有用,直到我点击AWS中的另一个区域,看到我创建了大约50个实例来尝试获取脚本work ...适用于AWS新手的课程:始终设置并了解您的默认区域)。

现在由于某种原因,脚本似乎运行没有任何错误,但在交互式python shell中似乎没有打印出任何实例。我不知道我改变了什么来阻止这种工作。在我做过的一些测试中(基本上是以交互模式导入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)

有人可以帮忙吗?

1 个答案:

答案 0 :(得分: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:
    ...

同样适用于安全组处理 - 无论是否引发异常,您都希望继续,因此代码如下:

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, ....