2017-07-18 34 views
1

我试图获取多个AWS账户中每个用户的访问键年龄。我目前有打印出访问键年龄的代码,但代码无法从错误中正确返回。我与正在工作的代码,Python 3 AWS lambda函数获取用户访问键年龄

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\")" 
    ] 
    ] 
} 
+0

您是否尝试过使用'strftime'而不是'strptime'? –

+0

我只是试着改变它们。但是当我试图减去两个数据值时,我得到了不支持的类型错误。你是否说为了使用strftime不要剥离创建日期字符串? – jelidens

+0

你有没有被要求打印'CreateDate'和'todaysDate'? –

回答

0

你得到这个错误,因为datetime不是JSON序列化。要保存在CreateDate一个datetime对象与

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

这似乎是一种解决办法是使用这个值来计算你的日子:

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

,并随后将其加入之前将其更改为一个字符串表示返回对象:

CreateDate = CreateDate.isoformat() #or whatever return format you want. 
+0

这确实解决了问题!非常感谢您的帮助! – jelidens