python amazon-web-services amazon-ec2 boto

python - Cómo asignar automáticamente ip pública a la instancia de EC2 con boto



amazon-web-services amazon-ec2 (3)

Nunca trabajé con esta función, pero la llamada run_instances tiene un parámetro llamado network_interfaces . De acuerdo con la documentation usted puede proporcionar los detalles de la dirección IP allí.

Tengo que iniciar una nueva máquina con ec2.run_instances en una subred determinada, pero también tengo una ip pública asignada automáticamente (no ip elástica fija).

Cuando se inicia una nueva máquina desde el administrador de EC2 web de Amazon a través de la instancia de solicitud (detalles de la instancia), hay una casilla de verificación llamada Asignar IP pública para asignar automáticamente la IP pública. Véalo resaltado en la captura de pantalla:

¿Cómo puedo lograr esa funcionalidad de casilla de verificación con boto ?


boto3 tiene NetworkInterfaces que puede configurar para DeviceIndex = 0, y la Subred y SecurityGroupIds deben moverse desde el nivel de instancia a este bloque. Aquí hay una versión de trabajo para mí,

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)


Curiosamente, parece que no muchas personas tuvieron este problema. Para mí fue muy importante poder hacer esto bien. Sin esta funcionalidad, uno no puede acceder a Internet desde instancias que se nondefault subnet en una nondefault subnet .

La documentación de boto no proporcionó ayuda, se corrigió un error relacionado recientemente, consulte: https://github.com/boto/boto/pull/1705 .

Es importante tener en cuenta que el subnet_id y los groups seguridad deben proporcionarse a la interfaz de red NetworkInterfaceSpecification lugar de 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