AWS Lambda Не удалось маршалировать ответ Ошибка

Я пытаюсь настроить лямбду AWS, которая запустит сеанс SSM в моем экземпляре EC2 и запустит команду. Для простоты сейчас я просто пытаюсь запустить ls. Вот моя лямбда-функция:

import json
import boto3

def lambda_handler(commands, context):
    """Runs commands on remote linux instances
    :param client: a boto/boto3 ssm client
    :param commands: string, each one a command to execute on the instance
    :return: the response from the send_command function (check the boto3 docs for ssm client.send_command() )
    """
    client = boto3.client('ssm')
    print ("Hello world")
    resp = client.send_command(
        DocumentName="AWS-RunShellScript",
        # Would normally pass commands param here but hardcoding it instead for testing
        Parameters={"commands":["ls"]},
        InstanceIds=["i-01112223333"],
    )
    return resp

Однако, когда я запускаю «Тест» для этой функции, я получаю следующий вывод журнала:

START RequestId: d028de04-4004-4a0p-c8d2-975755c84777 Version: $LATEST
Hello world
[ERROR] Runtime.MarshalError: Unable to marshal response: datetime.datetime(2020, 5, 12, 19, 34, 36, 349000, tzinfo=tzlocal()) is not JSON serializable
END RequestId: d028de04-4asdd4-4a0f-b8d2-9asd847813
REPORT RequestId: d42asd04-44d4-4a0f-b9d2-275755c6557   Duration: 1447.76 ms    Billed Duration: 1500 ms    Memory Size: 128 MB Max Memory Used: 76 MB  Init Duration: 301.68 ms

Я не знаю, что означает эта ошибка Runtime.MarshalError: Unable to marshal response и как ее исправить.

Полезная нагрузка, которую я передаю для запуска тестовой лямбды, не должна иметь значения, поскольку я не использую параметр команд, но это:

{
  "command": "ls"
}

Любая помощь будет оценена


person dredbound    schedule 12.05.2020    source источник


Ответы (2)


Ошибка имеет довольно четкую формулировку, вы просто фиксируете не ту часть.

Я предполагаю, что вы используете объект resp где-то в конце строки, и эта часть пытается сделать что-то вроде json.load() или похожего.

datetime.datetime(2020, 5, 12, 19, 34, 36, 349000, tzinfo=tzlocal()) is not JSON serializable

Это распространенная ошибка для людей, которые впервые сталкиваются с datetime, вот довольно подробный вопрос об этом: Как преодолеть datetime.datetime, не сериализуемый JSON?

person Oleksii Donoha    schedule 12.05.2020
comment
Не совсем ответ, но это привело меня к правильному решению. Вы были правы, что я сосредоточился не на той части. Я нигде не вызывал resp, просто возвращал его для вывода лямбда, но сама лямбда AWS, очевидно, что-то с ним делала. Изменение последней строки для возврата str(resp) решило проблему. Спасибо - person dredbound; 12.05.2020

Попробуйте следующее:

return json.loads(json.dumps(resp, default=str))

Это приведет к дампу в виде JSON и использованию функции str для сериализации даты и времени. Затем он восстанавливает тот же объект, но вместо объекта datetime вы получите строки, которые можно сериализовать.

person Cherry    schedule 08.11.2020