Управление лямбда-функциями 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 запускается новыми сообщениями в очереди.