Я пытаюсь получить возраст ключа доступа для каждого пользователя в нескольких учетных записях 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 ответ
Вы получаете эту ошибку, потому что datetime
не сериализуем в формате JSON. Вы сохраняете объект datetime
в CreateDate
с помощью
datetime.strptime(CreateDate, "%Y-%m-%d")
Похоже, что ответ будет использовать это значение для расчета ваших дней:
totalDays = abs((CreateDate - todaysDate).days)
А затем измените его на строковое представление перед добавлением к возвращаемому объекту:
CreateDate = CreateDate.isoformat() #or whatever return format you want.
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.
strftime
вместоstrptime
?CreateDate
иtodaysDate
?