Подтвердить что ты не робот

Как автоматически назначить публичный ip для экземпляра EC2 с помощью boto

Мне нужно запустить новый компьютер с ec2.run_instances в данной подсети, но также иметь общедоступную функцию ip auto (не фиксированный эластичный ip).

Когда вы запускаете новый компьютер из Amazon web EC2 Manager через экземпляр запроса (данные экземпляра), есть флажок Назначить публичный IP для автоматического назначения публичного IP-адреса. См. Его на скриншоте:

Request Instance wizard

Как я могу достичь этой функциональности с помощью boto?

4b9b3361

Ответ 1

Интересно, кажется, что не так много людей столкнулись с этой проблемой. Для меня было очень важно иметь возможность сделать это правильно. Без этой функциональности вы не можете связаться с Интернетом из экземпляров, запущенных в nondefault subnet.

Документация boto не помогла, недавно была исправлена ​​связанная ошибка, см. по адресу https://github.com/boto/boto/pull/1705.

Важно отметить, что subnet_id и безопасность groups должны быть предоставлены сетевому интерфейсу NetworkInterfaceSpecification вместо run_instance.

import time
import boto
import boto.ec2.networkinterface

from settings.settings import AWS_ACCESS_GENERIC

ec2 = boto.connect_ec2(*AWS_ACCESS_GENERIC)

interface = boto.ec2.networkinterface.NetworkInterfaceSpecification(subnet_id='subnet-11d02d71',
                                                                    groups=['sg-0365c56d'],
                                                                    associate_public_ip_address=True)
interfaces = boto.ec2.networkinterface.NetworkInterfaceCollection(interface)

reservation = ec2.run_instances(image_id='ami-a1074dc8',
                                instance_type='t1.micro',
                                #the following two arguments are provided in the network_interface
                                #instead at the global level !!
                                #'security_group_ids': ['sg-0365c56d'],
                                #'subnet_id': 'subnet-11d02d71',
                                network_interfaces=interfaces,
                                key_name='keyPairName')

instance = reservation.instances[0]
instance.update()
while instance.state == "pending":
    print instance, instance.state
    time.sleep(5)
    instance.update()

instance.add_tag("Name", "some name")

print "done", instance

Ответ 2

boto3 имеет NetworkInterfaces, который вы можете настроить для DeviceIndex = 0, а Subnet и SecurityGroupIds следует переместить с уровня экземпляра на этот блок. Здесь рабочая версия для меня,

def launch_instance(ami_id, name, type, size, ec2):
   rc = ec2.create_instances(
    ImageId=ami_id,
    MinCount=1,
    MaxCount=1,
    KeyName=key_name,
    InstanceType=size,
    NetworkInterfaces=[
        {
            'DeviceIndex': 0,
            'SubnetId': subnet,
            'AssociatePublicIpAddress': True,
            'Groups': sg
        },
    ]
   )

   instance_id = rc[0].id
   instance_name = name + '-' + type
   ec2.create_tags(
    Resources = [instance_id],
    Tags = [{'Key': 'Name', 'Value': instance_name}]
   )

   return (instance_id, instance_name)

Ответ 3

Никогда не работал с этой функцией сам, но вызов run_instances имеет параметр network_interfaces. В соответствии с документацией вы можете указать там IP-адреса.