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

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

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

ابدأ الدورة

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

\n

أصبحت بنية Serverless المعيار لإنشاء تطبيقات قابلة للتوسع واقتصادية. AWS Lambda هي إحدى الشركات الرائدة في هذا المجال، وGo (Golang) هي اللغة المثالية لكتابة دوال Serverless بفضل أدائها، وسرعة تشغيلها، وصغر حجم الملف الثنائي. في هذه المقالة، سنستعرض دورة العمل الكاملة: من إنشاء دالة بسيطة إلى النشر والمراقبة.

\n

لماذا Go؟ على عكس Node.js أو Python، يتم تجميع Go إلى ملف ثنائي أصلي، مما يقلل من وقت البدء البارد (cold start) إلى عشرات المللي ثانية. هذا أمر بالغ الأهمية لأنظمة الحمل العالي (high-load).

\n\n

الجزء الرئيسي

\n\n

1. إنشاء وهيكلة دالة Lambda بلغة Go

\n

أي دالة Lambda بلغة Go تبدأ باستيراد الحزمة github.com/aws/aws-lambda-go/lambda. لنلقِ نظرة على مثال بسيط:

\n\n
package main\n\nimport (\n    "github.com/aws/aws-lambda-go/lambda"\n)\n\ntype MyEvent struct {\n    Name string `json:"name"`\n}\n\ntype MyResponse struct {\n    Message string `json:"message"`\n}\n\nfunc HandleRequest(event MyEvent) (MyResponse, error) {\n    return MyResponse{Message: "مرحبًا، " + event.Name + "!"}, nil\n}\n\nfunc main() {\n    lambda.Start(HandleRequest)\n}
\n\n

النقاط الرئيسية:

\n
    \n
  • Handler — هي الدالة التي تستدعيها AWS Lambda. يمكنها استقبال وإرجاع أي أنواع بيانات (هياكل، سلاسل، واجهات).
  • \n
  • السياق (Context) — وسيط أول اختياري: func HandleRequest(ctx context.Context, event MyEvent) (MyResponse, error). يسمح بإلغاء التنفيذ عند انتهاء المهلة.
  • \n
  • الخطأ (error) يُشير إلى Lambda بفشل التنفيذ.
  • \n
\n\n

2. معالجة الأحداث من خدمات AWS المختلفة

\n

غالبًا ما تُستخدم Lambda كمشغل لأحداث S3، DynamoDB، SQS وAPI Gateway. تدعم Go جميع أنواع الأحداث من خلال الحزمة github.com/aws/aws-lambda-go/events.

\n\n

مثال لـ API Gateway (طلب HTTP):

\n
package main\n\nimport (\n    "github.com/aws/aws-lambda-go/lambda"\n    "github.com/aws/aws-lambda-go/events"\n)\n\nfunc handler(request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {\n    return events.APIGatewayProxyResponse{\n        Body:       "Hello, World!",\n        StatusCode: 200,\n        Headers:    map[string]string{"Content-Type": "text/plain"},\n    }, nil\n}\n\nfunc main() {\n    lambda.Start(handler)\n}
\n\n

مثال لـ S3 (كائن جديد في الحاوية):

\n
package main\n\nimport (\n    "context"\n    "fmt"\n    "github.com/aws/aws-lambda-go/lambda"\n    "github.com/aws/aws-lambda-go/events"\n)\n\nfunc handler(ctx context.Context, s3Event events.S3Event) error {\n    for _, record := range s3Event.Records {\n        bucket := record.S3.Bucket.Name\n        key := record.S3.Object.Key\n        fmt.Printf("ملف جديد: %s في الحاوية %s\\n", key, bucket)\n    }\n    return nil\n}\n\nfunc main() {\n    lambda.Start(handler)\n}
\n
    \n
  • استخدم events.S3Event، events.SNSEvent، events.DynamoDBEvent وغيرها.
  • \n
  • للأحداث المخصصة (مثل من CloudWatch)، استخدم json.Unmarshal.
  • \n
\n\n

3. التجميع، النشر وأفضل الممارسات

\n

يتم تجميع Go لنظام Linux (معمارية x86_64 أو arm64). قم ببناء الملف الثنائي لـ Lambda:

\n
# لـ x86_64\nGOOS=linux GOARCH=amd64 go build -o bootstrap main.go\n\n# لـ ARM (Graviton) — أرخص وأسرع\nGOOS=linux GOARCH=arm64 go build -o bootstrap main.go
\n\n

ثم قم بضغطه في ملف ZIP وتحميله عبر AWS CLI أو وحدة التحكم:

\n
zip function.zip bootstrap\naws lambda create-function \\\n    --function-name my-go-function \\\n    --runtime provided.al2023 \\\n    --role arn:aws:iam::XXXXXXXXXXX                

المدونات

توصيات الكتب