سيرفرلس على الحافة: غوص عميق في AWS Lambda@Edge

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

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

TL;DR

  • 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، الشبكة العالمية لتوصيل المحتوى (CDN)1.

بدلاً من تنفيذ رمزك في منطقة واحدة، ينشر 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: إنشاء وظيفة Lambda

'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: نشر على Lambda@Edge

  1. اذهب إلى AWS Lambda Console.
  2. أنشئ وظيفة جديدة (Node.js 18.x runtime).
  3. تحت الإجراءات → نشر على Lambda@Edge, قم بربطه بتوزيع CloudFront الخاص بك.
  4. اختر نوع الحدث Viewer Request.

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

بعد النشر، أي طلب HTTP إلى توزيع CloudFront الخاص بك يجب أن يعيد التوجيه تلقائيًا إلى HTTPS.

مثال:

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

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

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

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

تستخدم الخدمات الكبيرة منطق الحافة لتقليل التأخير ونقل العمل من المصادر2.


متى تستخدم مقابل متى لا تستخدم Lambda@Edge

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

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


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

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

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

تعمل وظائف Lambda@Edge في مواقع الحافة التابعة لـ AWS باستخدام شبكة CloudFront، والتي تمتد عبر 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"}]
          }
        }
      }
    }
  ]
}

Run locally:

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

أنماط التعامل مع الأخطاء

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

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

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

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

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

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

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

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

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

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

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

الحل:

  • استخدم Lambda@Edge (Viewer Request) للكشف عن رأس 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 when attaching to distribution مشكلة في أذونات 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: كم تستغرق انتشار النشر؟

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

  • 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/