web-dev-qa-db-ja.com

BOTO3を使用してEC2インスタンスのパブリックDNSを取得する

私は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インスタンスが正常に開始され、AWSコンソールからパブリックDNS名、IP、その他の情報を取得できます。しかし、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を返します。しかし、なぜ私がこれらすべてを行う必要があるのか​​は私には意味がありません。

14

返されるInstanceオブジェクトは、create_instances呼び出しからの応答属性でのみハイドレイトされます。 DNS名は、インスタンスが実行状態に達するまで使用できないため、 [1] であるため、すぐには表示されません。インスタンスを作成してからdescribeインスタンスを呼び出すまでの時間は、マイクロインスタンスを開始するのに十分な長さだと思います。

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)
23
Jordon Phillips
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
0