Kotlin/JVM
在Kotlin上创建AWS Lambda函数最自然的方法是使用Kotlin/JVM并针对Java 8 Lambda运行时。 Kotlin与Java的互操作性非常好。JVM Lambda函数应该打包成fat JAR,即包含所有依赖项的JAR文件。使用Gradle很容易实现:
build.gradle.kts:
plugins {
kotlin("jvm").version("1.3.41") // (1)
id("com.github.johnrengelman.shadow").version("5.1.0") // (2)
}
repositories {
jcenter()
}
dependencies {
implementation(kotlin("stdlib-jdk8")) // (3)
implementation("com.amazonaws:aws-lambda-java-core:1.2.0") // (4)
}
然后只需创建一个处理程序:
Handler.kt:
class Handler : RequestHandler<Input, Output> { // (1)
override fun handleRequest(input: Input, context: Context): Output {
println(input)
return Output()
}
}
RequestHandler
类。您只需要实现它的单个方法handleRequest
。输入和输出可以是您的POJO(POKO),只需确保它们可以使用Jackson进行序列化和反序列化(Lambda的文档没有明确提到,但如果出现问题,您将在日志中看到Jackson的提及);或原始类型;或一些预定义类。在这里查看完整的代码示例::其中包含可与{{link3:API Gateway中的Lambda代理集成}}一起使用的函数。
对于Kotlin/JVM来说就是这样。非常简单。
Kotlin/JS
我不是Kotlin/JS的专家,但你也可以将目标设置为Node.js运行时,尽管这并不像JVM那样直观。
思路将会是将你的Kotlin代码编译(转换)成JavaScript,并将其部署为通常的JavaScript Lambda函数(即ZIP文件)。
处理程序可以如下所示:
Handler.kt
import kotlin.js.json
@JsName("handle")
fun handle(input: dynamic, context: dynamic): dynamic {
println(JSON.stringify(input))
val result: dynamic = json(
"statusCode" to 307,
"headers" to json(
"Location" to "https://google.com"
)
)
return result
}
node_modules
)打包到ZIP文件中。可能有很多方法可以做到这一点,您可以参考其中一个这里。亚马逊 宣布 Lambda Runtime API,这是在 AWS re:Invent 2018上发布的。它允许开发人员使用所谓的自定义运行时构建Lambda函数,使用他们想要的任何技术。是的,现在可以使用PHP、Perl、Pascal(有人用吗?)甚至Bash(他们在文档中使用它)编写函数了!
自定义运行时函数与普通函数的工作方式略有不同。运行时的工作是:
一个非常基础的处理程序可能看起来像这样:
Handler.kt:
fun main() = runBlocking { // (1)
val client = HttpClient(Curl) // (2)
while (true) { // (3)
val invocation = client.call("http://${getenv("AWS_LAMBDA_RUNTIME_API")!!.toKString()}/2018-06-01/runtime/invocation/next") {
method = HttpMethod.Get
} // (4)
// (5)
val invocationId = invocation.response.headers["Lambda-Runtime-Aws-Request-Id"]
// (6)
client.call("http://${getenv("AWS_LAMBDA_RUNTIME_API")!!.toKString()}/2018-06-01/runtime/invocation/$invocationId/response") {
method = HttpMethod.Post
body = TextContent(
"{\"statusCode\": 307, \"headers\": {\"Location\": \"https://google.com\"}}",
ContentType.Application.Json
)
}
}
}
runBlocking
。Curl
引擎配置HTTP客户端。这是本文开头图片中的初始化阶段。正如您所看到的,在Kotlin/Native中需要编写更多的代码。可以在这里查看完整的示例。
结论
如果您想要使用Lambda函数,可能不应该考虑Kotlin/JS和Kotlin/Native。
Kotlin/JS相对于JavaScript和TypeScript几乎没有提供更多的东西,但需要编写更多的代码才能达到相同的结果。面对JavaScript固有的动态性会带来一些痛苦,我认为 Kotlin/JS 的互操作性不如 Kotlin/JVM。构建过程也更加复杂,因为它需要配置 Gradle 和 NPM 一起工作(而 JS/TS 只需要 NPM,Kotlin/JVM 只需要 Gradle)。
Kotlin/Native需要你编写更多的代码来处理事件。此外,您将无法轻松地使用任何 AWS SDK:JVM库将无法与 Kotlin/Native 兼容(尽管您可能可以使用比 JVM 更低级别的 C/C++ SDK)。构建过程也更加复杂。
如果你有兴趣比较AWS Lambda的不同语言/运行时,请查看我在上面链接了几次的repo。它包括用Java、Kotlin/JVM、Kotlin/JS、Kotlin/Native、JS、Ruby、Python和Bash实现的Lambda。要了解有关AWS Lambdas的Kotlin/Native的更多信息,请在这里阅读。该文章还对不同语言的函数速度进行了比较。简而言之:截至今日,所有编写Kotlin代码的开发者都在使用AWS Java SDK。今天AWS发布了官方的Kotlin SDK。详情请见此处:
https://aws.amazon.com/blogs/developer/aws-sdk-for-kotlin-alpha-release/