Python实现EC2实例列表按CreationDateTime排序的问题求解
问题根因
- 你将实例ID、时间、ASG名称拼接为字符串后再存入列表,直接对字符串排序会按字符ASCII码逐位比较,无法正确按时间维度排序
sorted()是返回新排序结果的函数,不会修改原输入列表,你在循环内调用sorted(instances_list)但没有接收返回值,排序逻辑完全没有生效- 你选择在循环内每次新增元素后就排序,属于不必要的性能损耗,应该等所有元素收集完成后再统一排序
networkinterface_id_attachedtime本身就是可直接比较大小的datetime对象,不需要转成字符串后再处理时间排序,直接用原生对象排序准确率更高
修正后代码
首先收集实例信息时存储为元组,不要提前拼接为字符串:
import boto3 ec2_client = boto3.client('ec2') response = ec2_client.describe_instances(MaxResults=10) instances_list = [] for reservation in response['Reservations']: instance = reservation['Instances'][0] # 取实例ID instance_id = instance['InstanceId'] # 取网卡挂载时间 network_interface_id = instance['NetworkInterfaces'][0]['NetworkInterfaceId'] network_interface_details = ec2_client.describe_network_interfaces( NetworkInterfaceIds=[network_interface_id] ) attach_time = network_interface_details['NetworkInterfaces'][0]['Attachment']['AttachTime'] # 此处补充你原来的autoscaling_group_name取值逻辑即可 autoscaling_group_name = "你的ASG名称取值逻辑" # 存储为元组,方便后续按时间排序 instances_list.append( (attach_time, instance_id, autoscaling_group_name) ) # 所有元素收集完成后统一排序,默认升序(创建时间早的在前),要降序加reverse=True参数 sorted_instances = sorted(instances_list, key=lambda item: item[0]) # 如果需要输出为你原来的逗号分隔字符串格式,再做转换 sorted_result = [f"{item[1]},{item[0]},{item[2]}" for item in sorted_instances] print(sorted_result)
排序效果
执行后得到的sorted_result就是你需要的按时间排序的实例列表,样例输出如下:
['i-0f285277529543462,2018-05-18 16:47:00+00:00,False', 'i-0d649cebdf54bd2f4,2020-03-12 10:07:07+00:00,asg-ddf', 'i-0f67cf99fb4536c3f,2020-10-14 13:32:23+00:00,asg-elk-', 'i-01734dfef0159c5c8,2020-10-20 13:05:27+00:00,asg-pro', 'i-0539c8dfc839cbfda,2020-10-26 07:38:01+00:00,asg-standalone', 'i-0ff596f1dc01b61d8,2021-03-17 11:21:21+00:00,asg-base-test', 'i-06db4eb158ad0bdfd,2021-05-12 12:04:19+00:00,False']
内容的提问来源于stack exchange,提问作者devdude
相关产品推荐
相关产品推荐

