Serverless-Funktionen in Swift: AWS Lambda auf fortgeschrittenem Niveau

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Serverless-Funktionen in Swift: AWS Lambda auf fortgeschrittenem Niveau

\n\n

Die Entwicklung von Serverless-Anwendungen in Swift wird zunehmend nachgefragt. In diesem Handbuch betrachten wir fortgeschrittene Techniken für die Arbeit mit AWS Lambda: asynchrone Handler, Integration mit VPC, Erstellung benutzerdefinierter Layer und Einrichtung von Monitoring. Das Material richtet sich an Entwickler, die bereits mit den Grundlagen von Swift und AWS Lambda vertraut sind.

\n\n

1. Asynchrone Handler (async/await)

\n\n

Modernes Swift unterstützt Asynchronität durch async/await. Das AWS Lambda SDK ermöglicht die Verwendung dieses Modells, was die Arbeit mit Ein-/Ausgabe und externen Diensten erheblich vereinfacht.

\n\n

Basierender asynchroner Handler:

\n\n
import AWSLambdaRuntime\nimport AWSLambdaEvents\n\nstruct AsyncHandler: LambdaHandler {\n    typealias Event = APIGatewayV2Request\n    typealias Output = APIGatewayV2Response\n\n    func handle(_ event: APIGatewayV2Request, context: LambdaContext) async throws -> APIGatewayV2Response {\n        let result = await fetchData(from: "https://api.example.com/data")\n        return APIGatewayV2Response(statusCode: .ok, body: result)\n    }\n\n    private func fetchData(from url: String) async -> String {\n        // Simulation einer asynchronen Anfrage\n        try? await Task.sleep(nanoseconds: 100_000_000)\n        return "{\\"status\\": \\"ok\\", \\"data\\": \\"\\(url)\\"}"\n    }\n}
\n\n

Parallele Verarbeitung:

\n\n
func handle(_ event: APIGatewayV2Request, context: LambdaContext) async throws -> APIGatewayV2Response {\n    async let user = fetchUser(id: event.queryParameters?["userId"] ?? "")\n    async let orders = fetchOrders(userId: event.queryParameters?["userId"] ?? "")\n\n    let (userData, ordersData) = try await (user, orders)\n    let combined = """\n    {\n        "user": \\(userData),\n        "orders": \\(ordersData)\n    }\n    """\n    return APIGatewayV2Response(statusCode: .ok, body: combined)\n}
\n\n

Verwenden Sie Task für eine feine Kontrolle von Prioritäten und zum Abbrechen von Operationen. Dies ist entscheidend bei der Arbeit mit langsamen externen APIs.

\n\n

2. Integration mit VPC und Sicherheit

\n\n

Lambda-Funktionen in Swift können innerhalb einer VPC arbeiten, um auf private Ressourcen (RDS, ElastiCache) zuzugreifen. Dies erhöht jedoch den Kaltstart um 5-10 Sekunden aufgrund der Erstellung von ENIs.

\n\n

Fortgeschrittene VPC-Konfiguration:

\n\n
    \n
  • Minimierung der Subnetze: Verwenden Sie nur 2-3 Subnetze in verschiedenen Verfügbarkeitszonen.
  • \n
  • NAT Gateway: Wenn Internetzugriff benötigt wird, konfigurieren Sie unbedingt ein NAT Gateway im öffentlichen Subnetz.
  • \n
  • VPC Endpoints: Für AWS-Dienste (S3, DynamoDB, SQS) verwenden Sie VPC Endpoints anstelle von NAT.
  • \n
  • Security Groups: Konfigurieren Sie minimal notwendige Regeln (nur inbound/outbound für bestimmte Ports).
  • \n
\n\n

Beispiel für eine Verbindung zu RDS über VPC:

\n\n
import Vapor\nimport MySQLNIO\n\nstruct DatabaseHandler: LambdaHandler {\n    typealias Event = APIGatewayV2Request\n    typealias Output = APIGatewayV2Response\n\n    private let db: MySQLConnection\n\n    init(context: LambdaInitializationContext) async throws {\n        let eventLoop = context.eventLoop\n        self.db = try await MySQLConnection.connect(\n            to: .init(hostname: "private-rds-endpoint", port: 3306),\n            username: "admin",\n            password: "secret",\n            database: "mydb",\n            on: eventLoop\n        ).get()\n    }\n\n    func handle(_ event: APIGatewayV2Request, context: LambdaContext) async throws -> APIGatewayV2Response {\n        let rows = try await db.simpleQuery("SELECT * FROM users LIMIT 10")\n        let jsonData = try JSONEncoder().encode(rows)\n        return APIGatewayV2Response(statusCode: .ok, body: String(data: jsonData, encoding: .utf8) ?? "[]")\n                

Blogs

Buchempfehlungen