Introducción a la computación serverless en Kotlin
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 que permite ejecutar código sin gestionar servidores. Aunque Lambda se asocia más frecuentemente con Node.js o Python, el lenguaje Kotlin, gracias a su concisión, seguridad de tipos y compatibilidad total con el ecosistema Java, se convierte en una excelente opción para escribir funciones serverless.
En este artículo, analizaremos en detalle cómo crear, probar e implementar funciones serverless en Kotlin para AWS Lambda. Aprenderá a configurar el proyecto, manejar eventos de API Gateway, S3 y DynamoDB, así como optimizar el rendimiento.
Configuración del proyecto Kotlin para AWS Lambda
Para comenzar, necesitamos un proyecto Gradle con las dependencias correctas. La principal ventaja de Kotlin es la posibilidad de utilizar todas las bibliotecas de Java, incluido el AWS SDK oficial.
Creación del proyecto Gradle
Cree el archivo build.gradle.kts con la siguiente configuración:
plugins { kotlin("jvm") version "1.9.22" id("io.github.deweyjose.lambda-packager") version "0.1.2"}
dependencies { implementation("com.amazonaws:aws-lambda-java-core:1.2.3") implementation("com.amazonaws:aws-lambda-java-events:3.11.4") implementation("com.google.code.gson:gson:2.10.1")
testImplementation("org.junit.jupiter:junit-jupiter:5.10.2") testImplementation("org.mockito:mockito-core:5.11.0")}
tasks.withType<Jar> { duplicatesStrategy = DuplicatesStrategy.EXCLUDE from(configurations.runtimeClasspath.get().map { if (it.isDirectory) it else zipTree(it) })}Estructura de la función handler
Cualquier función Lambda en Kotlin debe implementar la interfaz RequestHandler o RequestStreamHandler. Veamos un ejemplo simple de HelloHandler:
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" return "Hello, $name! ¡Saludos desde Kotlin Lambda!" }}Tenga en cuenta: Kotlin permite usar Map<String, String> para trabajar con eventos JSON, pero para estructuras complejas es mejor crear un Data Class.
Trabajo con diferentes disparadores de AWS
Las funciones Serverless rara vez funcionan de forma aislada. Veamos tres escenarios populares: API Gateway, S3 y DynamoDB.
API Gateway + Lambda en Kotlin
Para procesar solicitudes HTTP, usamos la clase APIGatewayProxyRequestEvent:
import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEventimport com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent
class ApiHandler : RequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> { override fun handleRequest(event: APIGatewayProxyRequestEvent, context: Context): APIGatewayProxyResponseEvent { val body = """ {"message": "Recibida solicitud ${event.httpMethod} a ${event.path}", "queryParams": "${event.queryStringParameters}"} """.trimIndent()
return APIGatewayProxyResponseEvent() .withStatusCode(200) .withHeaders(mapOf("Content-Type" to "application/json")) .withBody(body) }}Procesamiento de eventos S3
Cuando se carga un nuevo objeto en un bucket S3, Lambda puede ejecutarse automáticamente:
import com.amazonaws.services.lambda.runtime.events.S3Eventimport com.amazonaws.services.s3.AmazonS3ClientBuilder
class S3ProcessorHandler : RequestHandler<S3Event, String>