دوال Serverless بلغة Kotlin: AWS Lambda – دليل شامل

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

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

ابدأ الدورة

مقدمة عن الحوسبة بدون خادم باستخدام Kotlin

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

في هذه المقالة، سنتناول بالتفصيل كيفية إنشاء واختبار ونشر دوال بدون خادم باستخدام Kotlin لـ AWS Lambda. ستتعلم كيفية إعداد مشروع، ومعالجة الأحداث من API Gateway و S3 و DynamoDB، بالإضافة إلى تحسين الأداء.



إعداد مشروع Kotlin لـ AWS Lambda

للبدء، نحتاج إلى مشروع Gradle بالاعتماديات الصحيحة. الميزة الرئيسية لـ Kotlin هي القدرة على استخدام جميع مكتبات Java، بما في ذلك AWS SDK الرسمي.

إنشاء مشروع Gradle

قم بإنشاء ملف build.gradle.kts بالإعدادات التالية:

plugins {    kotlin("jvm") version "1.9.22"    id("io.github.deweyjose.lambda-packager") version "0.1.2"}

dependencies { implementation("com.amazonaws:aws-lambda-java-core:1.2.3") implementation("com.amazonaws:aws-lambda-java-events:3.11.4") implementation("com.google.code.gson:gson:2.10.1")

testImplementation("org.junit.jupiter:junit-jupiter:5.10.2") testImplementation("org.mockito:mockito-core:5.11.0")}

tasks.withType<Jar> { duplicatesStrategy = DuplicatesStrategy.EXCLUDE from(configurations.runtimeClasspath.get().map { if (it.isDirectory) it else zipTree(it) })}

هيكل دالة المعالجة (Handler)

يجب أن تقوم أي دالة Lambda في Kotlin بتنفيذ واجهة RequestHandler أو RequestStreamHandler. دعنا نلقي نظرة على مثال بسيط لـ HelloHandler:

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" return "Hello, $name! Greetings from Kotlin Lambda!" }}

ملاحظة: تسمح Kotlin باستخدام Map<String, String> للعمل مع أحداث JSON، ولكن بالنسبة للهياكل المعقدة، من الأفضل إنشاء Data Class.



العمل مع مشغلات AWS المختلفة

نادرًا ما تعمل الدوال بدون خادم بشكل منفرد. دعنا نلقي نظرة على ثلاثة سيناريوهات شائعة: API Gateway و S3 و DynamoDB.

API Gateway + Lambda على Kotlin

لمعالجة طلبات HTTP، استخدم الفئة APIGatewayProxyRequestEvent:

import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEventimport com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent

class ApiHandler : RequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> { override fun handleRequest(event: APIGatewayProxyRequestEvent, context: Context): APIGatewayProxyResponseEvent { val body = """ {"message": "Received ${event.httpMethod} request to ${event.path}", "queryParams": "${event.queryStringParameters}"} """.trimIndent()

return APIGatewayProxyResponseEvent() .withStatusCode(200) .withHeaders(mapOf("Content-Type" to "application/json")) .withBody(body) }}

معالجة أحداث S3

عند رفع كائن جديد إلى حاوية S3، يمكن لـ Lambda التشغيل تلقائيًا:

import com.amazonaws.services.lambda.runtime.events.S3Eventimport com.amazonaws.services.s3.AmazonS3ClientBuilder

class S3ProcessorHandler : RequestHandler<S3Event, String>

المدونات

توصيات الكتب