Introducción a las funciones Serverless en Swift con AWS Lambda
\n\nLa arquitectura Serverless sigue ganando popularidad entre los desarrolladores, y ahora Swift no es una excepción. Gracias al soporte de Swift en la plataforma AWS Lambda, los desarrolladores de iOS y macOS pueden escribir funciones en la nube en su lenguaje nativo, utilizando todo el poder del ecosistema Swift. En este artículo, analizaremos cómo crear, configurar y desplegar una función serverless en Swift desde cero.
\n\nLas funciones Serverless permiten ejecutar código sin gestionar servidores. Solo pagas por el tiempo de ejecución, y la escalabilidad ocurre automáticamente. AWS Lambda soporta Swift a través de imágenes runtime oficiales, lo que lo convierte en una excelente opción para tareas backend en el ecosistema Apple.
\n\nPreparación del entorno para el desarrollo de Swift en AWS Lambda
\n\nInstalación de las herramientas necesarias
\n\nAntes de comenzar, asegúrate de tener instalado:
\n\n- \n
- Swift 5.9+ — se puede descargar desde swift.org \n
- Docker — para compilar en un entorno Linux \n
- AWS CLI — para el despliegue \n
- Xcode 15+ (opcional, para macOS) \n
Creación del proyecto Swift Package
\n\nCreemos un nuevo Swift Package con soporte para AWS Lambda:
\n\nmkdir MyLambdaFunction\ncd MyLambdaFunction\nswift package init --type executable\n\nAbre Package.swift y agrega la dependencia de AWSLambdaRuntime:
// swift-tools-version: 5.9\nimport PackageDescription\n\nlet package = Package(\n name: "MyLambdaFunction",\n platforms: [.macOS(.v13)],\n dependencies: [\n .package(url: "https://github.com/swift-server/swift-aws-lambda-runtime.git", from: "1.0.0")\n ],\n targets: [\n .executableTarget(\n name: "MyLambdaFunction",\n dependencies: [\n .product(name: "AWSLambdaRuntime", package: "swift-aws-lambda-runtime")\n ]\n )\n ]\n)\n\nEscritura de la primera función Serverless en Swift
\n\nEstructura básica de una función Lambda
\n\nCreemos el archivo Sources/MyLambdaFunction/main.swift con el siguiente contenido:
import AWSLambdaRuntime\nimport AWSLambdaEvents\n\n// Definimos la estructura de la solicitud\nstruct GreetingRequest: Codable {\n let name: String\n}\n\n// Definimos la estructura de la respuesta\nstruct GreetingResponse: Codable {\n let message: String\n let timestamp: String\n}\n\n// Manejador principal\n@main\nstruct MyLambdaHandler: SimpleLambdaHandler {\n typealias Event = GreetingRequest\n typealias Output = GreetingResponse\n \n func handle(_ event: GreetingRequest, context: LambdaContext) async throws -> GreetingResponse {\n let dateFormatter = DateFormatter()\n dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"\n \n return GreetingResponse(\n message: "¡Hola, \\(event.name)! Bienvenido al mundo Serverless en Swift.",\n timestamp: dateFormatter.string(from: Date())\n )\n }\n}\n\nManejo de solicitudes HTTP (API Gateway)
\n\nPara trabajar con API Gateway usamos APIGatewayV2Request:
import AWSLambdaRuntime\nimport AWSLambdaEvents\n\n@main\nstruct HTTPHandler: SimpleLambdaHandler {\n typealias Event = APIGatewayV2Request\n typealias Output = APIGatewayV2Response\n \n func handle(_ event: APIGatewayV2Request, context: LambdaContext) async throws -> APIGatewayV2Response {\n // Obtenemos datos de los parámetros query\n let name = event.queryStringParameters?["name"] ?? "Invitado"\n \n let responseBody = """\n {\n "message": "Hello, \\(name)!",\n "path": "\\(event.rawPath)"\n }\n """\n \n return APIGatewayV2Response(\n statusCode: .ok,\n