Передача параметров в мою java AWS лямбда-функцию

#java #amazon-web-services #aws-lambda

#java #amazon-веб-сервисы #aws-lambda

Вопрос:

Только что начал с использования AWS Lambda. Я пишу свои функции на Java. Я хотел бы знать, можете ли вы передавать параметры AWS Lambda через шлюз API? Моя лямбда-функция в основном вызывает веб-сервис, который возвращает JSON, создает POJO из JSON, а затем файл CSV, который я загружаю в S3. Теперь этому веб-сервису вы можете передать ProductID, если захотите, если вы этого не сделаете, он просто вернет все продукты.

Это вернет продукт с идентификатором 123456 www.likssmark.com/test/api/getOrders ?ProductID=123456

Это вернет все заказы в виде полезной нагрузки JSON: www.likssmark.com/test/api/getOrders

Как мне передать ProductID в мою java lambda? Лямбда запускается через cloud watch по расписанию — я тестировал его с помощью Postman.

Надеюсь, это имеет смысл?

Большое спасибо за любые советы.

Комментарии:

1. Вы хотите, чтобы функция вызывалась через API Gateway для запросов API, а также из событий CloudWatch для прямого вызова, да? Они будут представлять параметры по-разному, но я не понимаю, почему вы не можете этого сделать. Для событий CW вы можете предоставить входные данные в формате JSON при настройке Lambda в качестве целевого объекта. Вы пробовали это?

2. К вашему сведению, если ваша лямбда-функция выполняет только то, что вы упомянули выше (получает JSON с удаленного сайта и записывает CSV в S3), я бы не стал писать это на Java.

3. Спасибо @jarmod, но почему бы вам не написать это на Java, я изначально делал это на JS.

4. Java медленнее загружается в Lambda (более высокое время холодного запуска), как правило, не оптимизирована для простой разработки HTTP и веб-приложений, не имеет встроенной обработки JSON, требует компиляции, Имеет большой вес и т. Д. Просто мое мнение.

5. Вы бы порекомендовали в основном Javascript?

Ответ №1:

Если вам нужно использовать только Cloudwatch, просто передайте строку JSON в свой Lambda:

введите описание изображения здесь

Затем в вашем Lambda вы можете извлечь данные:

 import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

...

public class ProductIdLambda implements RequestStreamHandler {

    public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
        LambdaLogger logger = context.getLogger();

        ObjectMapper objectMapper = new ObjectMapper();
        JsonNode rootNode = objectMapper.readTree(inputStream);

        String productId = rootNode.path("productId").asInt();
  

Это productId выводит из InputStream.

Если вам нужны как события CloudWatch, так и интеграция с API Gateway, вы можете либо использовать два разных Lambda, либо, по предложению @ f7o, проанализировать входящий поток для вызова API Gateway. У вас может быть что-то вроде:

 String httpMethod = rootNode.path("httpMethod").asText();
if( httpMethod != null )  // then we were called by API Gateway
  

Входные данные от API Gateway будут включать необязательный параметр во входной JSON:

 "queryStringParameters": {
    "productId": "12345"
},
  

затем вы можете получить свой productId .

Комментарии:

1. Большое спасибо, очень полезно, высоко ценится @stdunbar В конечном итоге это будет только cloudwatch, вызывающий его. Можете ли вы динамически вводить значение идентификатора продукта, поскольку это изменится?

2. @SteveGreen — да, конечно. Вы можете обновить входные данные через интерфейс командной строки AWS или через консоль. Кроме того, вы можете пропустить все правила cloudwatch и вызвать свой Lambda напрямую с помощью CLI. Более подробную информацию см. В этих ссылках .

Ответ №2:

Вы можете использовать AWS API-Gateway для передачи параметров в свой AWS lambda-сервис.
Это описано в документации AWS:
https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-create-api-as-simple-proxy-for-lambda.html

В моем немецком блоге я написал статью о том, как реализовать AWS lambda-сервис с помощью Java и Spring Boot. Здесь я также передаю параметры через API-шлюз в службу AWS lambda:
https://agile-coding.blogspot.com/2020/09/aws-lambda-services-mit-spring-boot.html

Ответ №3:

Существует несколько способов интеграции lambda в шлюз API. Для начала я бы создал простой HTTP API либо с маршрутом по умолчанию, либо с определенным маршрутом. Присоедините интеграцию с лямбдой к маршруту.

Это должно прокси HTTP-запрос к вашей лямбда-функции. Ваш обработчик lambda получит событие, которое содержит информацию о запросе в виде пути, файлов cookie, … а также параметры вашего запроса. Подробности о передаче json см. В документации (https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html).

Чтобы определить, кто на самом деле вызывает функцию (cloudwatch, api gateway), просто проверьте содержимое события для некоторых полей перед его анализом / чтением, чтобы убедиться, что вы отвечаете соответствующим образом.

Комментарии:

1. Спасибо за это, рассмотрю это. В конечном итоге лямбда-коды будут вызываться только через cloudwatch.