объект datetime.datetime не может быть подписан - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь получить время создания тома для всех моих 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 голосов
/ 07 декабря 2018

Во-первых,

item['Instances'][0]['BlockDeviceMappings'][0]['Ebs']['AttachTime']

не должно быть списком.Это элемент в документации здесь , а также элемент в JSON, возвращаемый следующей командой aws cli:

aws --region us-east-1 ec2 describe-instances

Я подозреваю, что при удалении последнего [0] из

item['Instances'][0]['BlockDeviceMappings'][0]['Ebs']['AttachTime'][0]

строка кода успешно завершается, и list index out of range вызывается из последующей итерации цикла for.

Трудно понять, почему без выполнения кода, но, например,Экземпляр без томов, таких как , в этом случае вызовет сбой этой строки.

Вы можете выполнить отладку следующим образом, чтобы проверить поврежденные данные:

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 может быть подходящим для вашего случая использования, это не обязательно время, когда том был создан, так как они могут быть созданы, а затем присоединены кпример.Если вам нужно фактическое время создания, вам нужно сделать второй вызов description_volume_status и использовать поле CreateTime.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...