Serverless en Kotlin: AWS Lambda y análogos — escribimos código sin servidor que funciona
\nHubo un tiempo en que escribir un backend era sinónimo de configurar servidores, ajustar Nginx y pasar noches en vela monitoreando la carga. Hoy todo es diferente. Serverless no es ciencia ficción, sino una realidad que te permite olvidarte del hardware y concentrarte en la lógica de la aplicación. Y si escribes en Kotlin, obtienes un código elegante, seguro y rápido que encaja perfectamente en la arquitectura sin servidor.
\nEn este artículo, analizaremos cómo crear funciones serverless en Kotlin, qué proveedores de nube ofrecen las mejores condiciones y cómo no ahogarse en los detalles de configuración. ¡Vamos allá!
\n\n¿Qué es serverless y por qué Kotlin es la elección ideal?
\nServerless (o computación sin servidor) es un modelo de computación en la nube donde tú escribes el código y el proveedor se encarga de la infraestructura. No pagas por un servidor inactivo, solo por el tiempo de ejecución de la función. ¿Suena como un sueño? Para Kotlin es especialmente relevante.
\n¿Por qué Kotlin? En primer lugar, se compila a bytecode de JVM, lo que brinda soporte nativo en AWS Lambda, Google Cloud Functions y Azure Functions. En segundo lugar, Kotlin es un lenguaje moderno con abstracciones de costo cero, lambdas y corrutinas. En tercer lugar, su sintaxis permite escribir código conciso y fácil de mantener.
\nPrincipales ventajas de las funciones serverless en Kotlin:
\n- \n
- Ahorro — pagas solo por la ejecución real del código. \n
- Escalabilidad — la nube decide por sí misma cuántas instancias ejecutar. \n
- Simplicidad — no es necesario configurar un servidor. \n
- Inicio rápido — despliegue con un solo comando. \n
Pero también hay matices: el "arranque en frío" (cold start) puede tardar hasta varios segundos, especialmente para lenguajes JVM. Sin embargo, los proveedores modernos han aprendido a combatirlo: AWS Lambda con Provisioned Concurrency o Google Cloud Functions con min-instances resuelven el problema.
\n\nAWS Lambda: el rey de la computación sin servidor
\nEmpecemos con el servicio más popular: AWS Lambda. Amazon Web Services ofrece un ecosistema maduro donde Kotlin funciona "de fábrica" a través de Java Runtime.
\nCómo configurar AWS Lambda para Kotlin
\nNecesitarás Gradle o Maven. Usamos Gradle con el plugin de Kotlin. Ejemplo 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}\nAhora escribamos la función en sí. AWS Lambda espera una clase con el método handleRequest. Aquí tienes un manejador simple que devuelve un saludo:
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 "¡Hola, $name! ¡Tu función serverless en Kotlin funciona!"\n }\n}\nCompilamos el fat JAR: ./gradlew shadowJar. Lo subimos a AWS Lambda, indicamos runtime Java 11 o Java 17. ¡Listo!
Trabajando con eventos de AWS
\nA menudo Lambda reacciona a eventos de S3, DynamoDB o API Gateway. Ejemplo de manejador 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