2016-01-11 5 views
7

Ich benutze Ipython, um ein Verständnis von Boto3 und die Interaktion mit EC2-Instanzen zu bekommen. Hier ist der Code Ich verwende eine Instanz zu erstellen:Abrufen öffentlicher DNS von EC2-Instanz mit BOTO3

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 
    ) 

Dies beginnt eine EC2-Instanz in Ordnung, und ich kann den öffentlichen DNS-Namen, IP und andere Informationen von der AWS-Konsole erhalten. Aber, wenn ich versuche, das öffentliche DNS mit Boto zu erhalten, indem ich dies tue:

Gibt leere Anführungszeichen zurück. Andere Instanzdetails wie:

new_instance[0].instance_type 

Gibt die richtigen Informationen zurück.

Irgendwelche Ideen? Vielen Dank.

EDIT:

Also, wenn ich tun:

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 

Dann wird es der Öffentlichkeit DNS zurückzukehren. Aber es ergibt für mich keinen Sinn, warum ich das alles machen muss.

Antwort

10

Das Instance Objekt, das Sie zurück erhalten, wird nur mit den Antwortattributen vom create_instances Anruf hydratisiert. Da der DNS-Name nicht verfügbar ist, bis die Instanz den Ausführungsstatus [1] erreicht hat, ist sie nicht sofort vorhanden. Ich stelle mir vor, dass die Zeit zwischen dem Erstellen der Instanz und dem Aufrufen von descriven-Instanzen lang genug ist, damit die Mikroinstanz starten kann.

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) 
Verwandte Themen