Я хочу создать CRUD API с помощью Micronaut и развернуть его на AWS Lambda, предоставляя различные методы с помощью Amazon API Gateway. Я мог бы создать разные проекты Kotlin для каждой конечной точки (GET, POST...), один из которых включает одну функцию, но это довольно громоздко, поэтому я бы предпочел иметь один проект со всеми функциями CRUD.
Мое текущее приложение содержит две функции: одного поставщика (GET) и одного потребителя (POST).
Применение:
object Application {
@JvmStatic
fun main(args: Array<String>) {
Micronaut.build()
.packages("micronaut.aws.poc")
.mainClass(Application.javaClass)
.start()
}
}
Поставщик:
@FunctionBean("micronaut-aws-poc")
class MicronautAwsPocFunction : Supplier<String> {
override fun get(): String {
println("GET")
return "micronaut-aws-poc"
}
}
Потребитель:
@FunctionBean("micronaut-aws-poc-post")
class MicronautAwsPocPostFunction : Consumer<String> {
override fun accept(t: String) {
println("POST $t")
}
}
Затем я создал ресурс в Amazon API Gateway с одним методом GET и одним методом POST. Проблема в том, что независимо от того, какой из них я вызываю, MicronautAwsPocFunction всегда вызывается.





Я пробовал другой подход, вот как я это решил:
Вместо использования функций я изменил на Лямбда-функции с использованием прокси-сервера AWS API Gateway. Также учитывайте эта конкретная документация aws lambda.
Я воссоздал проект этой командой mn create-app micronaut-poc --features aws-api-gateway -l kotlin
Теперь у меня есть «обычное» REST-приложение с двумя контроллерами:
@Controller("/")
class PingController {
@Get("/")
fun index(): String {
return "{\"pong\":true}"
}
}
@Controller("/")
class PongController {
@Post("/")
fun post(): String {
println("PONG!!!!!!!")
return "{\"ping\":true}"
}
}
Волшебство происходит в конфигурации AWS API Gateway. Нам нужно настроить прокси-ресурс:
Наконец, мы можем вызвать лямбду из шлюза API, установив правильный метод HTTP. ВАЖНЫЙ: Установите заголовок хоста, иначе Micronaut выдаст исключение nullpointer:
ПОЛУЧИТЬ:
ПОЧТА: