Funciones Serverless en Kotlin: AWS Lambda de la A a la Z

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción a las funciones serverless en Kotlin y AWS Lambda



La arquitectura serverless se ha convertido en un estándar para crear aplicaciones escalables y rentables. AWS Lambda es uno de los servicios más populares para ejecutar código sin gestionar servidores. Sin embargo, la mayoría de los ejemplos y la documentación están orientados a Java o Python. Kotlin, al ser un lenguaje moderno para la JVM, ofrece una sintaxis concisa y total compatibilidad con el ecosistema Java, lo que lo convierte en una excelente opción para funciones Lambda.



En este artículo, analizaremos el ciclo completo: desde la configuración del proyecto hasta el despliegue y la monitorización. Aprenderá a escribir funciones serverless eficientes en Kotlin, procesar eventos de API Gateway, S3 y DynamoDB, y optimizar el arranque en frío.



1. Configuración del proyecto y dependencias



Para empezar, crearemos un proyecto Gradle con soporte para Kotlin. La dependencia principal es com.amazonaws:aws-lambda-java-core, que proporciona las interfaces para los handlers.



Paso 1.1: Estructura de build.gradle.kts



plugins {    kotlin("jvm") version "1.9.22"    id("io.github.microutils:kotlin-logging") version "3.0.5"}

dependencies { implementation("com.amazonaws:aws-lambda-java-core:1.2.2") implementation("com.amazonaws:aws-lambda-java-events:3.11.3") implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.15.3") implementation("org.slf4j:slf4j-simple:2.0.9")}

tasks.register<Zip>("buildLambda") { from(sourceSets.main.get().output) from(configurations.runtimeClasspath.get().map { if (it.isDirectory) it else zipTree(it) }) into("build/libs") archiveFileName.set("lambda.zip")}


Observe la tarea buildLambda: crea un JAR "gordo" (fat jar) que AWS Lambda podrá ejecutar. Sin este paso, el despliegue no funcionará.



Paso 1.2: Función handler básica



Creemos un archivo Handler.kt con una función simple que recibe un Map<String, String> y devuelve una cadena:



import com.amazonaws.services.lambda.runtime.Contextimport 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" context.logger.log("Processing request for $name") return "Hello, $name!" }}


La interfaz RequestHandler está parametrizada con dos tipos: el tipo de datos de entrada y el tipo de valor de retorno. Kotlin permite usar Map, String, así como cualquier data class.



2. Trabajo con eventos de AWS (API Gateway, S3, DynamoDB)



Las funciones serverless rara vez funcionan de forma aislada. La mayoría de las veces reaccionan a eventos de otros servicios de AWS. Veamos tres escenarios populares.



2.1 Procesamiento de solicitudes HTTP a través de API Gateway



Para la integración con API Gateway, use la clase APIGatewayProxyRequestEvent de aws-lambda-java-events:



import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEventimport com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEventimport com.amazonaws.services.lambda.runtime.Contextimport com.amazonaws.services.lambda.runtime.RequestHandler

class ApiHandler : RequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> { override fun handleRequest(input: APIGatewayProxyRequestEvent, context: Context): APIGatewayProxyResponseEvent { val body = "Received: ${input.body}" return APIGatewayProxyResponseEvent() .withStatusCode(200) .withBody(body) .withHeaders(mapOf("Content-Type" to "text/plain")) }}


En este ejemplo, extraemos el cuerpo de la solicitud y devolvemos una respuesta HTTP.

Blogs

Book Recommendations