Python 确定Amazon EC2实例创建日期/时间

Python 确定Amazon EC2实例创建日期/时间,python,amazon-web-services,amazon-ec2,boto,ec2-api-tools,Python,Amazon Web Services,Amazon Ec2,Boto,Ec2 Api Tools,是否可以(通过boto)确定特定EC2实例是何时创建的 在这种情况下似乎没有任何帮助。需要找出一组特定EC2实例的创建日期 谢谢 如图所示: 每个实例对象都有一个名为launch_time的属性,该属性包含一个表示实例启动时间的IS08601 datetime字符串 在boto中,您可以执行以下操作: import boto.ec2 conn = boto.ec2.connect_to_region('us-west-1') reservations = conn.get_all_insta

是否可以(通过boto)确定特定EC2实例是何时创建的

在这种情况下似乎没有任何帮助。需要找出一组特定EC2实例的创建日期

谢谢

如图所示:

每个实例对象都有一个名为launch_time的属性,该属性包含一个表示实例启动时间的IS08601 datetime字符串

在boto中,您可以执行以下操作:

import boto.ec2

conn = boto.ec2.connect_to_region('us-west-1')
reservations = conn.get_all_instances()
for r in reservations:
    for i in r.instances:
        print('%s\t%s' % (i.id, i.launch_time)

如果要根据EC2实例的启动时间计算当前正常运行时间,可以尝试以下方法:

import datetime
lt_datetime = datetime.datetime.strptime(i.launch_time, '%Y-%m-%dT%H:%M:%S')
lt_delta = datetime.datetime.utcnow() - lt_datetime
uptime = str(lt_delta)

假设您使用的是一个EBS备份的实例,并且没有做任何花哨的驱动器杂耍,确定实例创建日期的最佳方法是查看驱动器根卷的创建时间。虽然每次停止和启动实例时实例的启动时间都会改变,但EBS卷的创建时间是静态的

下面是一个快速脚本,用于查找当前运行的实例的创建时间:

import boto
import subprocess

instance_id = subprocess.check_output(['curl', '-s', 'http://169.254.169.254/latest/meta-data/instance-id'])

conn = boto.connect_ec2()

root_device = conn.get_instance_attribute(instance_id, 'rootDeviceName')['rootDeviceName']
root_vol = conn.get_all_volumes(filters={"attachment.instance-id": instance_id, "attachment.device": root_device})[0]

print root_vol.create_time

请注意,这要求实例的IAM角色具有
ec2:DescribeInstanceAttribute
ec2:DescribeVolumes
权限

对于ec2实例,没有名为
create\u time
的属性,只有
launch\u time
可用

但是,您可以使用以下Python代码来了解卷是何时创建的,这反过来又为您提供了实例创建时间(请注意,我指的是创建实例时附加的卷):


另一种选择是使用自定义代码。当您使用
create_instances()
创建实例时,您可以将给定实例的
launch_time
及其实例ID和名称记录到诸如DynamoDB之类的位置,以便检索“创建时间”无论何时需要使用实例ID。

都无法直接获取EC2实例的创建时间。 因为EC2实例的启动时间将在每次启动和停止实例时更新

我们可以通过两种方式获得实例创建时间:

1) 通过获取实例的网络接口连接时间

2) 通过获取如上所示的卷连接时间

如何在boto3中获得网络接口连接时间

import boto3
from datetime import datetime
instance_details = client.describe_instances()
num_ins=(len(instance_details['Reservations'])
for x in range(num_ins):


   InstanceID=(instance_details['Reservations'][x]['Instances'][0]['InstanceId'])
   NetworkInterfaceID = (instance_details['Reservations'][x]['Instances'][0]['NetworkInterfaces'][0]['NetworkInterfaceId'])
   NetworkInterface_details = client.describe_network_interfaces(NetworkInterfaceIds=[NetworkInterfaceID])
   networkinterface_id_attachedtime = NetworkInterface_details['NetworkInterfaces'][0]['Attachment']['AttachTime']

   print(networkinterface_id_attachedtime)

打印当前实例的网络接口连接时间。

但这与创建时间相同吗?我混淆了启动时间和创建时间:(可能我对您要查找的内容感到困惑。启动时间会告诉您特定实例实际启动的时间。就像虚拟机启动并开始启动的时间一样。这就是您要查找的吗?事实上不,这是不相等的。如果您启动实例并在一夜之间停止,然后在早上启动,您的启动时间将是上午的日期,而不是您第一次创建实例的日期。@npiani AFAIK,创建时间不存储在实例meta中的任何位置。
import boto3
from datetime import datetime
instance_details = client.describe_instances()
num_ins=(len(instance_details['Reservations'])
for x in range(num_ins):


   InstanceID=(instance_details['Reservations'][x]['Instances'][0]['InstanceId'])
   NetworkInterfaceID = (instance_details['Reservations'][x]['Instances'][0]['NetworkInterfaces'][0]['NetworkInterfaceId'])
   NetworkInterface_details = client.describe_network_interfaces(NetworkInterfaceIds=[NetworkInterfaceID])
   networkinterface_id_attachedtime = NetworkInterface_details['NetworkInterfaces'][0]['Attachment']['AttachTime']

   print(networkinterface_id_attachedtime)