2016-01-11 10 views
7

私は、Boto3の理解とEC2インスタンスとの対話を行うためにipythonを使用しています。ここで私は、インスタンスを作成するために使用しているコードは次のとおりです。BOTO3を使用してEC2インスタンスのパブリックDNSを取得する

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コンソールから他の情報を取得することができます。しかし、私がBotoを使って公開DNSを入手しようとすると、次のようになります。

new_instance[0].public_dns_name 

空白引用符を返します。さらに、次のような他のインスタンスの詳細:

new_instance[0].instance_type 

正しい情報を返します。

アイデア?ありがとう。

編集:私がしなければ

ので:

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を返します。しかし、なぜ私はこれをすべて行う必要があるのか​​私には意味がありません。

答えて

10

Instanceオブジェクトは、create_instancesコールの応答属性で水和されています。インスタンスが実行状態[1]に到達するまで、DNS名は使用できないため、すぐには存在しません。インスタンスの作成から記述インスタンスの呼び出しまでの時間は、マイクロインスタンスが開始するのに十分な時間です。

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) 
関連する問題