Функция AWS Lambda подписывается на журналы Cloudwatch и анализирует ее для извлечения элементов данных - PullRequest
0 голосов
/ 15 мая 2019

Мы разработали две лямбда-функции в Python, как показано ниже:

  1. Лямбда-функция для записи RDS - эта функция анализирует файлы .csv, загруженные на S3, и записывает их в AWS Aurora db. Журналы обработки файлов сбрасываются в cloudwatch.

  2. Лямбда-функция подписана на группу cloudwatch, созданную из 1-й лямбда-функции, которая записывает в RDS - она ​​запускается каждый раз, когда новые журналы добавляются в группу лямбда-записей записи RDS.

У нас проблема со 2-й лямбда-функцией, которая подписана на группу cloudwatch. В большинстве случаев он корректно анализирует логи cloudwatch, но в некоторых случаях мы заметили, что лямбда-функция запускается даже до того, как 1-я лямбда-функция завершает запись всех логов в группу логов. 2-я лямбда-функция запускается несколько раз для одиночного выполнения 1-й лямбда-функции, и каждое выполнение получает часть данных группы журналов для анализа.

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

У меня есть код ниже для сбора потоков журнала

def lambda_handler(event, context):
    print(f'Logging Event: {event}')
    print(f"Awslog: {event['awslogs']}")
    cw_data = event['awslogs']['data']
    print(f'data: {cw_data}')
    print(f'type: {type(cw_data)}')
    compressed_payload = base64.b64decode(cw_data)
    uncompressed_payload = gzip.decompress(compressed_payload)
    payload = json.loads(uncompressed_payload)
    messagelst=[]
    for log_event in payload:
         data_log=json.loads(json.dumps(log_event))
         messagelst.append(re.split(r'\t',data_log['message'])

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

1 Ответ

0 голосов
/ 16 мая 2019

Я считаю, что проблема связана с тем фактом, что с точки зрения CloudWatch каждая строка в выходных данных представляет собой отдельную запись / событие.

Согласно этому вопросу ( Как работает пакетная регистрация Amazon CloudWatch при потоковой передаче на AWS Lambda? ), текущее поведение таково, что ваша "2-я" лямбда будет срабатывать при вызове PutLogEvents (это тоже не прописано в документации AWS, поэтому может измениться или уже изменилось).

После хлебных крошек возникает вопрос, как AWS обрабатывает вывод вашей "1-й" лямбды (с точки зрения внутреннего вызова PutLogEvents). Я не мог найти окончательный ответ. Этот вопрос ( Lambda log и CloudWatch PutLogEvents limit ) предполагает, что он может вызывать его только один раз в конце выполнения, но подтверждения этой претензии нет. Я подозреваю, что поведение будет зависеть от количества произведенной продукции и времени, которое потребовалось для ее производства.

Простое решение этой проблемы - закодировать ваши зарегистрированные данные, чтобы они всегда были одной строкой - для этого есть множество способов (например, просто удалить символы новой строки, экранировать их или просто кодировать base64). все дело).

...