AWS Lambda: уточнение при извлечении данных из объекта события - PullRequest
3 голосов
/ 17 мая 2019

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

Пример: допустим, я хочу передать некоторые данные лямбда-функции, т.е.{"hello":"world"} и сделайте это, передав данные этой лямбда-функции, создав конечную точку REST в AWS API Gateway

На данный момент я понимаю, что существует три способа извлечения данных:

1) event.queryStringParameters (имеет смысл)

ex.Мы можем прикрепить параметры запроса к URL запроса: https://fakefakefake.execute -api.us-west-2.amazonaws.com / test / myapi? Hello = world и в лямбда-функции:

const data = event.queryStringParameters.hello; // world

2) event.body (имеет смысл, и это возможно благодаря «интеграции лямбда-прокси»)

ex.Если мы прикрепим данные в теле запроса POST / PUT / etc, используя Lambda Proxy Integration (т.е. переадресовываем все данные), мы можем получить к ним доступ через event.body & в функции lambda (но сделавОбязательно JSON.parse event.body, поскольку Lambda Proxy Integration будет проходить через строковый JSON и не действительный / "настоящий" JSON):

const data = event.body.hello; // world

3) Непосредственно для объекта события (неясно)

ех.В данный момент этот случай неясен - передать данные лямбда-функции из настройки конечной точки REST в API-шлюзе, где они затем будут доступны непосредственно из объекта события?

const data = event.hello; // world

Что является примером того, какпередать данные "напрямую" на объект события в лямбда-функции, как в случае № 3?I THINK В этом случае требуется, чтобы я создал «шаблон отображения» при настройке API / Lambda, но мне все еще неясно.

Для простого сценария Node случай 2, по-видимому, имеет«издержки» разбора тела события из строкового JSON, так что это понятный недостаток, но в дополнение к тому, как это сделать, почему или когда вариант 3 будет более желательным?

Ответы [ 2 ]

5 голосов
/ 17 мая 2019

Lambda - это автономный сервис, который не нужно интегрировать с API Gateway.queryStringParameters, body, body mapping templates, все это относится не только к лямбде, но и к интеграции лямбда-шлюза API.

Если вы используете Lambda с другими службами, то данные обычно передаются напрямую через объект event, и нет особых причин для их передачи другим способом.

Например,Вы можете подписать функцию Lambda на корзину S3 и использовать ее для программной обработки таких событий, как файл, загружаемый в корзину.В этом случае такая информация, как имя сегмента, ключ объекта, данные объекта, метаданные, ... будет передаваться напрямую через event объект.

И, при использовании Lambda с API-шлюзом, зачем вамиспользовать body mapping templates для передачи данных в вашу функцию Lambda напрямую через объект event?Потому что вы можете использовать эту функцию намного проще для других целей (если она жизнеспособна в вашем сценарии), потому что ваша лямбда-функция будет иметь гораздо более простой интерфейс, чем функция, тесно связанная с интеграцией API-шлюза.

Например, выможет иметь функцию, которая выполняет некоторые вычисления переданных номеров, которые вы можете вызывать через API Gateway, а также вызывать ее непосредственно из вашего приложения.Работать с такой функцией будет намного проще, если она ожидает event.x и event.y вместо некоторого event.queryStringParameter.x, что может иметь нулевой смысл вне API-шлюза.

2 голосов
/ 22 мая 2019

Опираясь на идеи Матуса, я теперь могу лучше ответить на остальные вопросы сверху:

  • «Что является примером того, как передавать данные« напрямую »по событиюобъект в лямбда-функции, как в случае № 3? "

При настройке API-шлюза с Lambda для отправки определенных фрагментов данных необходимо использовать шаблон отображения, который настраивается вAWS API Gateway.

Этот шаблон сопоставления записан на языке 1011 * Velocity Template Language (VTL) от Apache Foundation.Например, для присоединения только данных "привет", чтобы они были доступны как const data = event.hello; // world, например:

    { 
      "hello": $input.params('$hello')
    }

Примечание: VTL очень мощный, вышеэто не реалистичный пример использования, но наименьшее количество VTL только для того, чтобы передать идею, см. здесь и здесь для более подробной информации

Прыжок через интерфейс, чтобы установить этоШаблон сопоставления является небольшим испытанием для начального примера, поэтому вот иллюстрированные шаги:

API Steps

Предупреждение: Обязательно удвойте-проверьте, что на самом деле отображается в редакторе, поскольку при смене раскрывающегося меню в шаблоне сопоставления могут иногда происходить неожиданные или неожиданные действия.Иногда вы также сталкиваетесь с неисправимыми проблемами, связанными с шаблоном сопоставления. Лучше всего начать с удаления метода и перезапустить его из API Gateway.

  • "Для простого сценария Node, вариант 2похоже, что есть «накладные расходы» на синтаксический анализ тела события из строкового JSON, так что это понятный недостаток, но почему или когда вариант 3 был бы более желательным подходом?

Все зависит от того, какваша Lambda получает свои данные.

Ключевым выводом Matus является то, что в конечном итоге все это деталь реализации. Lambdas в этом надуманном примере (т.е. настройте REST API через AWS Gateway, отправьте GET / POST наэтот API и лямбда-код что-то делает с данными) может извлекать данные тремя способами:

(1) параметры URL const data = event.queryStringParameters.hello; // world

(2) тело запроса const data = event.body.hello; // world (см. примечание ниже)

(3) непосредственно на объекте события const data = event.hello; // world

Примечание к 2: для этого необходимо выбрать (a) Лямбда-прокси-интеграция вместо использованияшаблон сопоставления, и в вашем коде вам потребуется JSON.parse тело события перед доступом к данным, см. этот ответ для получения дополнительной информации

Все это зависит от того, откуда оно подаетсяAPI-шлюз.В этом конкретном примере я говорю о выполнении запроса REST для передачи данных на конечную точку шлюза API, которая затем обрабатывается Lambda, но множество других служб / триггеров могут отправлять данные в Lambda-скрипт для анализа.

Другие полезные ресурсы:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...