2016-01-11 14 views
7

Tôi đang sử dụng ipython để hiểu Boto3 và tương tác với các cá thể EC2. Đây là mã tôi đang sử dụng để tạo ra một ví dụ:Lấy ra các dns công khai của cá thể EC2 với 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 
    ) 

này bắt đầu một thể EC2 tốt, và tôi có thể có được tên DNS công cộng, ip và thông tin khác từ AWS console. Tuy nhiên, khi tôi cố gắng nhận DNS công khai bằng Boto, bằng cách thực hiện việc này:

new_instance[0].public_dns_name 

Trả về dấu ngoặc kép trống. Tuy nhiên, các chi tiết cá thể khác, chẳng hạn như:

Trả về thông tin chính xác.

Bất kỳ ý tưởng nào? Cảm ơn.

EDIT:

Vì vậy, nếu tôi làm:

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 

Sau đó, nó sẽ trở lại với DNS công cộng. Nhưng nó không có ý nghĩa với tôi tại sao tôi cần phải làm tất cả những điều này.

Trả lời

10

Đối tượng Instance bạn lấy lại chỉ được ngậm nước với các thuộc tính phản hồi từ cuộc gọi create_instances. Vì tên DNS không có sẵn cho đến khi cá thể đã đạt đến trạng thái đang chạy [1], nó sẽ không xuất hiện ngay lập tức. Tôi tưởng tượng thời gian giữa bạn tạo ra cá thể và các cá thể mô tả gọi là đủ dài cho cá thể vi mô bắt đầu.

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) 
Các vấn đề liên quan