#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.