Как создать функцию AWS Lambda на Kotlin? - PullRequest
0 голосов
/ 11 мая 2018

Обеспечивают ли функции AWS Lambda поддержку языка Kotlin?В настоящее время мастер создания функций Lambda не содержит опцию Kotlin в раскрывающемся списке времени выполнения:

enter image description here

Но есть Java 8 и разные версии Node.js.Какая платформа больше подходит для функции, написанной на Kotlin в контексте AWS Lambda - JVM или Node.js?А какие фреймворки Kotlin можно использовать для написания лямбда-функции?

Ответы [ 2 ]

0 голосов
/ 03 августа 2019

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)
}

  1. Стандартный плагин Kotlin / JVM , который поддерживаетсоздание артефактов JVM
  2. Плагин теней для толстых JAR
  3. Stdlib Котлина требуется для выполнения.Здесь мы используем один, скомпилированный с JDK 8.
  4. Этот артефакт предоставляет некоторые интерфейсы для реализации в лямбда-функциях Java.

Затем просто создайте обработчик:

Handler.kt:

class Handler : RequestHandler<Input, Output> { // (1)
    override fun handleRequest(input: Input, context: Context): Output {
        println(input)

        return Output()
    }
}

  1. Библиотека предоставляет вам общий класс 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 )!

Пользовательские функции времени выполнения работают немногоиначе, чем обычные функции.Задача среды выполнения:

  1. Выполнить логику инициализации функции.В случае Java это означает запуск JVM, загрузку классов и запуск статических инициализаторов.
  2. Найдите обработчик, переданный через параметр конфигурации «Обработчик».
  3. Выполните обработчик для каждого входящегоevent.

Вот изображение, которое поможет вам понять жизненный цикл функции:

Custom runtime lifecycle

Очень простой обработчик может выглядетьвот так:

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
            )
        }
    }
}
  1. Пока мы будем использовать сопрограммы благодаря Ktor, нам нужна область сопрограмм.Самый простой способ приобрести один из них - runBlocking.
  2. Сконфигурировать HTTP-клиент с использованием механизма Curl.Это фаза инициализации с картинки в начале этого поста.
  3. Введите цикл событий.
  4. Извлеките следующее событие для обработки.
  5. Выполните анализ события.Чувствуете себя лучше, чем grep, не так ли?
  6. Ответьте, позвонив в 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:

  1. Kotlin / Native не очень производительный.Все еще лучше, если функции холодного запуска JVM.
  2. Golang, вероятно, является лучшим выбором для лямбда-функций, если вы ищете скорость.
  3. Предварительно прогретые функции JVM (как Java, так и Kotlin) выполняюточень хорошо.
  4. Kotlin / JS обеспечивают хорошее время холодного запуска, но предварительно подогретые скриптовые функции уступают Golang и JVM.
0 голосов
/ 11 мая 2018

В Javaland, если вы размещаете программу Kotlin на сервере, вы должны сделать ее жирной флягой, чтобы вы могли выполнять ее на любой JVM, не беспокоясь о явной поддержке Kotlin.

В качестве альтернативы, если вы не хотите оплачивать затраты на запуск JVM для холодного старта AWS Lambda, вы можете использовать Kotlin, предназначенный для среды выполнения Node.js вместо JVM. Но я бы использовал почти такой же подход: (транс) скомпилировать ваш Kotlin в Javascript на сервере сборки, упаковать ваши (сейчас) модули Javascripts + NPM и отправить их в Lambda. Это может работать, а может и не работать, в зависимости от того, сколько вы написали своего кода, предполагая пакеты Java ...

Итак, я думаю, что ответ на ваш вопрос двоякий:

  1. Сколько вам нужно времени, которое занимает холодный старт? / как часто вы будете делать холодные запуски против теплых запросов?
  2. Насколько вы зависите от Java-приложений в вашем приложении?

Но в обоих случаях вам не требуется явная поддержка Kotlin, только байт-код, который генерирует ваш процесс компиляции (JVM или Javascript / Node)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...