我正在尝试获取所有EC2
实例的卷创建时间。问题是boto3
响应返回CreateTime
作为日期时间对象,该对象不可下标。我尝试使用strftime()
将对象转换为类型str
,但由于使用错误,我必须使用错误的语法或其他方法。下面是我的代码和回溯:
CODE:
import boto3
import json
import os
import csv
from datetime import datetime, date, time
ec2 = boto3.client('ec2')
ec2_response = ec2.describe_instances(Filters=[{'Name': 'instance-state-name', 'Values': ['running']}])
for item in ec2_response['Reservations']:
instance_id = item['Instances'][0]['InstanceId']
image_id = item['Instances'][0]['ImageId']
create_time = item['Instances'][0]['BlockDeviceMappings'][0]['Ebs']['AttachTime'].strftime("%A, %d. %B %Y %I:%M%p")
print(instance_id,image_id,create_time)
Traceback:
create_time = item['Instances'][0]['BlockDeviceMappings'][0]['Ebs']['AttachTime'][0].strftime("%A, %d. %B %Y %I:%M%p")
TypeError: 'datetime.datetime' object is not subscriptable
答案 0 :(得分:0)
首先,
item['Instances'][0]['BlockDeviceMappings'][0]['Ebs']['AttachTime']
不应为列表。这是文档here中的一项,也是以下aws cli命令返回的JSON中的一项:
aws --region us-east-1 ec2 describe-instances
我怀疑当您从中删除最后一个[0]
item['Instances'][0]['BlockDeviceMappings'][0]['Ebs']['AttachTime'][0]
代码行成功完成,并且for循环的后续迭代引发list index out of range
。
很难知道为什么不运行代码,但是例如没有this case这样的卷的实例将导致该行失败。
您可以像这样调试以检查有问题的数据:
try:
create_time = item['Instances'][0]['BlockDeviceMappings'][0]['Ebs']['AttachTime'].strftime("%A, %d. %B %Y %I:%M%p")
except Exception as e:
import pdb; pdb.set_trace()
或者如果未附加到外壳上,则此:
try:
create_time = item['Instances'][0]['BlockDeviceMappings'][0]['Ebs']['AttachTime'].strftime("%A, %d. %B %Y %I:%M%p")
except Exception as e:
print("Dumping offending item:")
print(item)
raise e
第二,虽然AttachTime
可能适合您的用例,但不一定是创建卷的时间,因为可以创建卷并将其附加到实例。如果需要实际的创建时间,则需要再次调用describe_volume_status并使用CreateTime
字段。