Мой SQS должен запускать лямбда-функцию один раз. Кажется, это вызывает его несколько раз, и я не могу найти причину.
Вот как работает система:
Файл загружен в корзину S3 (назовем его uploaded-docs
).
Загрузка файла в uploaded-docs/input/
вызывает событие в корзине, которое называется FileUploaded
.
Событие FileUploaded
запускает лямбда-функцию с именем ProcessUploadedFile
.
ProcessUploadeFile
вызывает Textract для анализа документа. Выходные данные указанного процесса Textract публикуются (после завершения) в теме SNS под названием TextractComplete
.
TextractComplete
имеет одну подписку, SQS называется TextractOutputQueue
.
TextractOutputQueue
запускает лямбда-функцию с именем GetOutput
. Он должен запускаться только один раз для каждого загруженного файла
Я заметил, что когда файл загружен, GetOutput
вызывается снова и снова для файла, и Task timed out after 3 seconds
(команда Textract GetDocumentTextDetection
, вызываемая через boto3
) может быть найдена в журналах, пока она, наконец, не будет превышает.
Я также заметил, что при загрузке нового файла все файлы в корзине снова называются в этом процессе.
Некоторые гипотезы:
Элементы очереди SQS не «расходуются», так что они все еще существуют в очереди после вызова их соответствующих функций Lambda, и поскольку они все еще существуют, они продолжают вызывать функцию.
Лямбда GetOutput
застревает в каком-то цикле повторов, и каждый раз, когда он останавливается, он снова вызывает всю функцию. Это не объясняет, почему журналы будут мертвыми, пока я не загрузлю другой документ, и все ранее загруженные документы каким-то образом снова войдут в цикл.