Serverless функции на Kotlin: AWS Lambda и альтернативы

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

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 — лучшая поддержка корпоративных сценариев, встроенный мониторинг, но сложнее локальная разработка.

Для стартапов

Блоги

Рекомендаций по книгам