Управление лямбда-функциями AWS

Фон

У меня есть конечная точка шлюза API, которая проксирует функцию Lambda (Lambda A), чтобы приложение React могло получать данные о клиентах.

Эта лямбда-функция выполняет API-вызов для извлечения данных о клиенте, но формат ответа оставляет желать лучшего. Поэтому я хочу переформатировать это.

Вместо того, чтобы вставлять эту логику переформатирования в Lambda A, я написал отдельную функцию Lambda (Lambda B). Мне нужно вызвать обе эти функции, когда моя конечная точка API-шлюза будет нажата, а выходные данные первой будут входными данными для второй.

Первая мысль: Шаг Функции

Шаговые функции казались естественным соответствием, но существует ограничение в 32 КБ на размер полезной нагрузки данных, которую можно передавать между этапами. Наши данные о клиентах json часто превышают это.

Единственная "лучшая практика", которую я слышал, предложенная для этой ситуации, - записать полезную нагрузку на S3 и просто передать ключ объекта на следующую стадию.

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

Текущий подход

В настоящее время я вызываю Lambda B напрямую из Lambda A, используя javascript SDK. Это имеет значительное количество недостатков; Примечательно, что я одновременно запускаю две лямбды без какой-либо выгоды для производительности. Другими словами, я плачу за Lambda A, чтобы просто сидеть там и ждать ответа от Lambda B (за который я также плачу).

Это похоже на анти-паттерн, и я слышал, что это так.

Вопросы)

Это выглядит как довольно распространенный сценарий - выполнить вызов API (функция A), а затем выполнить некоторую дополнительную логику для дополнения, переформатирования или иного изменения этого ответа (функция B) перед передачей его вызывающей стороне.

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

  • Какие у меня варианты для этого с двумя лямбда-функциями, если я не могу использовать пошаговые функции?

  • Есть ли другие способы обойти ограничение размера полезной нагрузки Step Functions в 32 КБ помимо использования S3?

  • Если я глуп, что хочу избежать подхода S3/Step Function, ответы, объясняющие, почему мои опасения беспочвенны, также будут приветствоваться.

редактировать

Почему вы даже рассматриваете возможность разделения функций извлечения данных и их обработки на две разные функции AWS Lambda?

Представьте, что вместо просто лямбды А у меня есть две дюжины лямбда, которые должны использовать функциональность лямбды Б.

Итак, я упаковываю (функциональность) Lambda B, публикую его на Nexus, и два других моих дюжины Lambdas потребляют его во время сборки. Все мои лямбды увеличиваются в размерах, и я должен публиковать больше пакетов npm, поскольку я накапливаю больше "лямбда-В". Это то, чего я хочу избежать.

Я хочу, чтобы мои "Lambda A" использовали другие лямбда-выражения, а не пакеты npm, для широко распространенной функциональности. Возможно, я воспринимаю "функцию" в "лямбда-функции" слишком буквально, или, может быть, я просто пытаюсь использовать FaaS в полной мере.

1 ответ

Из вашего вопроса я могу прочитать следующие требования:

  • вам нужна функция AWS Lambda (за API-шлюзом), которая будет действовать как конечная точка API для клиентского приложения
  • Ваша функция AWS Lambda должна извлечь данные из бэкэнд-системы и обработать их для использования клиентским приложением
  • такие запросы являются синхронными, и чем быстрее они отвечают, тем лучше (и, конечно, дешевле)
  • логика, которую вам нужно выполнить, не слишком сложна и занимает, вероятно, всего несколько миллисекунд

Почему вы даже рассматриваете возможность разделения функций извлечения данных и их обработки на две разные функции AWS Lambda? Не воспринимайте "функцию" в "Лямбда-функции AWS" слишком буквально: код, который вы запускаете в лямбда-функции AWS, может быть настолько сложным, насколько это необходимо. Просто запустите все в одной функции AWS Lambda и логически разделите код. Это самый эффективный и чистый способ.

Вы не сказали, насколько велика ваша полезная нагрузка между процессами A и B. Но если она меньше 250 КБ, я бы предложил настроить промежуточную очередь SQS, где процесс A публикует результаты, а процесс B запускается новыми сообщениями в очереди.

Другие вопросы по тегам