如何使用 Micronaut 在 Amazon Lambda 上创建 CRUD API

How to create a CRUD API on Amazon Lambda using Micronaut

我想使用 Micronaut 创建一个 CRUD API 并将其部署在 AWS Lambda 上,使用 Amazon API 网关公开不同的方法。我可以为每个端点(GET,POST...)创建不同的 Kotlin 项目,一个包含一个函数,但这有点麻烦所以我宁愿有一个包含所有 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")
    }

}

然后,我使用一个 GET 和一个 POST 方法在 Amazon API 网关中创建了一个资源。问题是,无论我调用哪一个,MicronautAwsPocFunction 总是被调用。

  1. 是不是possible/recommended在一个jar中嵌入了很多功能?
  2. 如何让 POST 调用调用 MicronautAwsPocPostFunction 而不是 MicronautAwsPocFunction?
  3. 如果我想要一个额外的 PUT 函数,我该如何建模?

我尝试了不同的方法,我是这样解决的:

我没有使用函数,而是改为 Lambda Functions Using AWS API Gateway Proxy. Also take into account this specific aws lambda documentation

我用这个命令重新创建了项目mn create-app micronaut-poc --features aws-api-gateway -l kotlin

现在我有一个 "normal" 带有两个控制器的 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 网关配置中。我们必须配置一个代理资源:

最后,我们可以从设置正确 HTTP 方法的 API 网关调用 lambda。 重要提示:设置主机头,否则 Micronaut 将抛出空指针异常:

获取:

POST: