Как просмотреть стандартный вывод в среде AWS?

Ниже приведена лямбда-функция:

exports.lendingLambdaHandler = async (event, context) => {
    const records = event.Records

    console.log(records)

    return {}
};

выполняется с помощью среды выполнения NodeJS (как бессерверное приложение), которое записывает запись о входящем событии в stdout

По определению console.log печатает в stdout, как указано здесь, но мне нужно просмотреть журналы наблюдения за облаком, так как это бессерверное приложение AWS:

введите здесь описание изображения


Как правильно просматривать stdout в среде AWS?


person overexchange    schedule 13.07.2019    source источник
comment
Вы пробовали «context.log»? В Azure это позволяет просматривать журналы на их консольном портале.   -  person westandy    schedule 13.07.2019


Ответы (3)


Лямбда-функция является бессерверной, но это не означает, что нет сервера, на котором работает ваша лямбда-функция, все, что это на самом деле означает, это то, что вы не видите этот сервер и вам вообще не нужно управлять им.

Когда вы вызываете лямбда-функцию, существует множество серверов, ожидающих запуска нового контейнера докеров, в котором будет выполняться ваша лямбда-функция (или повторного использования существующего контекста выполнения, если ваша лямбда-функция вызывается постоянно), суть в том, что stdout в случае лямбда - это то же самое stdout, как если бы вы запускали код локально (или на сервере, к которому у вас есть доступ), разница в том, что у вас нет доступа к этому базовому контейнеру докеров, где вы могли бы его наблюдать. Следовательно, журналы также отправляются в журналы CW, чтобы у вас был способ получить к ним доступ.

Как правильно просматривать стандартный вывод в среде AWS?

Как я уже упоминал, у вас нет доступа к базовому контейнеру, в котором выполняется ваша лямбда-функция, поэтому правильный способ доступа к журналам — через CW Logs. Конечно, вы можете выбрать потоковую передачу журналов из CW в любую другую службу по своему усмотрению или в зависимости от вашего варианта использования.

person Matus Dubrava    schedule 13.07.2019
comment
Я знаю, что сервер, работающий под..., является абстракцией. - person overexchange; 14.07.2019

Это стандартный способ обработки журналов в AWS Lambda. Беглый взгляд на документы показывает, что дополнительные параметры конфигурации отсутствуют.

Тем не менее, есть несколько вещей, которые могут работать лучше для вас.

Просмотр логов в вашем терминале:

aws lambda invoke --function-name YOUR_FUNCTION out --log-type Tail

Потоковая передача журналов Cloudwatch в другой сервис: Ссылка на статью

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

ссылки:

Документация по AWS Lambda

person HMilbradt    schedule 13.07.2019
comment
Что console.log делает в бессерверном приложении AWS? что значит написать stdout? если это бессерверное приложение... - person overexchange; 13.07.2019
comment
stdout — это просто место для отправки вывода, это не обязательно должен быть файл или консоль. В этом случае он отправляется непосредственно в Cloudwatch. - person HMilbradt; 13.07.2019
comment
stdout — вторая запись в таблице дескрипторов файлов в блоке управления процессом - person overexchange; 13.07.2019
comment
@overexchange среда выполнения Lambda для Node.js фиксирует как stdout, так и stderr, и все, что ваш код записывает в любой из этих файловых дескрипторов, отправляется в журналы CloudWatch. Первые ~4 КБ вывода также необязательно возвращаются в ответ на запрос Invoke. Это единственные места, куда он идет: документы. aws.amazon.com/lambda/latest/dg/ Использование console.log() — это просто один из способов записи в стандартный вывод с форматированием: stackoverflow.com/a/4984464/1695906 - person Michael - sqlbot; 14.07.2019

Это должно работать, так как вам не нужно создавать выходной файл и читать журналы непосредственно из стандартного вывода:

aws lambda invoke --function-name LAMBDA_FUNCTION_NAME \
                  --log-type Tail /dev/null \
                  --query 'LogResult' \
                  --output text | base64 -d

Если вам нужно указать имя профиля:

aws lambda invoke --function-name LAMBDA_FUNCTION_NAME \
                  --log-type Tail /dev/null \
                  --query 'LogResult' \
                  --output text \
                  --profile PROFILE_NAME | base64 -d
person 0xack13    schedule 20.03.2020