Я пытаюсь получить возраст ключа доступа для каждого пользователя в нескольких учетных записях AWS. В настоящее время у меня есть код, который распечатывает возраст ключа доступа, но код не возвращает его должным образом из-за ошибки. Код, с которым я работаю,

import boto3
from time import gmtime, strftime
from datetime import datetime
sts = boto3.client('sts')

def lambda_handler(event, context):
    rolesessionname = "rolename"
    account = "123456789"
    response = sts.assume_role(
    RoleArn = "arn:aws:iam::" + str(account) + ":role/audit",
    RoleSessionName= rolesessionname
    )
  credentials = response['Credentials']
  iam = boto3.client(
   'iam',
    aws_access_key_id = credentials['AccessKeyId'], 
    aws_secret_access_key = credentials['SecretAccessKey'], 
    aws_session_token = credentials['SessionToken']
    )


    response = iam.list_users()
    nameList = []
    todaysDate = strftime("%Y-%m-%d %H:%M:%S", gmtime())
    todaysDate = str(todaysDate)
    todaysDate = todaysDate[0:10]
    todaysDate = datetime.strptime(todaysDate, "%Y-%m-%d")

    for person in response["Users"]:
        curPersonName = person["UserName"]

        keys = iam.list_access_keys(UserName=curPersonName)
        for keyData in keys["AccessKeyMetadata"]:
           keyID = keyData["AccessKeyId"]
           status = keyData["Status"]
            CreateDate = keyData.get("CreateDate","none")
            CreateDate = str(CreateDate)
            CreateDate = CreateDate[0:10]
            CreateDate = datetime.strptime(CreateDate, "%Y-%m-%d")

            totalDays =  abs((CreateDate - todaysDate).days)
            print (totalDays-1)
            nameList.append({
            "UserName:":curPersonName,
            "Status:": status,
            "Create Date": CreateDate
            #"Total days:" : totalDays-1
                })            

     return nameList

Моя проблема в том, что если я закомментирую упоминания

CreateDate = datetime.strptime(CreateDate, "%Y-%m-%d")

А также

totalDays = abs((CreateDate - todaysDate).days)

Я получаю успешную сборку и возвращаю данные, только без возраста ключа, что в основном то, что я хочу. Однако, если я сохраню эти строки и распечатаю, чтобы увидеть, правильно ли он получает возраст, это так. Однако он только распечатывает их, а затем ошибки.

{
  "errorMessage": "datetime.datetime(2017, 1, 11, 0, 0) is not JSON serializable",
  "errorType": "TypeError",
  "stackTrace": [
    [
      "/var/lang/lib/python3.6/json/__init__.py",
      238,
      "dumps",
      "**kw).encode(obj)"
    ],
    [
      "/var/lang/lib/python3.6/json/encoder.py",
      199,
      "encode",
      "chunks = self.iterencode(o, _one_shot=True)"
    ],
    [
      "/var/lang/lib/python3.6/json/encoder.py",
      257,
      "iterencode",
      "return _iterencode(o, 0)"
    ],
    [
      "/var/runtime/awslambda/bootstrap.py",
      110,
      "decimal_serializer",
      "raise TypeError(repr(o) + \" is not JSON serializable\")"
    ]
  ]
}
1
jelidens 18 Июл 2017 в 21:09
Вы пробовали использовать strftime вместо strptime?
 – 
Sam Chats
18 Июл 2017 в 21:13
Я просто попробовал их поменять. Но при попытке вычесть два значения данных я получаю ошибки неподдерживаемого типа. Вы говорите, что не следует также удалять строку даты создания, чтобы использовать strftime?
 – 
jelidens
18 Июл 2017 в 21:21
Вам когда-нибудь приходилось печатать CreateDate и todaysDate?
 – 
Sam Chats
18 Июл 2017 в 21:33
Нет, я не обязан
 – 
jelidens
18 Июл 2017 в 21:45

1 ответ

Лучший ответ

Вы получаете эту ошибку, потому что datetime не сериализуем в формате JSON. Вы сохраняете объект datetime в CreateDate с помощью

datetime.strptime(CreateDate, "%Y-%m-%d")

Похоже, что ответ будет использовать это значение для расчета ваших дней:

totalDays =  abs((CreateDate - todaysDate).days)

А затем измените его на строковое представление перед добавлением к возвращаемому объекту:

CreateDate = CreateDate.isoformat() #or whatever return format you want.
0
Mark 18 Июл 2017 в 22:16
Это действительно решило проблему! Большое спасибо за помощь!
 – 
jelidens
18 Июл 2017 в 22:36