2017-07-18 5 views
1

複数のAWSアカウントで各ユーザーのアクセスキーの年齢を取得しようとしています。私は現在、アクセスキーの年齢を表示するコードを持っていますが、コードはエラーから適切に返されません。私はとされて働いているコード、Python 3ユーザーにキーのアクセス年齢を取得する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\")" 
    ] 
    ] 
} 
+0

'strptime'ではなく' strftime'を使ってみましたか? –

+0

私はそれらを変更しようとしました。しかし、2つのデータ値を減算しようとすると、サポートされていない型エラーが発生します。あなたはstrftimeを使うために作成日の文字列を削除しないと言っていますか? – jelidens

+0

'CreateDate'と' todaysDate'を印刷する必要がありますか? –

答えて

0

datetimeはJSONシリアライザブルではないため、このエラーが発生しています。

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

し、それを追加する前に文字列表現に変更し:あなたは

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

答えはあなたの日を計算し、この値を用いることであろうように思えてCreateDatedatetimeオブジェクトを保存しています返すオブジェクトに:

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

これは実際に問題を解決しました!助けてくれてありがとう! – jelidens

関連する問題