Управление «динамическим» рабочим процессом AWS Lambda

Скажем, у меня есть лямбда-функция под названием «TestExecutor», которая принимает аргумент, содержащий ARN для N «тестов», которые также реализованы как лямбда-функции.

Рабочий процесс:

  1. TestExecutor вызывается со списком ARN различных тестов.
  2. TestExecutor вызывает каждый тест одновременно; ожидается, что каждая лямбда вернет JSON
  3. TestExecutor ожидает завершения каждого теста. Он объединяет все полученные JSON
  4. Консолидированный JSON хранится в DynamoDB / S3

Постановка проблемы. Как лучше всего создать такой рабочий процесс без сервера?

Я рассмотрел два сервиса AWS, чтобы справиться с этим:

  1. AWS Step Functions - моей пошаговой функции потребуются состояния для каждой возможной тестовой лямбды, которая может быть выполнена. Я хочу предоставить пользователю гибкость для вызова любой лямбды без необходимости «регистрировать» ее в моей функции Step.
  2. AWS SWF - Кажется, это немного излишне. Страдает той же проблемой, что и выше.

Итак, сейчас лучшее, что я могу придумать, - это сделать это простым способом:

В моем TestExecutor Lambda я мог бы создать N потоков для N тестов, каждый поток вызывает определенную функцию Test Lambda. Каждый поток ожидает, пока его Test вернет JSON. Поскольку все исполнения успешны, все JSON объединяются. Консолидированный JSON хранится в DynamoDB.

Я не доволен этим решением - будет немного сложно вручную управлять ошибками и повторными попытками тестовых лямбда-выражений из внутри лямбда-выражения TestExecutor. Я впервые пробую что-то бессерверное, но это кажется неправильным шаблоном. Я хотел бы получить хорошее представление о моем рабочем процессе сверху вниз - похоже, что мониторинг этого процесса будет немного беспорядочным и разбросанным, поскольку нет формальной связи между TestExecutor и Test Lambdas

Возможно, я мог бы создать очередь SQS вместе с каждой тестовой лямбдой. Для каждого ARN, предоставленного TestExecutor, я мог отправить сообщение в соответствующую очередь. Но что теперь? Мне пришлось бы создать лямбда-выражения «Listener» для каждого теста, который опрашивает каждую очередь каждые T секунд. Затем он вызовет фактическую тестовую лямбду. Это тоже звучит излишне сложно.

Хотел бы услышать совет! Ваше здоровье.


person user1265125    schedule 10.03.2017    source источник


Ответы (2)


AWS SWF не страдает той же проблемой, поскольку не требует регистрации лямбда-функции для ее вызова. Основным ограничением SWF является то, что все еще невозможно запустить процесс принятия решения как лямбда-функцию. Так что вам придется запустить его в другом месте. Если у вас уже есть хост, на котором он может быть запущен, реализуя ваш вариант использования с помощью AWS Flow Framework довольно просто.

person Maxim Fateev    schedule 11.03.2017
comment
Конечно, я могу вызвать лямбда-функцию без «регистрации». Но в чем тогда смысл использования SWF? Что такое добавленная стоимость? У меня все еще будет одна лямбда TestExecuter, выполняющая «невидимые» тестовые лямбды в фоновом режиме. Не буду ли я по-прежнему страдать от тех же проблем, что и в случае со Step Functions? Я почитаю еще немного о SWF. Кроме того, я не собираюсь использовать Flow framework, поскольку нет Python SDK. - person user1265125; 11.03.2017
comment
Дополнительным преимуществом является то, что функция принятия решения не имеет состояния. Таким образом, любые сбои процесса, в котором он находится, не приведут к потере состояния выполнения. SWF также полностью транзакционный и не создает дубликатов (как SQS). Так что написать логику принятия решения намного проще. Если бы вы использовали Java, ваш вариант использования был бы закодирован в десятке строк кода. - person Maxim Fateev; 13.03.2017
comment
Что, если у меня есть очередь SQS и моя собственная лямбда-функция TestExector, которая опрашивает очередь каждые 5 секунд и запускает все необходимые тесты? Мне кажется, это будет еще короче и проще. Не могли бы вы подробнее рассказать о том, что «SWF также является полностью транзакционным и не создает дубликатов»? - person user1265125; 14.03.2017
comment
Насколько мне известно, проблема «дубликатов» в SQS заключается в том, что мы не можем избежать вставки дубликатов сообщений в SQS. Это проблема, которую я могу решить на клиентском уровне, который заполняет SQS. - person user1265125; 14.03.2017

Вы можете использовать AWS SDK для создания Step Machine с использованием указанных ARN из лямбда-функции.

Потребуется какой-то способ впоследствии как-то очистить и / или избежать дублирования, иначе консоль быстро станет беспорядочной.

person ElFitz    schedule 21.03.2017