Einführung in Serverless-Funktionen mit Swift und AWS Lambda
\n\nDie Serverless-Architektur gewinnt bei Entwicklern weiter an Beliebtheit, und Swift ist jetzt keine Ausnahme. Dank der Unterstützung von Swift auf der AWS Lambda-Plattform können iOS- und macOS-Entwickler Cloud-Funktionen in ihrer Muttersprache schreiben und dabei die volle Leistungsfähigkeit des Swift-Ökosystems nutzen. In diesem Artikel werden wir uns ansehen, wie man eine Serverless-Funktion mit Swift von Grund auf erstellt, konfiguriert und bereitstellt.
\n\nServerless-Funktionen ermöglichen die Ausführung von Code ohne Serververwaltung. Sie zahlen nur für die Ausführungszeit, und die Skalierung erfolgt automatisch. AWS Lambda unterstützt Swift über offizielle Runtime-Images, was es zu einer hervorragenden Wahl für Backend-Aufgaben im Apple-Ökosystem macht.
\n\nVorbereitung der Entwicklungsumgebung für Swift auf AWS Lambda
\n\nInstallation der erforderlichen Werkzeuge
\n\nStellen Sie vor Beginn der Arbeit sicher, dass Sie Folgendes installiert haben:
\n\n- \n
- Swift 5.9+ — herunterladbar von swift.org \n
- Docker — zum Bauen in einer Linux-Umgebung \n
- AWS CLI — für das Deployment \n
- Xcode 15+ (optional, für macOS) \n
Erstellen eines Swift Package-Projekts
\n\nErstellen wir ein neues Swift Package mit Unterstützung für AWS Lambda:
\n\nmkdir MyLambdaFunction\ncd MyLambdaFunction\nswift package init --type executable\n\nÖffnen Sie Package.swift und fügen Sie die Abhängigkeit zu AWSLambdaRuntime hinzu:
// 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\nSchreiben der ersten Serverless-Funktion mit Swift
\n\nGrundlegende Struktur einer Lambda-Funktion
\n\nErstellen wir die Datei Sources/MyLambdaFunction/main.swift mit folgendem Inhalt:
import AWSLambdaRuntime\nimport AWSLambdaEvents\n\n// Definieren der Anfragestruktur\nstruct GreetingRequest: Codable {\n let name: String\n}\n\n// Definieren der Antwortstruktur\nstruct GreetingResponse: Codable {\n let message: String\n let timestamp: String\n}\n\n// Haupt-Handler\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: "Hallo, \\(event.name)! Willkommen in der Welt von Serverless mit Swift.",\n timestamp: dateFormatter.string(from: Date())\n )\n }\n}\n\nVerarbeitung von HTTP-Anfragen (API Gateway)
\n\nFür die Arbeit mit API Gateway verwenden wir 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 // Daten aus Query-Parametern abrufen\n let name = event.queryStringParameters?["name"] ?? "Gast"\n \n let responseBody = """\n {\n "message": "Hello, \\(name)!",\n "path": "\\(event.rawPath)"\n }\n """\n \n return APIGatewayV2Response(\n statusCode: .ok,\n