我正在使用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。但对我来说,为什么我需要做所有这些都没有意义。
答案 0 :(得分:18)
您获得的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)
答案 1 :(得分:1)
这是我的包装器:
import boto3
from boto3.session import Session
def credentials():
"""Credentials:"""
session = Session(aws_access_key_id= 'XXXXXXXXX',
aws_secret_access_key= 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')
ec2 = boto3.resource('ec2', region_name='us-east-2')
return ec2
def get_public_dns(instance_id):
"""having the instance_id, gives you the public DNS"""
ec2 = credentials()
instance = ec2.Instance(instance_id)
instancePublicDNS = instance.public_dns_name
return instancePublicDNS
然后您只需要使用您的 instance_id 来获取您的任何活动 ec2 的公共 ID:
dns = get_public_dns(instance_id)
记得将“region_name”更改为您的区域并添加您的“aws_access_key_id”和“aws_secret_access_key”
答案 2 :(得分:0)
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