Получение общедоступных dns экземпляра EC2 с BOTO3

Я использую ipython для понимания Boto3 и взаимодействия с экземплярами EC2. Вот код, который я использую для создания экземпляра:

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
    )

Это запускает экземпляр экземпляра EC2, и я могу получить общедоступное DNS-имя, ip и другую информацию с консоли AWS. Но, когда я пытаюсь получить публичный DNS с помощью Boto, сделав это:

new_instance[0].public_dns_name

Возвращает пустые кавычки. Тем не менее, другие детали экземпляра, такие как:

new_instance[0].instance_type

Возвращает правильную информацию.

Любые идеи? Благодарю.

EDIT:

Итак, если я делаю:

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

Затем он вернет публичный DNS. Но для меня не имеет смысла, зачем мне все это делать.

Ответ 1

Возвращаемый объект Instance только гидратируется с атрибутами ответа из вызова create_instances. Поскольку DNS-имя недоступно до тех пор, пока экземпляр не достигнет состояния [1], он не будет немедленно присутствовать. Я предполагаю, что время между созданием экземпляра и вызовом описать экземпляры достаточно долго, чтобы запустить микро-экземпляр.

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)

Ответ 2

import boto3
import pandas as pd
session = boto3.Session(profile_name='aws_dev')
dev_ec2_client = session.client('ec2')
response = dev_ec2_client.describe_instances()
df = pd.DataFrame(columns=['InstanceId', 'InstanceType', 'PrivateIpAddress','PublicDnsName'])
i = 0
for res in response['Reservations']:
    df.loc[i, 'InstanceId'] = res['Instances'][0]['InstanceId']
    df.loc[i, 'InstanceType'] = res['Instances'][0]['InstanceType']
    df.loc[i, 'PrivateIpAddress'] = res['Instances'][0]['PrivateIpAddress']
    df.loc[i, 'PublicDnsName'] = res['Instances'][0]['PublicDnsName']
    i += 1
 print df

 Note:

 1. Change this profile with your aws profile nameprofile_name='aws_dev
 2. This code is working for python3