python - precio - Recuperando dns públicos de instancia de EC2 con BOTO3
precio elastic ip amazon (1)
Estoy usando ipython para comprender Boto3 e interactuar con las instancias de EC2. Aquí está el código que estoy usando para crear una instancia:
import boto3
ec2 = boto3.resource(''ec2'')
client = boto3.client(''ec2'')
new_instance = ec2.create_instances(
ImageId=''ami-d05e75b8'',
MinCount=1,
MaxCount=1,
InstanceType=''t2.micro'',
KeyName=<name_of_my_key>,
SecurityGroups=[''<security_group_name>''],
DryRun = False
)
Esto inicia bien una instancia de EC2 y puedo obtener el nombre DNS público, la ip y otra información de la consola de AWS. Pero cuando trato de obtener el DNS público usando Boto, al hacer esto:
new_instance[0].public_dns_name
Devuelve citas en blanco. Sin embargo, otros detalles de la instancia, como:
new_instance[0].instance_type
Devuelve la información correcta.
¿Algunas ideas? Gracias.
EDITAR:
Entonces si lo hago:
def get_name(inst):
client = boto3.client(''ec2'')
response = client.describe_instances(InstanceIds = [inst[0].instance_id])
foo = response[''Reservations''][0][''Instances''][0][''NetworkInterfaces''][0][''Association''][''PublicDnsName'']
return foo
foo = get_name(new_instance)
print foo
Luego devolverá el DNS público. Pero no tiene sentido para mí por qué tengo que hacer todo esto.
El objeto Instance
que recuperas solo está hidratado con los atributos de respuesta de la llamada create_instances
. Dado que el nombre DNS no está disponible hasta que la instancia haya alcanzado el estado en ejecución [1] , no estará presente inmediatamente. Imagino que el tiempo entre la creación de la instancia y la invocación de las instancias de descripción es suficiente para que comience la microinstancia.
import boto3
ec2 = boto3.resource(''ec2'')
instances = ec2.create_instances(
ImageId=''ami-f0091d91'',
MinCount=1,
MaxCount=1,
InstanceType=''t2.micro'',
KeyName=''<KEY-NAME>'',
SecurityGroups=[''<GROUP-NAME>''])
instance = instances[0]
# Wait for the instance to enter the running state
instance.wait_until_running()
# Reload the instance attributes
instance.load()
print(instance.public_dns_name)