Запуск Java Lambda через шлюз API в - PullRequest
0 голосов
/ 27 марта 2020

Я пытаюсь заставить локальную Java программу работать в AWS Lambda и сделать так, чтобы ее можно было вызывать с помощью HTTP-запроса. Все, что мне нужно, это просто иметь возможность дублировать функциональность запуска java локально из командной строки через HTTP в AWS, чтобы другие сотрудники компании могли выполнить код, просто отправив HTTP-запрос в Postman (на данный момент, следующий шаг - это веб-форма, которая просто делает запрос) вместо загрузки jar и запуска командной строки Java.

Я прошел учебник hello world на сайте Amazon и смог адаптировать свой код и успешно запустите его, используя функцию тестирования на панели управления AWS Lambda. Я также могу видеть журналы в cloudwatch, которые он запустил, а также наблюдать за результатами. Так что все это работает от функции тестирования панели управления Lambda.

Таким образом, вместо аргументов командной строки я даю аргументы в формате JSON следующим образом:

{
  "environment": "dev",
  "username": "Test",
  "password": "Test22",
  "storeId": "TESTMA0001",
  "data": "a,b,c,d"
}

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

Однако я хочу иметь возможность ввести это в теле HTTP-запроса и запустить свою лямбду, поэтому я добавил шлюз API через gui в панели aws lambda, выбрал вид HTTP API и параметры по умолчанию.

Затем я отправляю HTTP-запрос GET на конечную точку API, тело которого совпадает с вводом, которое я использовал на панели тестирования, но всякий раз, когда я запускаю его, я получаю внутреннюю ошибку сервера. Я включил журналы доступа для API шлюза, и я получаю следующее: моя лямбда не запускается через API, поскольку при использовании API не пишется лямбда-журнал, он записывается при запуске из AWS лямбда-панель.

{
    "requestId": "KByVuheeoAMEPLA=",
    "ip": "",
    "requestTime": "27/Mar/2020:02:25:40 +0000",
    "httpMethod": "GET",
    "routeKey": "$default",
    "status": "500",
    "protocol": "HTTP/1.1",
    "responseLength": "35"
}

Моя функция handleRequest принимает строку, отображение строки в качестве входных данных и возвращает строку в качестве вывода:

public class StoreCategoryImporter implements RequestHandler<Map<String,String>, String> {
    @Override
    public String handleRequest(Map<String,String> event, Context context)

Я даже не использую объект контекста, но он был там в учебник так и остался.

Я часами гуглил и не смог найти решение, любая помощь будет признательна. Я нахожу большинство AWS руководств, пропускающих некоторые важные детали, или у них их нет для разработчиков POJO и использующих js, которые я не понимаю.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 01 апреля 2020

Я решил эту проблему, прибегнув к поиску и поиску более близкого решения. Забудьте об учебнике AWS, вам нужно переопределить метод handleRequest (APIGatewayProxyRequestEvent, Context), а не тот, который просто принимает событие Map (String, String), как описано в учебнике hello world, если вы хотите иметь возможность вызвать вашу лямбду через HTTP-запрос.

Кроме того, «настроить тестовое событие» в AWS GUI в этом случае бесполезно. Он не может разобрать JSON, что не является примитивом. Вероятно, CLI будет работать лучше.

0 голосов
/ 27 марта 2020

Чтобы смоделировать событие API Gateway для тестов в вашей лямбда-версии, лямбда-консоль имеет несколько предустановленных значений. В своей лямбде вы go до Configure test event и выбираете событие, которое хотите смоделировать, например:

enter image description here

В качестве альтернативы вы можете распечатать реальное событие в журналах lambda to CloudWatch и используйте его для тестов.

...