Ведение журнала исключений среды выполнения AWS Lambda Python 3.7

Необработанные исключения, возникающие при использовании среды выполнения Python 3.7, по-видимому, не регистрируются в CloudWatch, как в Python 3.6. Как вы можете настроить регистратор в Python 3.7 для сбора этой информации?

Также размещено на форуме AWS

Копировать:

1. Создайте лямбда-функцию следующим образом:

import logging
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
def lambda_handler(event, context):
logger.info("This shows fine")
raise Exception("I failed")  

2. Запустите эту функцию, используя среду исполнения Python 3.6

START RequestId: a2b6038b-0e5f-11e9-9226-9dfc35a22dcc Version: $LATEST
[INFO]  2019-01-02T07:25:52.797Z    a2b6038b-0e5f-11e9-9226-9dfc35a22dcc //This shows fine
 I failed: Exception
Traceback (most recent call last):
File "/var/task/lambda_function.py", line 9, in lambda_handler
        raise Exception("I failed")
Exception: I failed

END RequestId: a2b6038b-0e5f-11e9-9226-9dfc35a22dcc
REPORT RequestId: a2b6038b-0e5f-11e9-9226-9dfc35a22dcc  Duration: 1.12 ms   Billed Duration: 100 ms     Memory Size: 128 MB Max Memory Used: 21 MB

2. Переключитесь на Python 3.7 и снова запустите... нет трассировки стека

    START RequestId: 3840aa8e-0e5d-11e9-bece-45a2022a53c6 Version: $LATEST
    [INFO]  2019-01-02T07:08:35.170Z    3840aa8e-0e5d-11e9-bece-45a2022a53c6    This shows fine

    END RequestId: 3840aa8e-0e5d-11e9-bece-45a2022a53c6
    REPORT RequestId: 3840aa8e-0e5d-11e9-bece-45a2022a53c6  Duration: 2.20 ms   Billed Duration: 100 ms     Memory Size: 128 MB Max Memory Used: 20 MB  

Ответ 1

Да, я заметил это. Для преодоления я использую декоратор.

def log_errors(func: Callable[[dict, dict], None]):
    def wrapper(*args, **kwargs):
        try:
            func(*args, **kwargs)
        except Exception as err:
            warning(traceback.format_exc())
            raise err

    return wrapper

Использование:

@log_errors
def handler(event, context):
...

Ответ 2

Это ошибка в AWS Lambda. Я заметил это в середине декабря и подал вопрос; ответ включал следующее: "Я хотел бы сообщить вам, что это было определено как подлинная проблема, и команда Lambda в настоящее время работает над ее решением. Но, к сожалению, у меня нет ETA, когда эта проблема будет решена ".

Мое решение состояло в том, чтобы вернуться к среде исполнения python3.6, пока Amazon не исправит это.

Ответ 3

Это странно, потому что Exception - встроенная функция, которая должна работать как на 3.6, так и на 3.7.

В качестве обходного пути я бы предложил сделать пользовательское исключение. Вот простой пример.

test.py

class Error(Exception):
    pass

class CustomException(Error):
    pass

raise CustomException("I failed")

Вот результат при запуске.

TK$ python3 test.py 

Traceback (most recent call last):
 File "test.py", line 7, in <module>
    raise CustomException("I failed")
__main__.CustomException: I failed