2013-09-26 12 views
19

Devo avviare una nuova macchina con ec2.run_instances in una sottorete specifica ma anche avere un IP pubblico assegnato automaticamente (ip fisso non fisso).Come assegnare automaticamente l'ip pubblico all'istanza EC2 con boto

Quando si inizia una nuova macchina da web EC2 Responsabile del Amazon tramite la richiesta (dettagli istanza) Istanza c'è un check-box chiamato Assegna Public IP Auto-assegnazione IP pubblico. Vedi evidenziato nello screenshot:

Request Instance wizard

Come posso ottenere che la funzionalità check-box con boto?

risposta

38

È interessante notare che non molte persone hanno avuto questo problema. Per me è stato molto importante essere in grado di farlo bene. Senza questa funzionalità non è possibile raggiungere Internet da istanze che vengono avviate in uno nondefault subnet.

La documentazione di boto non ha fornito alcun aiuto, è stato recentemente risolto un bug correlato, vedere a: https://github.com/boto/boto/pull/1705.

E 'importante notare che il subnet_id e la sicurezza groups devono essere forniti per l'interfaccia di rete NetworkInterfaceSpecification invece di 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

Chiunque ha questo errore mentre lo fa? 'Il parametro associatePublicIPAddress non può essere specificato per un'interfaccia di rete con un ID. – qwwqwwq

+0

sì, apparentemente non è possibile creare prima l'interfaccia se si desidera un IP pubblico. Aggiungerò una risposta per boto3 che riflette questo. [oh aspetta, non devo. vedi i barryku] –

0

Non ho mai lavorato con questa funzione, ma la chiamata run_instances ha un parametro chiamato network_interfaces. Secondo lo documentation è possibile fornire dettagli sull'indirizzo IP.

+0

In effetti si deve utilizzare l'interfaccia di rete, ma purtroppo la documentazione non è stata utile, ho finito per leggere il codice e l'API amazon ec2. – sanyi

6

boto3 ha NetworkInterfaces è possibile configurare per DeviceIndex = 0, e la sottorete e SecurityGroupIds deve essere spostato dal livello di istanza a questo blocco, invece. Ecco una versione funzionante per me,

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) 
Problemi correlati