Лямбда-функция не отображает правильный вывод после обработки сообщения SQS

В настоящее время у меня есть рабочий процесс в AWS, который выглядит следующим образом:

** Шаговая функция -> Очередь SQS -> Лямбда-функция **

Конечный автомат пошаговых функций при запуске отправляет сообщение в очередь SQS, которая затем запускает лямбда-функцию на основе триггера SQS. Вот простая лямбда (написанная на Python):

# Library Imports
import boto3
import json
import os

# Variables
sqs   = boto3.resource('sqs')
queue_name = 'ExampleStandardQueue'
queue_url = os.environ['QUEUE_URL']
queue = sqs.get_queue_by_name(QueueName=queue_name)

# Handler
def lambda_handler(event, context):

  # Receive messages from queue, one at a time
  messages = queue.receive_messages()

  for message in messages:
    print('Processed message.')
    print('Message Attributes: {0}'.format(message.attributes))
    print('Message Body: {0}'.format(message.body))

Когда я удаляю триггер SQS и отправляю сообщение в очередь, а затем проверяю лямбда-функцию, я получаю правильный результат:

START RequestId: fdf3dffe-0271-4b03-974e-9d8762f2b6b3 Version: $LATEST
Processed message.
Message Attributes: None
Message Body: {"MessageTitle":"Create Group","input":"Started."}
END RequestId: fdf3dffe-0271-4b03-974e-9d8762f2b6b3
REPORT RequestId: fdf3dffe-0271-4b03-974e-9d8762f2b6b3  Duration: 60.38 ms  Billed Duration: 
100 ms  Memory Size: 128 MB Max Memory Used: 77 MB  Init Duration: 397.80 ms    

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

START RequestId: 2fac6aa3-01ba-56dc-b077-3c41fdd731ec Version: $LATEST
END RequestId: 2fac6aa3-01ba-56dc-b077-3c41fdd731ec
REPORT RequestId: 2fac6aa3-01ba-56dc-b077-3c41fdd731ec Duration: 294.12 ms Billed Duration: 300 ms Memory Size: 128 MB Max Memory Used: 78 MB

По сути, здесь выходные данные кода не отображаются и не влияют, даже если мониторинг в очереди показывает, что сообщение было обработано и лямбда-функция запущена. Что мне здесь не хватает?


person Franchise    schedule 11.03.2020    source источник
comment
Предположительно, в автоматизированном рабочем процессе сообщение очереди уже прочитано и передается в аргументе события вашему обработчику.   -  person Andrew McGuinness    schedule 11.03.2020


Ответы (1)


Если у вас определен триггер SQS, служба Lambda будет опрашивать SQS на предмет сообщений и отправлять эти сообщения в вашу функцию в параметре event. В этом случае вы никогда не должны звонить messages = queue.receive_messages(). Вы даже не должны создавать клиента Boto3 SQS, такого как boto3.resource('sqs'), когда у вас определен триггер SQS.

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

person Mark B    schedule 11.03.2020
comment
Спасибо, @Mark B. Это прекрасно объясняет, почему существует разница при изменении метода выполнения. Как человек, который плохо знаком с Lambda, есть ли какой-нибудь пример или документация, которыми вы могли бы указать мне в правильном направлении? - person Franchise; 11.03.2020
comment
@Franchise Я бы начал с официальной документации по интеграции Lambda с SQS здесь: docs.aws.amazon.com/lambda/latest/dg/with-sqs.html - person Mark B; 11.03.2020