مقدمة: لماذا يعتبر Serverless و C# ثنائيًا مثاليًا
\nبنية Serverless (أو الحوسبة بدون خادم) هي نموذج تقوم فيه بكتابة الكود دون القلق بشأن إدارة الخوادم. AWS Lambda هي واحدة من أشهر الخدمات لتشغيل هذا النوع من الكود. وبالاقتران مع C# (.NET)، تحصل على أداة قوية وآمنة من حيث الأنواع وعالية الأداء لإنشاء الخدمات المصغرة ومعالجات API والمهام الخلفية.
\nفي هذه المقالة، سنستعرض المسار بأكمله: من إعداد البيئة إلى النشر والمراقبة لأول دالة بلغة C# في AWS Lambda. المحتوى مناسب لكل من المبتدئين والمطورين ذوي الخبرة الذين يرغبون في تنظيم معرفتهم.
\n\n1. إعداد البيئة وإنشاء المشروع
\n1.1 تثبيت الأدوات
\nللعمل مع C# و AWS Lambda، ستحتاج إلى:
\n- \n
- .NET SDK (8.0 أو 6.0) — قم بتنزيله من dotnet.microsoft.com; \n
- AWS CLI — لإدارة الموارد من خلال الطرفية; \n
- Amazon.Lambda.Tools — أداة .NET عالمية للنشر. \n
قم بتثبيت Lambda Tools بأمر واحد:
\ndotnet tool install -g Amazon.Lambda.Tools\n\n1.2 إنشاء قالب الدالة
\nاستخدم القالب المدمج للبدء السريع:
\ndotnet new lambda.EmptyFunction --name MyFirstLambda --profile default --region us-east-1\nسينشئ هذا الأمر مشروعًا بملف Function.cs وملف aws-lambda-tools-defaults.json لإعدادات النشر.
2. كتابة كود دالة Serverless بلغة C#
\n2.1 الهيكل الأساسي لدالة Lambda
\nكل دالة Lambda هي طريقة تستقبل كائن الحدث وسياق التنفيذ. لنلقِ نظرة على أبسط مثال:
\nusing Amazon.Lambda.Core;\nusing Amazon.Lambda.SQSEvents;\n\n[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]\n\npublic class Function\n{\n public async Task<string> FunctionHandler(SQSEvent evnt, ILambdaContext context)\n {\n context.Logger.LogInformation("تم استلام رسائل: " + evnt.Records.Count);\n \n foreach (var record in evnt.Records)\n {\n await ProcessMessageAsync(record.Body, context);\n }\n \n return "تمت معالجة " + evnt.Records.Count + " رسالة";\n }\n\n private async Task ProcessMessageAsync(string messageBody, ILambdaContext context)\n {\n context.Logger.LogInformation("جارٍ المعالجة: " + messageBody);\n await Task.Delay(100); // محاكاة العمل\n }\n}\nلاحظ السمة LambdaSerializer — فهي تحدد كيفية تسلسل/إلغاء تسلسل JSON. بالنسبة لـ C#، يُوصى باستخدام SystemTextJson.
2.2 العمل مع المشغلات المختلفة
\nيدعم AWS Lambda العديد من مصادر الأحداث. إليك مثال لطلب HTTP عبر API Gateway:
\npublic async Task<APIGatewayProxyResponse> FunctionHandler(APIGatewayProxyRequest request, ILambdaContext context)\n{\n var name = request.QueryStringParameters?.ContainsKey("name") == true \n ? request.QueryStringParameters["name"] \n : "العالم";\n \n var responseBody = $"مرحبًا، {name}!";\n \n return new APIGatewayProxyResponse\n {\n StatusCode = 200,\n Body = responseBody,\n Headers = new Dictionary<string, string> { { "Content-Type", "text/plain" } }\n };\n}\nللعمل مع HTTP، ستحتاج إلى تثبيت الحزمة Amazon.Lambda.APIGatewayEvents.
3. النشر واختبار الدالة
\n3.1 الاختبار المحلي
\nقبل النشر، تحقق من الكود محليًا باستخدام dotnet lambda invoke:
dotnet lambda invoke --payload "{\\"Records\