2017-07-18 50 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