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

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

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

Состояние функции шага После выполнения машина отправляет сообщение в очередь SQS, которое затем запускает функцию Lambda на основе триггера 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

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

1 Ответ

4 голосов
/ 11 марта 2020

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

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

...