Question:
I’m using ipython to get an understanding of Boto3 and interacting with EC2 instances. Here is the code I’m using to create an instance:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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= SecurityGroups=[' DryRun = False ) |
This starts an EC2 instance fine, and I can get the public DNS name, ip and other info from the AWS console. But, when I try to get the public DNS using Boto, by doing this:
1 2 |
new_instance[0].public_dns_name |
Returns blank quotes. Yet, other instance details, such as:
1 2 |
new_instance[0].instance_type |
Returns the correct information.
Any ideas? Thanks.
EDIT:
So if I do:
1 2 3 4 5 6 7 8 9 10 |
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 |
Then it will return the public DNS. But it doesn’t make sense to me why I need to do all of this.
Answer:
The Instance
object you get back is only hydrated with the response attributes from the create_instances
call. Since the DNS name is not available until the instance has reached the running state [1], it will not be immediately present. I imagine the time between you creating the instance and calling describe instances is long enough for the micro instance to start.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import boto3 ec2 = boto3.resource('ec2') instances = ec2.create_instances( ImageId='ami-f0091d91', MinCount=1, MaxCount=1, InstanceType='t2.micro', KeyName=' SecurityGroups=[' 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) |