如何使用 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 总是被调用。
- 是不是possible/recommended在一个jar中嵌入了很多功能?
- 如何让 POST 调用调用 MicronautAwsPocPostFunction 而不是 MicronautAwsPocFunction?
- 如果我想要一个额外的 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:
我想使用 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 总是被调用。
- 是不是possible/recommended在一个jar中嵌入了很多功能?
- 如何让 POST 调用调用 MicronautAwsPocPostFunction 而不是 MicronautAwsPocFunction?
- 如果我想要一个额外的 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: