Kotlin / JVM
Наиболее естественным способом создания функции Lambda AWS в Kotlin было бы использование Kotlin / JVM и целевой среды выполнения Java 8 Lambda.Взаимодействие Kotlin с Java действительно здорово.Лямбда-функции JVM должны быть упакованы в толстые файлы 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)
}
- Стандартный плагин Kotlin / JVM , который поддерживаетсоздание артефактов JVM
- Плагин теней для толстых JAR
- Stdlib Котлина требуется для выполнения.Здесь мы используем один, скомпилированный с JDK 8.
- Этот артефакт предоставляет некоторые интерфейсы для реализации в лямбда-функциях Java.
Затем просто создайте обработчик:
Handler.kt:
class Handler : RequestHandler<Input, Output> { // (1)
override fun handleRequest(input: Input, context: Context): Output {
println(input)
return Output()
}
}
- Библиотека предоставляет вам общий класс
RequestHandler
.Все, что вам нужно сделать, это реализовать один метод handleRequest
.Input
и Output
могут быть вашими POJO (POKO), просто убедитесь, что они могут быть сериализованы и десериализованы с Джексоном (документы Lambda не упоминают об этом неявно, но если что-то не получится, вы увидитеДжексон упоминает в журналах);или примитивные типы;или некоторые предопределенные классы.
Взгляните на полный пример кода здесь : он содержит функцию, которую можно использовать с лямбда-прокси-интеграциями в API Gateway .
Вот и все для Kotlin / JVM.Очень просто.
Kotlin / JS
Я не эксперт по Kotlin / JS, но вы также можете ориентироваться на среду выполнения Node.js, хотя это не такбудь таким же простым, как JVM.
Идея будет состоять в том, чтобы скомпилировать (перенести) свой код Kotlin в JavaScript и развернуть его как обычную лямбда-функцию JavaScript (т.е. 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
}
Полный пример можно найти здесь .Он выполняет те же функции, что и лямбда-функция Kotlin / JVM (отвечает перенаправлениями), но работает в среде исполнения Node.js 10.x.
Настройка проекта для Kotlin / JS немного сложнее: вам потребуетсяупакуйте перенесенный JS вместе с зависимостями (node_modules
) в ZIP-файл.Есть много способов сделать это, вы можете взглянуть на один из них здесь .
Бонус: Kotlin / Native!
Amazon анонсировано Lambda Runtime API для AWS re: Invent 2018 .Это позволяет разработчикам, среди прочего, создавать функции Lambda с использованием любой технологии, которую они хотят, с помощью так называемых Custom Runtimes .Да, теперь можно написать функцию на PHP, Perl, Pascal (кто-нибудь?) Или даже Bash (они используют ее в docs )!
Пользовательские функции времени выполнения работают немногоиначе, чем обычные функции.Задача среды выполнения:
- Выполнить логику инициализации функции.В случае Java это означает запуск JVM, загрузку классов и запуск статических инициализаторов.
- Найдите обработчик, переданный через параметр конфигурации «Обработчик».
- Выполните обработчик для каждого входящегоevent.
Вот изображение, которое поможет вам понять жизненный цикл функции:
Очень простой обработчик может выглядетьвот так:
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
)
}
}
}
- Пока мы будем использовать сопрограммы благодаря Ktor, нам нужна область сопрограмм.Самый простой способ приобрести один из них -
runBlocking
. - Сконфигурировать HTTP-клиент с использованием механизма
Curl
.Это фаза инициализации с картинки в начале этого поста. - Введите цикл событий.
- Извлеките следующее событие для обработки.
- Выполните анализ события.Чувствуете себя лучше, чем grep, не так ли?
- Ответьте, позвонив в AWS REST API.
Как выэ-э, вам нужно будет написать гораздо больше кода в случае Kotlin / Native.Взгляните на полный пример здесь .
Выводы
Вы, вероятно, не должны смотреть на Kotlin / JS и Kotlin /Пока еще не поддерживает Lambda-функции.
Kotlin / JS практически ничего не дает по сравнению с JavaScript и TypeScript, но требует большего количества строк кода для достижения того же результата.Столкновение с присущим JS динамизмом вызывает некоторую боль, взаимодействие Kotlin / JS ИМХО не так хорошо, как в случае с Kotlin / JVM.Сборка более сложна, так как она потребует от вас настройки Gradle и NPM для совместной работы (в то время как JS / TS потребует только NPM, а Kotlin / JVM требуется только Gradle).
Kotlin / Native требует от васнаписать больше кода, чтобы просто обрабатывать события.Кроме того, вы не сможете легко использовать любые AWS SDK: библиотеки JVM не будут работать с Kotlin / Native (хотя вы, вероятно, могли бы использовать C / C ++ SDK, который гораздо более низкого уровня, чем JVM).Сборка также более сложна.
Если вам интересно сравнить разные языки / среды выполнения для AWS Lambda, взгляните на это repo , которое я упоминал несколько раз выше.Он имеет Lambdas, реализованный на Java, Kotlin / JVM, Kotlin / JS, Kotlin / Native, JS, Ruby, Python и Bash.Чтобы узнать больше о Kotlin / Native для AWS Lambdas, перейдите по ссылке здесь .В статье также приведено сравнение скорости выполнения функций на разных языках.TLDR:
- Kotlin / Native не очень производительный.Все еще лучше, если функции холодного запуска JVM.
- Golang, вероятно, является лучшим выбором для лямбда-функций, если вы ищете скорость.
- Предварительно прогретые функции JVM (как Java, так и Kotlin) выполняюточень хорошо.
- Kotlin / JS обеспечивают хорошее время холодного запуска, но предварительно подогретые скриптовые функции уступают Golang и JVM.