Serverless на Kotlin: AWS Lambda и аналоги — пишем бессерверный код, который работает
Когда-то написание бэкенда было синонимом настройки серверов, конфигурации Nginx и бессонных ночей с мониторингом нагрузки. Сегодня всё иначе. Serverless — это не фантастика, а реальность, которая позволяет забыть о железе и сосредоточиться на логике приложения. А если вы пишете на Kotlin, то получаете элегантный, безопасный и быстрый код, который идеально ложится на бессерверную архитектуру.
В этой статье мы разберём, как создавать serverless функции на Kotlin, какие облачные провайдеры предлагают лучшие условия, и как не утонуть в деталях конфигурации. Поехали!
Что такое serverless и почему Kotlin — идеальный выбор
Serverless (или бессерверные вычисления) — это модель облачных вычислений, где вы пишете код, а инфраструктуру берёт на себя провайдер. Вы не платите за простаивающий сервер — только за время выполнения функции. Звучит как мечта? Для Kotlin это особенно актуально.
Почему именно Kotlin? Во-первых, он компилируется в байт-код JVM, что даёт нативную поддержку на AWS Lambda, Google Cloud Functions и Azure Functions. Во-вторых, Kotlin — это современный язык с нулевой стоимостью абстракций, лямбдами и корутинами. В-третьих, его синтаксис позволяет писать лаконичный код, который легко поддерживать.
Основные преимущества serverless функций на Kotlin:
- Экономия — платите только за реальное выполнение кода.
- Масштабирование — облако само решает, сколько инстансов запустить.
- Простота — не нужно настраивать сервер.
- Быстрый старт — деплой одной командой.
Но есть и нюансы: «холодный старт» (cold start) может занять до нескольких секунд, особенно для JVM-языков. Однако современные провайдеры научились с этим бороться: AWS Lambda с Provisioned Concurrency или Google Cloud Functions с min-instances решают проблему.
AWS Lambda: король бессерверных вычислений
Начнём с самого популярного сервиса — AWS Lambda. Amazon Web Services предлагает зрелую экосистему, где Kotlin работает «из коробки» через Java Runtime.
Как настроить AWS Lambda для Kotlin
Вам понадобится Gradle или Maven. Мы используем Gradle с плагином Kotlin. Пример build.gradle.kts:
plugins {
kotlin("jvm") version "1.9.0"
id("com.github.johnrengelman.shadow") version "7.1.2"
}
dependencies {
implementation("com.amazonaws:aws-lambda-java-core:1.2.2")
implementation("com.amazonaws:aws-lambda-java-events:3.11.0")
}
tasks {
shadowJar {
archiveBaseName.set("lambda-function")
archiveClassifier.set("")
}
}
Теперь напишем саму функцию. AWS Lambda ожидает класс с методом handleRequest. Вот простейший обработчик, который возвращает приветствие:
import com.amazonaws.services.lambda.runtime.Context
import com.amazonaws.services.lambda.runtime.RequestHandler
class HelloHandler : RequestHandler<Map<String, String>, String> {
override fun handleRequest(input: Map<String, String>, context: Context): String {
val name = input["name"] ?: "World"
return "Hello, $name! Ваша serverless функция на Kotlin работает!"
}
}
Собираем fat JAR: ./gradlew shadowJar. Загружаем в AWS Lambda, указываем runtime Java 11 или Java 17. Готово!
Работа с событиями AWS
Часто Lambda реагирует на события S3, DynamoDB или API Gateway. Пример обработчика для S3:
import com.amazonaws.services.lambda.runtime.events.S3Event
class S3Handler : RequestHandler<S3Event, String> {
override fun handleRequest(event: S3Event, context: Context): String {
val bucket = event.records.first().s3.bucket.name
val key = event.records.first().s3.`object`.key
return "Файл $key загружен в корзину $bucket"
}
}
Обратите внимание на обратные кавычки вокруг object — это ключевое слово Kotlin, поэтому его нужно экранировать.
Google Cloud Functions: альтернатива с Kotlin
Google Cloud Functions (GCF) — отличный выбор, если вы уже используете GCP. Поддержка Kotlin реализована через Java 11+. Деплой происходит через gcloud CLI.
Пример функции на Kotlin для GCF
Создадим HTTP-функцию, которая принимает запрос и возвращает JSON:
import com.google.cloud.functions.HttpFunction
import com.google.cloud.functions.HttpRequest
import com.google.cloud.functions.HttpResponse
class HelloGcf : HttpFunction {
override fun service(request: HttpRequest, response: HttpResponse) {
val writer = response.writer
writer.write("{\"message\": \"Привет из Google Cloud Functions на Kotlin!\"}")
}
}
В build.gradle.kts добавьте:
dependencies {
implementation("com.google.cloud.functions:functions-framework-api:1.1.0")
}
Деплой: gcloud functions deploy hello-gcf --entry-point HelloGcf --runtime java11 --trigger-http.
Azure Functions: Kotlin в мире Microsoft
Azure Functions также поддерживает Kotlin через Java. Плюс — глубокая интеграция с Azure DevOps и мощные триггеры (Blob Storage, Service Bus, Cosmos DB).
Создание Azure Function на Kotlin
Используем Maven с архетипом: mvn archetype:generate -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-kotlin-archetype. Пример HTTP-триггера:
import com.microsoft.azure.functions.*
import com.microsoft.azure.functions.annotation.*
class KotlinFunction {
@FunctionName("helloKotlin")
fun run(
@HttpTrigger(name = "req", methods = [HttpMethod.GET, HttpMethod.POST], authLevel = AuthorizationLevel.ANONYMOUS)
request: HttpRequestMessage<Optional<String>>,
context: ExecutionContext
): HttpResponseMessage {
return request.createResponseBuilder(HttpStatus.OK)
.body("Azure Functions приветствует Kotlin!")
.build()
}
}
Деплой через Maven: mvn azure-functions:deploy.
Сравнение провайдеров: какой выбрать?
Выбор зависит от ваших задач. Давайте сведём основные параметры в таблицу:
- AWS Lambda — зрелый сервис, огромное количество интеграций, лучшая документация. Минус — холодный старт для JVM.
- Google Cloud Functions — проще конфигурация, меньше задержек, отличная интеграция с Firebase. Меньше регионов.
- Azure Functions — лучшая поддержка корпоративных сценариев, встроенный мониторинг, но сложнее локальная разработка.
Для стартапов