datetime.datetime对象不可下标

时间:2018-12-06 21:46:32

标签: json python-3.x datetime boto3

我正在尝试获取所有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

1 个答案:

答案 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字段。