دوال Serverless بلغة Kotlin: AWS Lambda من الألف إلى الياء

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة في دوال Serverless بلغة Kotlin و AWS Lambda



أصبحت بنية Serverless المعيار لبناء تطبيقات قابلة للتوسع واقتصادية. تُعد AWS Lambda واحدة من أشهر الخدمات لتشغيل الكود دون إدارة الخوادم. ومع ذلك، فإن معظم الأمثلة والوثائق موجهة نحو Java أو Python. تقدم Kotlin، كونها لغة حديثة لـ JVM، بناء جملة موجزًا وتوافقًا كاملاً مع نظام Java البيئي، مما يجعلها خيارًا ممتازًا لدوال Lambda.



في هذه المقالة، سنستعرض الدورة الكاملة: من إعداد المشروع إلى النشر والمراقبة. ستتعلم كيفية كتابة دوال serverless فعالة بلغة Kotlin، ومعالجة أحداث API Gateway و S3 و DynamoDB، بالإضافة إلى تحسين البداية الباردة (cold start).



1. إعداد المشروع والتبعيات



للبدء، سننشئ مشروع Gradle مع دعم Kotlin. التبعية الرئيسية هي com.amazonaws:aws-lambda-java-core، والتي توفر واجهات للمعالجات (handlers).



الخطوة 1.1: هيكل build.gradle.kts



plugins {    kotlin("jvm") version "1.9.22"    id("io.github.microutils:kotlin-logging") version "3.0.5"}

dependencies { implementation("com.amazonaws:aws-lambda-java-core:1.2.2") implementation("com.amazonaws:aws-lambda-java-events:3.11.3") implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.15.3") implementation("org.slf4j:slf4j-simple:2.0.9")}

tasks.register<Zip>("buildLambda") { from(sourceSets.main.get().output) from(configurations.runtimeClasspath.get().map { if (it.isDirectory) it else zipTree(it) }) into("build/libs") archiveFileName.set("lambda.zip")}


لاحظ مهمة buildLambda — فهي تنشئ ملف JAR "سميكًا" (fat jar) يمكن لـ AWS Lambda تنفيذه. بدون هذه الخطوة، لن يعمل النشر.



الخطوة 1.2: دالة معالج أساسية



لننشئ ملف Handler.kt بدالة بسيطة تستقبل Map<String, String> وتعيد سلسلة نصية:



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" context.logger.log("Processing request for $name") return "Hello, $name!" }}


الواجهة RequestHandler محددة بنوعين: نوع بيانات الإدخال ونوع القيمة المُعادة. تسمح Kotlin باستخدام Map و String بالإضافة إلى أي فئات بيانات (data classes).



2. العمل مع أحداث AWS (API Gateway, S3, DynamoDB)



نادرًا ما تعمل دوال Serverless بشكل منعزل. غالبًا ما تستجيب للأحداث من خدمات AWS الأخرى. دعنا نستعرض ثلاثة سيناريوهات شائعة.



2.1 معالجة طلبات HTTP عبر API Gateway



للتكامل مع API Gateway، استخدم الفئة APIGatewayProxyRequestEvent من aws-lambda-java-events:



import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEventimport com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEventimport com.amazonaws.services.lambda.runtime.Contextimport com.amazonaws.services.lambda.runtime.RequestHandler

class ApiHandler : RequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> { override fun handleRequest(input: APIGatewayProxyRequestEvent, context: Context): APIGatewayProxyResponseEvent { val body = "Received: ${input.body}" return APIGatewayProxyResponseEvent() .withStatusCode(200) .withBody(body) .withHeaders(mapOf("Content-Type" to "text/plain")) }}


في هذا المثال، نستخرج نص الطلب ونعيد استجابة HTTP

المدونات

توصيات الكتب