خالية من الخوادم على الحافة: غوص عميق في AWS Lambda@Edge

١٢ نوفمبر ٢٠٢٥

Serverless at the Edge: Deep Dive into AWS Lambda@Edge

باختصار

  • Lambda@Edge يتيح لك تشغيل وظائف خالية من الخوادم بالقرب من مستخدميك من خلال التكامل مع Amazon CloudFront.
  • يتيح لك تخصيصات ذات تأخير منخفض جدًا مثل إعادة التوجيه، وتعديل الرؤوس، والمصادقة على طبقة CDN.
  • مثالي للتخصيص، واختبار A/B، وتصفية الأمان دون إدارة البنية التحتية.
  • تدفع فقط مقابل وقت التنفيذ والطلبات — لا خوادم للتوسيع أو التصحيح.
  • ومع ذلك، يتطلب تصحيح الأخطاء، والبدء البارد، وحدود النشر الإقليمي تصميمًا دقيقًا.

ما ستتعلمه

  1. ما هي AWS Lambda@Edge وكيف توسع الحوسبة الخالية من الخوادم إلى الشبكة العالمية.
  2. كيف تختلف عن AWS Lambda القياسي.
  3. حالات استخدام واقعية شائعة وأنماط العمارة.
  4. كيفية نشر واختبار وظائف Lambda@Edge خطوة بخطوة.
  5. اعتبارات الأداء والأمان وقابلية المراقبة.
  6. متى تستخدم (ومتى لا تستخدم) Lambda@Edge.
  7. المزالق الشائعة، ونصائح تصحيح الأخطاء، وأفضل الممارسات الإنتاجية.

المتطلبات الأساسية

  • معرفة أساسية بـ AWS Lambda و CloudFront.
  • حساب AWS مع أذونات IAM لإنشاء وظائف Lambda وتوزيعات CloudFront.
  • بعض الخبرة مع JavaScript (Node.js) أو Python لكتابة وظائف Lambda.

مقدمة: ما هي AWS Lambda@Edge؟

AWS Lambda@Edge هو امتداد لـ AWS Lambda يسمح لك بتشغيل الكود في مواقع الحافة الخاصة بـ AWS — مراكز البيانات التي تغذي Amazon CloudFront، شبكة توصيل المحتوى العالمية لـ AWS1.

بدلاً من تنفيذ الكود في منطقة واحدة، ينشر Lambda@Edge وظيفتك في مواقع حافة متعددة حول العالم، ويقوم بنسخها تلقائيًا بحيث يمكنها الرد على طلبات المشاهدين بأقل تأخير.

لماذا يهم ذلك

الوظائف الخالية من الخوادم التقليدية (مثل AWS Lambda القياسي) تعمل في منطقة محددة. إذا كان مستخدموك موزعين عالميًا، يجب أن تنتقل الطلبات عبر القارات، مما يزيد التأخير. Lambda@Edge يحل هذه المشكلة عن طريق تنفيذ المنطق بالقرب من المستخدم، مما يؤدي إلى:

  • أوقات استجابة أسرع
  • تأخير أقل للتخصيص أو إعادة التوجيه
  • انخفاض الحمل على خوادم المصدر

كيف يعمل Lambda@Edge

Lambda@Edge يتكامل مباشرة مع Amazon CloudFront. تقوم بربط وظيفة بحدث توزيع CloudFront — على سبيل المثال، عند وصول طلب أو عند إرجاع استجابة.

أنواع الأحداث المدعومة

نوع الحدث التوقيت حالات الاستخدام الشائعة
طلب المشاهد قبل أن يتحقق CloudFront من الذاكرة المؤقتة المصادقة، إعادة التوجيه، حقن الرؤوس
طلب المصدر قبل إرسال الطلب إلى المصدر إعادة كتابة URLs، توجيه المصدر، تعديل الاستعلامات
استجابة المصدر بعد استجابة المصدر تحويل الاستجابة، قرارات التخزين المؤقت
استجابة المشاهد قبل إرسال الاستجابة إلى المشاهد تعديل الرؤوس، سياسة أمان المحتوى

يمنحك كل نوع حدث مستوى مختلفًا من التحكم في دورة حياة الطلب/الاستجابة.


نظرة عامة على العمارة

هنا تدفق مبسط لكيفية تكامل Lambda@Edge في دورة طلب CloudFront:

flowchart TD
A[User Request] --> B[CloudFront Edge Location]
B -->|Viewer Request Trigger| C[Lambda@Edge Function]
C -->|Optional| D[CloudFront Cache]
D -->|Cache Miss| E[Origin Request Trigger]
E --> F[Origin Server]
F -->|Response| G[Origin Response Trigger]
G --> H[Viewer Response Trigger]
H --> I[User Receives Response]

هذا الهيكل يضمن تنفيذ المنطق المخصص الخاص بك بالقرب من المستخدم قدر الإمكان.


البدء السريع: التشغيل في 5 دقائق

لننشر وظيفة بسيطة طلب المشاهد تقوم بإعادة توجيه HTTP إلى HTTPS.

الخطوة 1: إنشاء دالة لامبدا

'use strict';

exports.handler = async (event) => {
  const request = event.Records[0].cf.request;
  const headers = request.headers;

  if (headers['cloudfront-forwarded-proto'] && headers['cloudfront-forwarded-proto'][0].value === 'http') {
    const redirectResponse = {
      status: '301',
      statusDescription: 'Moved Permanently',
      headers: {
        location: [{ key: 'Location', value: `https://${request.headers.host[0].value}${request.uri}` }],
      },
    };
    return redirectResponse;
  }

  return request;
};

الخطوة 2: نشر إلى لامبدا@الحافة

  1. انتقل إلى لوحة تحكم AWS لامبدا.
  2. أنشئ دالة جديدة (Node.js 18.x بيئة تشغيل).
  3. تحت الإجراءات → نشر إلى لامبدا@الحافة، ربطها بتوزيع كلاودفرنت.
  4. اختر نوع حدث طلب المشاهد.

الخطوة 3: اختبرها

بعد النشر، سيقوم أي طلب HTTP إلى توزيع كلاودفرنت بإعادة التوجيه تلقائيًا إلى HTTPS.

مثال:

$ curl -I http://d123example.cloudfront.net
HTTP/1.1 301 Moved Permanently
Location: https://d123example.cloudfront.net/

حالات استخدام واقعية

تُستخدم لامبدا@الحافة على نطاق واسع في الإنتاج للمهام الحساسة للأداء. تشمل السيناريوهات الشائعة:

  1. اختبار A/B: تقديم صفحات مختلفة بناءً على ملفات تعريف الارتباط أو الرؤوس.
  2. تصفية الأمان: حظر عناوين IP ضارة أو فرض قيود الموقع الجغرافي.
  3. التخصيص: تعديل المحتوى ديناميكيًا بناءً على موقع المستخدم أو نوع الجهاز.
  4. تحسين محركات البحث (SEO): إعادة توجيه الروابط القديمة أو فرض هياكل قياسية.
  5. إدارة الرؤوس: إضافة رؤوس أمان مثل CSP أو HSTS أو CORS.

تستخدم الخدمات الواسعة النطاق غالبًا منطق الحافة لتقليل زمن الوصول وإخلاء العمل من المصادر الأصلية2.


متى تستخدم مقابل متى لا تستخدم لامبدا@الحافة

حالة الاستخدام مُوصى به؟ السبب
قاعدة مستخدمين عالمية مع تخصيص حساس للزمن يعمل بالقرب من المستخدمين
المصادقة أو التحكم في الوصول على طبقة CDN يقلل الحمل على المصدر
معالجة بيانات ثقيلة أو استدلال ML ذاكرة/وقت محدود
تحديثات متكررة للرمز ⚠️ تستغرق النسخ العالمي دقائق
منطق الامتثال الخاص بالمنطقة تنفيذ قيود جغرافية
جمع مقاييس عالية التردد مكلف عند النطاق الكبير

لامبدا@الحافة تتفوق في التحويلات الخفيفة على مستوى الطلب، وليس المهام الثقيلة في الحساب.


المزالق الشائعة والحلول

المزلق السبب الحل
تحديثات بطيئة تأخير النسخ العالمي تخطيط فترات النشر؛ استخدام أسماء مستعارة مُصنفة بالإصدار
صعوبة في استكشاف الأخطاء وإصلاحها لا يوجد تسجيل مباشر من الحافة استخدم سجلات CloudWatch؛ أضف رؤوس مخصصة للتتبع
حد حجم الدالة حد 1 ميجابايت مدمج استخدم مكتبات خارجية عبر الطبقات
البدء البارد استدعاء موقع حافة جديد احتفظ بالدوال خفيفة؛ استخدم استراتيجيات التدفئة
الوقت المحدد حد 5 ثوانٍ لأحداث المشاهد تحسين المنطق؛ تجنب مكالمات الشبكة

اعتبارات الأداء

تعمل دوال لامبدا@الحافة في مواقع حافة AWS باستخدام شبكة كلاودفرنت، التي تمتد على أكثر من 400 نقطة وجود (PoPs) عالميًا3.

زمن الوصول

  • تستغرق أحداث طلب/استجابة المشاهد ملي ثانية.
  • عادةً ما يكون وقت البدء البارد أقل من 100 مللي ثانية للدوال الخفيفة.

التكلفة

يتم فرض رسوم مقابل:

  • عدد الاستدعاءات
  • مدة التنفيذ (بالمللي ثانية)
  • نقل البيانات (إذا كان ذلك مطبقًا)

تحسين الأوقات القصيرة للتنفيذ وتخزين الاستجابات مؤقتًا يمكن أن يقلل التكلفة بشكل كبير.


اعتبارات الأمان

تُنفَّذ Lambda@Edge ضمن البنية التحتية المدارة من AWS، وتستند إلى نفس نموذج الأمان الخاص بـ AWS Lambda4. ومع ذلك، فإن التنفيذ على الحافة يطرح تحديات فريدة:

  • لا وصول إلى VPC: لا يمكن للوظائف الاتصال بموارد VPC الخاصة.
  • كود غير قابل للتغيير: بعد النشر، لا يمكنك تعديل الوظيفة؛ يجب إعادة النشر بدلاً من ذلك.
  • البيانات الحساسة: تجنب تسجيل البيانات الشخصية؛ الامتثال لـ GDPR والقوانين الإقليمية.
  • تنظيف الرؤوس: تحقق دائمًا من رؤوس مدخلات المستخدم لمنع حقن البيانات.

نصيحة: استخدم AWS WAF مع Lambda@Edge لأمان متعدد الطبقات.


اختبار Lambda@Edge

اختبار وظائف الحافة قد يكون صعبًا لأنها تعمل عالميًا. إليك الاستراتيجيات:

  1. المحاكاة المحلية: استخدم AWS SAM CLI أو أحداث محاكاة محلية.
  2. توزيعات التخزين المؤقت: نشرها أولاً على توزيع CloudFront غير الإنتاجي.
  3. اختبارات التكامل: استخدم أدوات مثل Postman أو k6 لمحاكاة حركة المرور العالمية.

مثال لحدث محاكاة للاختبار المحلي:

{
  "Records": [
    {
      "cf": {
        "request": {
          "uri": "/index.html",
          "headers": {
            "host": [{"key": "Host", "value": "example.cloudfront.net"}],
            "cloudfront-forwarded-proto": [{"key": "CloudFront-Forwarded-Proto", "value": "http"}]
          }
        }
      }
    }
  ]
}

تشغيل محليًا:

node index.js

المراقبة والقابلية للرصد

تتكامل Lambda@Edge مع Amazon CloudWatch Logs وAWS X-Ray للتعقب5.

أفضل الممارسات

  • سجل بيانات قليلة ولكن ذات معنى (تجنب PII).
  • استخدم سجلات JSON منظمة لتسهيل التحليل.
  • وسم الوظائف بتحديدات البيئة والإصدار.

مثال لإخراج السجل:

REPORT RequestId: 1234abcd Duration: 1.23 ms Billed Duration: 2 ms Memory Size: 128 MB Max Memory Used: 45 MB

أنماط معالجة الأخطاء

لامبدا@حافة لا تدعم إعادة المحاولة لأحداث المشاهد، لذا يجب التعامل مع الأخطاء بحذر.

مثال للنمط: إرجاع استجابات احتياطية بدلاً من رمي الأخطاء.

try {
  // core logic
} catch (err) {
  console.error('Edge error:', err);
  return {
    status: '500',
    statusDescription: 'Internal Server Error',
    body: 'Something went wrong at the edge.',
  };
}

رؤى حول قابلية التوسع

بما أن وظائف لامبدا@حافة تُنسخ تلقائيًا إلى مواقع الحافة، فإن التوسع يتم إدارته بالكامل بواسطة AWS. كل موقع حافة يمكنه التعامل مع آلاف العمليات المتزامنة.

ومع ذلك، لاحظ:

  • النشرات تنتشر تدريجيًا.
  • كل منطقة تحتفظ بنسخة خاصة بها — التحديثات ليست فورية.
  • استخدم أسماء مستعارة مُصدَّقة للتحكم في النشر.

الأخطاء الشائعة التي يرتكبها الجميع

  1. نسيان إصدار الوظائف — يؤدي إلى عمليات تراجع غير متوقعة.
  2. الإفراط في استخدام المتغيرات العامة — يمكن أن يسبب تخزينًا مؤقتًا غير متسق.
  3. التسجيل المفرط — يزيد التكلفة والتأخير.
  4. تجاهل حالة الرؤوس — رؤوس سحابة أمامية تكون صغيرة الحروف.
  5. النشر دون اختبار الانتشار — تستغرق الإصدارات الجديدة دقائق للوصول إلى جميع الحواف.

دراسة حالة واقعية: التخصيص الديناميكي

منصة تجارة إلكترونية عالمية أرادت تخصيص صفحات الهبوط بناءً على دولة المستخدم دون إضافة تأخير.

الحل:

  • استخدام لامبدا@حافة (طلب المشاهد) للكشف عن رأس CloudFront-Viewer-Country.
  • إعادة توجيه المستخدمين إلى صفحات محلية (/us/, /de/, /fr/) فورًا.

النتيجة:

  • خفض التأخير بمقدار ~80 مللي ثانية عالميًا (الوسيط).
  • أزال الحاجة إلى منطق تحديد الموقع الجغرافي على الأصل.

تُعتمد هذه الأنماط على نطاق واسع من قبل الخدمات الكبيرة للتخصيص الحساس للأداء2.


تحدي جربه بنفسك

أنشئ دالة Lambda@Edge تُنفذ ما يلي:

  • يضيف رأسًا مخصصًا X-Edge-Processed: true
  • يمنع الطلبات من دولة محددة باستخدام رأس CloudFront-Viewer-Country

تلميح: استخدم مُحفز طلب المشاهد وأعد استجابة 403 عند تطابق الدولة.


دليل استكشاف الأخطاء وإصلاحها

الخطأ السبب الإصلاح
The function cannot be edited because it is replicated globally قيود Lambda@Edge إنشاء إصدار جديد وإعادة النشر
AccessDenied عند إرفاقه بالتوزيع مشكلة في أذونات IAM التأكد من أذونات lambda:CreateFunction و cloudfront:UpdateDistribution
عدم ظهور السجلات عدم تطابق منطقة CloudWatch التحقق من منطقة US-East-1 (المنطقة الافتراضية للتسجيل)
عدم تشغيل الدالة نوع حدث خاطئ التحقق من الارتباط في إعدادات توزيع CloudFront

الحوسبة الطرفية تصبح مركزية في البنية الحديثة. وفقًا لـ AWS، تُعتبر Lambda@Edge جزءًا من دفع أوسع نحو الحوسبة الخالية من الخوادم الموزعة، إلى جانب CloudFront Functions و AWS Global Accelerator6.

مع تحرك المزيد من المنطق أقرب إلى المستخدم، توقع:

  • تكامل أوثق مع استنتاج الذكاء الاصطناعي على الحافة.
  • أدوات مطورين أفضل للتصحيح والمراقبة.
  • تحكمات تكلفة أكثر دقة.

Lambda@Edge تظل حجر الزاوية للتطبيقات الموزعة عالميًا ذات التأخير المنخفض.


الاستنتاجات الرئيسية

Lambda@Edge تتيح تشغيل كود خالٍ من الخوادم عالميًا، بالضبط حيث يكون مستخدموك.

  • مثالية للتخصيص وإعادة التوجيه ومنطق الأمان.
  • قياس تلقائي مُدار بالكامل مع تكامل CloudFront.
  • خفيفة الوزن، تعتمد على الأحداث، وفعالة من حيث التكلفة.
  • تتطلب معالجة دقيقة للنسخ، والتصحيح، والحدود.

الأسئلة الشائعة

س1: هل يمكنني استخدام متغيرات البيئة في Lambda@Edge?

لا تدعم متغيرات البيئة. استخدم الثوابت أو ملفات التكوين بدلاً من ذلك.

س2: في أي منطقة AWS يجب إنشاء الدالة؟

أنشئ دائمًا في us-east-1 (فرجينيا الشمالية)، حيث تتطلب Lambda@Edge ذلك للنسخ.

س3: هل يمكن لـ Lambda@Edge الوصول إلى خدمات AWS مثل S3 أو DynamoDB؟

نعم، عبر واجهات برمجة التطبيقات العامة — لكن ليس عبر نقاط نهاية VPC الخاصة.

س4: كم تستغرق انتشار النشر؟

عادةً بضع دقائق، حسب عدد مواقع الحافة.

س5: ما هو الحد الأقصى لحجم الدالة؟

1 ميجابايت مضغوط داخليًا أو 50 ميجابايت عبر الطبقات.


الخطوات التالية

  • جرب CloudFront Functions للحصول على أداء على مستوى الميكروثانية.
  • تعلم عن تكامل AWS WAF للأمان المتقدم.
  • استكشف AWS SAM أو Terraform للنشر القائم على IaC.

الهوامش

  1. وثائق AWS Lambda@Edge – https://docs.aws.amazon.com/lambda/latest/dg/lambda-edge.html 2

  • دليل المطور لـ AWS CloudFront – https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-at-the-edge.html 2

  • البنية التحتية العالمية لـ AWS – https://aws.amazon.com/about-aws/global-infrastructure/

  • نظرة عامة على أمان AWS Lambda – https://docs.aws.amazon.com/lambda/latest/dg/security.html

  • وثائق سجلات AWS CloudWatch – https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html

  • نظرة عامة على الحوسبة الطرفية لـ AWS – https://aws.amazon.com/edge/