Serverless em Kotlin: AWS Lambda e similares — escrevendo código sem servidor que funciona
\nHouve um tempo em que escrever um backend era sinônimo de configurar servidores, ajustar Nginx e noites sem dormir monitorando a carga. Hoje é diferente. Serverless não é ficção científica, mas uma realidade que permite esquecer do hardware e focar na lógica da aplicação. E se você programa em Kotlin, obtém um código elegante, seguro e rápido que se encaixa perfeitamente na arquitetura serverless.
\nNeste artigo, vamos explorar como criar funções serverless em Kotlin, quais provedores de nuvem oferecem as melhores condições e como não se perder nos detalhes de configuração. Vamos nessa!
\n\nO que é serverless e por que Kotlin é a escolha ideal
\nServerless (ou computação sem servidor) é um modelo de computação em nuvem onde você escreve o código e o provedor cuida da infraestrutura. Você não paga por um servidor ocioso — apenas pelo tempo de execução da função. Parece um sonho? Para Kotlin, isso é especialmente relevante.
\nPor que Kotlin? Primeiro, ele compila para bytecode JVM, o que oferece suporte nativo no AWS Lambda, Google Cloud Functions e Azure Functions. Segundo, Kotlin é uma linguagem moderna com custo zero de abstrações, lambdas e corrotinas. Terceiro, sua sintaxe permite escrever código conciso e fácil de manter.
\nPrincipais vantagens das funções serverless em Kotlin:
\n- \n
- Economia — pague apenas pela execução real do código. \n
- Escalabilidade — a nuvem decide quantas instâncias iniciar. \n
- Simplicidade — não precisa configurar servidores. \n
- Início rápido — deploy com um único comando. \n
Mas há ressalvas: a "partida a frio" (cold start) pode levar alguns segundos, especialmente para linguagens JVM. No entanto, provedores modernos aprenderam a lidar com isso: AWS Lambda com Provisioned Concurrency ou Google Cloud Functions com min-instances resolvem o problema.
\n\nAWS Lambda: o rei da computação serverless
\nVamos começar com o serviço mais popular — AWS Lambda. A Amazon Web Services oferece um ecossistema maduro onde Kotlin funciona "de fábrica" através do Java Runtime.
\nComo configurar o AWS Lambda para Kotlin
\nVocê precisará do Gradle ou Maven. Usaremos Gradle com o plugin Kotlin. Exemplo de build.gradle.kts:
plugins {\n kotlin("jvm") version "1.9.0"\n id("com.github.johnrengelman.shadow") version "7.1.2"\n}\n\ndependencies {\n implementation("com.amazonaws:aws-lambda-java-core:1.2.2")\n implementation("com.amazonaws:aws-lambda-java-events:3.11.0")\n}\n\ntasks {\n shadowJar {\n archiveBaseName.set("lambda-function")\n archiveClassifier.set("")\n }\n}\nAgora vamos escrever a função em si. O AWS Lambda espera uma classe com o método handleRequest. Aqui está um manipulador simples que retorna uma saudação:
import com.amazonaws.services.lambda.runtime.Context\nimport com.amazonaws.services.lambda.runtime.RequestHandler\n\nclass HelloHandler : RequestHandler<Map<String, String>, String> {\n override fun handleRequest(input: Map<String, String>, context: Context): String {\n val name = input["name"] ?: "World"\n return "Olá, $name! Sua função serverless em Kotlin está funcionando!"\n }\n}\nCompile o fat JAR: ./gradlew shadowJar. Faça upload no AWS Lambda, defina o runtime Java 11 ou Java 17. Pronto!
Trabalhando com eventos AWS
\nFrequentemente, o Lambda reage a eventos do S3, DynamoDB ou API Gateway. Exemplo de manipulador para S3:
\nimport com.amazonaws.services.lambda.runtime.events.S3Event\n\nclass S3Handler : RequestHandler<S3Event, String> {\n override fun handleRequest(event: S3Event, context: Context): String {\n val bucket = event.records.f