Swift पर सर्वरलेस फ़ंक्शन: AWS Lambda उन्नत स्तर
\n\nSwift पर सर्वरलेस एप्लिकेशन विकसित करना तेजी से लोकप्रिय हो रहा है। इस मार्गदर्शिका में हम AWS Lambda के साथ उन्नत तकनीकों पर विचार करेंगे: एसिंक्रोनस हैंडलर, VPC के साथ एकीकरण, कस्टम लेयर्स (Layers) बनाना और मॉनिटरिंग सेटअप। यह सामग्री उन डेवलपर्स के लिए है जो Swift और AWS Lambda की मूल बातों से पहले से परिचित हैं।
\n\n1. एसिंक्रोनस हैंडलर (async/await)
\n\nआधुनिक Swift async/await के माध्यम से एसिंक्रोनसिटी का समर्थन करता है। AWS Lambda SDK इस मॉडल का उपयोग करने की अनुमति देता है, जो इनपुट-आउटपुट और बाहरी सेवाओं के साथ काम को काफी सरल बनाता है।
बुनियादी एसिंक्रोनस हैंडलर:
\n\nimport 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 // एसिंक्रोनस अनुरोध का अनुकरण\n try? await Task.sleep(nanoseconds: 100_000_000)\n return "{\\"status\\": \\"ok\\", \\"data\\": \\"\\(url)\\"}"\n }\n}\n\nसमानांतर प्रसंस्करण:
\n\nfunc 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प्राथमिकताओं और संचालन को रद्द करने के सटीक नियंत्रण के लिए Task का उपयोग करें। धीमे बाहरी API के साथ काम करते समय यह महत्वपूर्ण है।
2. VPC के साथ एकीकरण और सुरक्षा
\n\nSwift पर Lambda फ़ंक्शन निजी संसाधनों (RDS, ElastiCache) तक पहुंच के लिए VPC के अंदर काम कर सकते हैं। हालांकि, ENI बनाने के कारण यह कोल्ड स्टार्ट को 5-10 सेकंड तक बढ़ा देता है।
\n\nVPC की उन्नत कॉन्फ़िगरेशन:
\n\n- \n
- सबनेट को न्यूनतम करना: विभिन्न उपलब्धता क्षेत्रों में केवल 2-3 सबनेट का उपयोग करें। \n
- NAT Gateway: यदि इंटरनेट तक पहुंच आवश्यक है, तो सार्वजनिक सबनेट में NAT Gateway सेटअप करना सुनिश्चित करें। \n
- VPC Endpoints: AWS सेवाओं (S3, DynamoDB, SQS) के लिए NAT के बजाय VPC Endpoints का उपयोग करें। \n
- Security Groups: न्यूनतम आवश्यक नियम सेट करें (केवल विशिष्ट पोर्ट के लिए inbound/outbound)। \n
VPC के माध्यम से RDS से कनेक्शन का उदाहरण:
\n\nimport 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