Как создать CRUD API на Amazon Lambda с помощью Micronaut

Я хочу создать 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 всегда вызывается.

  1. Возможно/рекомендуется ли встраивать много функций в одну банку?
  2. Как я могу заставить вызовы POST вызывать MicronautAwsPocPostFunction вместо MicronautAwsPocFunction?
  3. Если мне нужна дополнительная функция PUT, как я могу ее смоделировать?

person codependent    schedule 18.02.2019    source источник


Ответы (1)


Я пробовал другой подход, вот как я это решил:

Вместо использования функций я перешел на функции Lambda с использованием прокси-сервера AWS API Gateway. . Также примите во внимание эту конкретную документацию по лямбде aws.

Я воссоздал проект с помощью этой команды 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:

ПОЛУЧИТЬ:

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

СООБЩЕНИЕ:

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

person codependent    schedule 18.02.2019