البنية الموجهة للخدمة باستخدام AWS Lambda: برنامج تعليمي خطوة بخطوة
نشرت: 2022-03-11عند إنشاء تطبيقات الويب ، هناك العديد من الخيارات التي يجب اتخاذها والتي يمكن أن تساعد أو تعرقل تطبيقك في المستقبل بمجرد الالتزام بها. تعتبر الخيارات مثل اللغة والإطار والاستضافة وقاعدة البيانات ضرورية.
أحد هذه الخيارات هو إنشاء تطبيق قائم على الخدمة باستخدام Service Oriented Architecture (SOA) أو تطبيق تقليدي مترابط. هذا قرار معماري شائع يؤثر على الشركات الناشئة والشركات الكبيرة والشركات على حدٍ سواء.
يتم استخدام الهندسة المعمارية الموجهة للخدمة من قبل عدد كبير من شركات يونيكورن المعروفة وشركات التكنولوجيا الفائقة مثل Google و Facebook و Twitter و Instagram و Uber. على ما يبدو ، يعمل هذا النمط المعماري للشركات الكبيرة ، ولكن هل يمكن أن يعمل من أجلك؟
سنقدم في هذه المقالة موضوع البنية الموجهة للخدمة ، وكيف يمكن الاستفادة من AWS Lambda جنبًا إلى جنب مع Python لبناء خدمات قابلة للتطوير وفعالة من حيث التكلفة بسهولة. لإثبات هذه الأفكار ، سنقوم ببناء خدمة بسيطة لتحميل الصور وتغيير حجمها باستخدام Python و AWS Lambda و Amazon S3 وعدد قليل من الأدوات والخدمات الأخرى ذات الصلة.
ما هي الهندسة المعمارية الموجهة للخدمة؟
الهندسة المعمارية الموجهة للخدمة (SOA) ليست جديدة ، لها جذور منذ عدة عقود. في السنوات الأخيرة ، ازدادت شعبيتها كنمط بسبب تقديم العديد من الفوائد للتطبيقات التي تواجه الويب.
SOA هي ، في جوهرها ، تجريد تطبيق كبير واحد في العديد من التطبيقات الصغيرة المتصلة. يتبع ذلك العديد من أفضل ممارسات هندسة البرمجيات مثل فك الاقتران وفصل الاهتمامات وبنية المسؤولية الفردية.
تختلف تطبيقات SOA من حيث التفصيل: من عدد قليل جدًا من الخدمات التي تغطي مناطق كبيرة من الوظائف إلى العديد من العشرات أو المئات من التطبيقات الصغيرة في ما يسمى بهندسة "الخدمات المصغرة". بغض النظر عن مستوى التفصيل ، فإن ما يتم الاتفاق عليه عمومًا بين ممارسي SOA هو أنها ليست وجبة غداء مجانية بأي حال من الأحوال. مثل العديد من الممارسات الجيدة في هندسة البرمجيات ، فهو استثمار يتطلب المزيد من التخطيط والتطوير والاختبار.
ما المقصود بـ AWS Lambda؟
AWS Lambda هي خدمة تقدمها منصة Amazon Web Services. يتيح لك AWS Lambda تحميل التعليمات البرمجية التي سيتم تشغيلها على حاوية عند الطلب تديرها Amazon. ستدير AWS Lambda توفير وإدارة الخوادم لتشغيل التعليمات البرمجية ، لذلك كل ما هو مطلوب من المستخدم هو مجموعة حزم من التعليمات البرمجية للتشغيل وعدد قليل من خيارات التكوين لتحديد السياق الذي يعمل فيه الخادم. يشار إلى هذه التطبيقات المُدارة باسم وظائف Lambda.
لدى AWS Lambda وضعان رئيسيان للتشغيل:
غير متزامن / يحركه الحدث:
يمكن تشغيل وظائف Lambda استجابةً لحدث في الوضع غير المتزامن. لن يتم حظر أي مصدر للأحداث ، مثل S3 و SNS وما إلى ذلك ، ويمكن لوظائف Lambda الاستفادة من ذلك بعدة طرق ، مثل إنشاء خط أنابيب معالجة لبعض سلسلة الأحداث. هناك العديد من مصادر المعلومات ، واعتمادًا على مصدر الأحداث ، سيتم دفعها إلى دالة Lambda من مصدر الحدث ، أو استقصاءها للأحداث بواسطة AWS Lambda.
متزامن / طلب-> استجابة:
بالنسبة للتطبيقات التي تتطلب استجابة ليتم إرجاعها بشكل متزامن ، يمكن تشغيل Lambda في الوضع المتزامن. عادةً ما يتم استخدام هذا جنبًا إلى جنب مع خدمة تسمى API Gateway لإرجاع استجابات HTTP من AWS Lambda إلى المستخدم النهائي ، ومع ذلك يمكن أيضًا استدعاء وظائف Lambda بشكل متزامن عبر اتصال مباشر بـ AWS Lambda.
يتم تحميل وظائف AWS Lambda كملف مضغوط يحتوي على رمز المعالج بالإضافة إلى أي تبعيات مطلوبة لتشغيل المعالج. بمجرد التحميل ، ستقوم AWS Lambda بتنفيذ هذا الرمز عند الحاجة وقياس عدد الخوادم من صفر إلى الآلاف عند الحاجة ، دون أي تدخل إضافي يطلبه المستهلك.
وظائف Lambda كتطور لـ SOA
البنية الأساسية للخدمة (Basic SOA) هي طريقة لبناء قاعدة التعليمات البرمجية الخاصة بك في تطبيقات صغيرة من أجل الاستفادة من تطبيق بالطرق الموضحة سابقًا في هذه المقالة. نتيجة لذلك ، يتم التركيز على طريقة الاتصال بين هذه التطبيقات. SOA المدفوع بالأحداث (ويعرف أيضًا باسم SOA 2.0) لا يسمح فقط بالاتصال التقليدي المباشر من خدمة إلى خدمة لـ SOA 1.0 ، ولكن أيضًا للأحداث التي سيتم نشرها في جميع أنحاء البنية من أجل إيصال التغيير.
البنية التي يحركها الحدث هي نمط يعزز بشكل طبيعي الاقتران غير المحكم والتركيب. من خلال إنشاء الأحداث والتفاعل معها ، يمكن إضافة الخدمات المخصصة لإضافة وظائف جديدة إلى حدث حالي ، ويمكن تكوين العديد من الأحداث لتوفير وظائف أكثر ثراءً.
يمكن استخدام AWS Lambda كمنصة لبناء تطبيقات SOA 2.0 بسهولة. هناك العديد من الطرق لتشغيل وظيفة Lambda ؛ من نهج قائمة انتظار الرسائل التقليدي مع Amazon SNS ، إلى الأحداث التي تم إنشاؤها بواسطة ملف يتم تحميله إلى Amazon S3 ، أو إرسال بريد إلكتروني باستخدام Amazon SES.
تنفيذ خدمة تحميل صور بسيطة
سننشئ تطبيقًا بسيطًا لتحميل الصور واستردادها باستخدام مكدس AWS. سيحتوي هذا المشروع النموذجي على وظيفتين من وظائف lambda: واحدة تعمل في وضع الطلب> الاستجابة الذي سيتم استخدامه لخدمة واجهة الويب البسيطة الخاصة بنا ، والأخرى التي ستكتشف الصور التي تم تحميلها وتغيير حجمها.
ستعمل وظيفة lambda الأولى بشكل غير متزامن استجابةً لحدث تحميل ملف تم تشغيله في حاوية S3 التي ستضم الصور التي تم تحميلها. سيتم أخذ الصورة المقدمة وتغيير حجمها لتلائم صورة بحجم 400 × 400.
ستعمل وظيفة lambda الأخرى على خدمة صفحة HTML ، مما يوفر كلاً من الوظائف للمستخدم لعرض الصور التي تم تغيير حجمها بواسطة وظيفة Lambda الأخرى بالإضافة إلى واجهة لتحميل صورة.
التكوين الأولي لـ AWS
قبل أن نبدأ ، سنحتاج إلى تكوين بعض خدمات AWS الضرورية مثل IAM و S3. سيتم تكوينها باستخدام وحدة تحكم AWS المستندة إلى الويب. ومع ذلك ، يمكن أيضًا تحقيق معظم التكوين باستخدام الأداة المساعدة لسطر أوامر AWS ، والتي سنستخدمها لاحقًا.
إنشاء مستودعات S3
S3 (أو خدمة التخزين البسيط) هي خدمة تخزين عناصر أمازون توفر تخزينًا موثوقًا وفعالًا من حيث التكلفة لأي بيانات. سنستخدم S3 لتخزين الصور التي سيتم تحميلها ، بالإضافة إلى الإصدارات التي تم تغيير حجمها من الصور التي قمنا بمعالجتها.
يمكن العثور على خدمة S3 ضمن القائمة المنسدلة "الخدمات" في وحدة تحكم AWS ضمن القسم الفرعي "التخزين وتسليم المحتوى". عند إنشاء مستودع ، سيُطلب منك إدخال اسم المجموعة وكذلك تحديد منطقة. سيسمح تحديد منطقة قريبة من المستخدمين لـ S3 بتحسين زمن الوصول والتكلفة ، بالإضافة إلى بعض العوامل التنظيمية. في هذا المثال سوف نختار منطقة "US Standard". سيتم استخدام هذه المنطقة نفسها لاحقًا لاستضافة وظائف AWS Lambda.
تجدر الإشارة إلى أن أسماء حاويات S3 يجب أن تكون فريدة ، لذلك إذا تم أخذ الاسم المختار ، فستتم مطالبتك باختيار اسم جديد وفريد.
بالنسبة لهذا المشروع النموذجي ، سننشئ دلاء تخزين باسم "اختبار التحميل" و "اختبار الحجم". سيتم استخدام دلو "اختبار التحميل" لتحميل الصور وتخزين الصورة التي تم تحميلها قبل معالجتها وتغيير حجمها. بمجرد تغيير حجم الصورة ، سيتم حفظها في دلو "اختبار تغيير الحجم" ، وتتم إزالة الصورة الأولية التي تم تحميلها.
أذونات التحميل S3
بشكل افتراضي ، تكون أذونات S3 مقيدة ولن تسمح للمستخدمين الخارجيين أو حتى المستخدمين غير الإداريين بقراءة أو كتابة أو تحديث أو حذف أي أذونات أو كائنات في الحاوية. لتغيير ذلك ، سنحتاج إلى تسجيل الدخول كمستخدم لديه حقوق إدارة أذونات حاوية AWS.
بافتراض أننا موجودون على وحدة تحكم AWS ، يمكننا عرض أذونات حاوية التحميل الخاصة بنا عن طريق تحديد الحاوية بالاسم ، والنقر فوق الزر "خصائص" في أعلى يمين الشاشة ، وفتح قسم "الأذونات" المطوي.
للسماح للمستخدمين المجهولين بالتحميل إلى هذه المجموعة ، سنحتاج إلى تعديل سياسة الحاوية للسماح بالإذن المحدد الذي يسمح بالسماح بالتحميل. يتم تحقيق ذلك من خلال سياسة التكوين المستندة إلى JSON. يتم استخدام هذا النوع من سياسات JSON على نطاق واسع عبر AWS جنبًا إلى جنب مع خدمة IAM. عند النقر فوق الزر "تحرير سياسة المجموعة" ، قم ببساطة بلصق النص التالي وانقر فوق "حفظ" للسماح بتحميل الصور العامة:
{ "Version": "2008-10-17", "Id": "Policy1346097257207", "Statement": [ { "Sid": "Allow anonymous upload to /", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::test-upload/*" } ] }
بعد القيام بذلك ، يمكننا التحقق من صحة سياسة الحاوية من خلال محاولة تحميل صورة إلى الحاوية. سيؤدي الأمر cURL التالي إلى تنفيذ الحيلة:
curl https://test-upload.s3.amazonaws.com -F 'key=test.jpeg' -F '[email protected]'
إذا تم عرض استجابة ذات 200 نطاق ، فسنعلم أنه تم تطبيق تهيئة حاوية التحميل بنجاح. يجب الآن تكوين حاويات S3 الخاصة بنا (في الغالب). سنعود لاحقًا إلى هذه الخدمة في وحدة التحكم من أجل ربط أحداث تحميل الصور الخاصة بنا باستدعاء وظيفة تغيير الحجم الخاصة بنا.
أذونات IAM لـ Lambda
تعمل جميع أدوار Lambda ضمن سياق الإذن ، وفي هذه الحالة يتم تحديد "الدور" بواسطة خدمة IAM. يحدد هذا الدور جميع الأذونات التي تتمتع بها وظيفة Lambda أثناء استدعائها. لأغراض هذا المشروع النموذجي ، سننشئ دورًا عامًا سيتم استخدامه بين وظيفتي Lambda. ومع ذلك ، في سيناريو الإنتاج ، يوصى باستخدام الدقة الدقيقة في تعريفات الأذونات لضمان عزل أي عمليات استغلال للأمان في سياق الإذن الذي تم تحديده فقط.
يمكن العثور على خدمة IAM ضمن القسم الفرعي "الأمان والهوية" من القائمة المنسدلة "الخدمات". تعد خدمة IAM أداة قوية جدًا لإدارة الوصول عبر خدمات AWS ، وقد تكون الواجهة المقدمة مفرطة بعض الشيء في البداية إذا لم تكن على دراية بأدوات مماثلة.
بمجرد الوصول إلى صفحة لوحة معلومات IAM ، يمكن العثور على القسم الفرعي "الأدوار" على الجانب الأيسر من الصفحة. من هنا يمكننا استخدام زر "إنشاء دور جديد" لإحضار معالج متعدد الخطوات لتحديد أذونات الدور. لنستخدم "lambda_role" كاسم لإذننا العام. بعد المتابعة من صفحة تعريف الاسم ، سيظهر لك خيار تحديد نوع الدور. نظرًا لأننا لا نطلب سوى وصول S3 ، انقر فوق "أدوار خدمة AWS" وداخل مربع التحديد حدد "AWS Lambda". سيتم تقديمك مع صفحة السياسات التي يمكن إرفاقها بهذا الدور. حدد سياسة "AmazonS3FullAccess" وتابع إلى الخطوة التالية لتأكيد الدور الذي سيتم إنشاؤه.
من المهم ملاحظة اسم الدور الذي تم إنشاؤه و ARN (اسم مورد أمازون). سيتم استخدام هذا عند إنشاء دالة Lambda جديدة لتحديد الدور الذي سيتم استخدامه لاستدعاء الوظيفة.
ملاحظة: ستقوم AWS Lambda تلقائيًا بتسجيل جميع المخرجات من استدعاءات الوظائف في AWS Cloudwatch ، وهي خدمة تسجيل. إذا كانت هذه الوظيفة مطلوبة ، وهي موصى بها لبيئة الإنتاج ، فيجب إضافة إذن الكتابة إلى تدفق سجل Cloudwatch إلى السياسات الخاصة بهذا الدور.
الرمز!
ملخص
الآن نحن جاهزون لبدء البرمجة. سنفترض في هذه المرحلة أنك قمت بإعداد الأمر "awscli". إذا لم تقم بذلك ، يمكنك اتباع التعليمات الموجودة على https://aws.amazon.com/cli/ لإعداد awscli على جهاز الكمبيوتر الخاص بك.
ملاحظة: تم جعل الشفرة المستخدمة في هذه الأمثلة أقصر لتسهيل مشاهدة الشاشة. للحصول على نسخة أكثر اكتمالاً ، قم بزيارة المستودع على https://github.com/gxx/aws-lambda-python/.
أولاً ، دعنا نضع هيكلًا هيكليًا لمشروعنا.
aws-lambda-python/ - image_list/ - handler.py - list.html - Makefile - requirements.txt - image_resize/ - handler.py - resize.py - Makefile - requirements.txt - .pydistutils.cfg
لدينا دليلين فرعيين في هيكلنا ، واحد لكل من وظائف lambda الخاصة بنا. في كل منها لدينا ملفات handler.py و Makefile و requirements.txt المشتركة. سيحتوي ملف handler.py على طريقة استدعاء استدعاء كل دالة من وظائف lambda ، ويمكن اعتبارها نقطة دخول للوظائف. سيحتوي ملف requirements.txt على قائمة بالتبعيات الخاصة بنا ، حتى نتمكن من تحديد المتطلبات وتحديثها بسهولة. أخيرًا ، الأمر Makefile الذي سنستخدمه لتوفير آلية سهلة للتفاعل مع awscli. سيؤدي ذلك إلى تسهيل عملية إنشاء وظيفة لامدا وتحديثها كثيرًا.
ستلاحظ ملف .pydistutils.cfg في جذر دليل المشروع. هذا الملف مطلوب إذا كنت تعمل مع Python ضمن Homebrew. نظرًا لطريقة نشر وظيفة Lambda (التي يتم تناولها في القسم التالي) ، فإن هذا الملف مطلوب. راجع المستودع لمزيد من التفاصيل.
وظيفة Lambda لتغيير حجم الصورة
رمز
بدءًا من وظيفة resize_image ، سنقوم بتجميد تبعية Wand ، مكتبة معالجة الصور الخاصة بنا ، عن طريق حفظ Wand==0.4.2
إلى requirements.txt. ستكون هذه هي التبعية الوحيدة لدالة lambda image_resize الخاصة بنا. ستحتاج وظيفة resize_image في resize.py إلى التعامل مع مورد صورة من مكتبة Wand ، وتغيير حجمه وفقًا لمعلمات العرض والارتفاع المحددة. من أجل الحفاظ على الصورة التي يتم تغيير حجمها ، سنستخدم خوارزمية تغيير الحجم "الأنسب" والتي ستحافظ على نسبة الصورة للصورة الأصلية ، مع تقليل حجم الصورة لتلائم العرض والارتفاع المحددين.
def resize_image(image, resize_width, resize_height): ... original_ratio = image.width / float(image.height) resize_ratio = resize_width / float(resize_height) # We stick to the original ratio here, regardless of what the resize ratio is if original_ratio > resize_ratio: # If width is larger, we base the resize height as a function of the ratio of the width resize_height = int(round(resize_width / original_ratio)) else: # Otherwise, we base the width as a function of the ratio of the height resize_width = int(round(resize_height * original_ratio)) if ((image.width - resize_width) + (image.height - resize_height)) < 0: filter_name = 'mitchell' else: filter_name = 'lanczos2' image.resize(width=resize_width, height=resize_height, filter=filter_name, blur=1) return image
مع هذا بعيدًا ، يلزم وجود وظيفة معالج لقبول الحدث الذي تم إنشاؤه بواسطة صورة تم تحميلها S3 ، وتسليمها إلى وظيفة resize_image
، وحفظ الصورة الناتجة التي تم تغيير حجمها.

from __future__ import print_function import boto3 from wand.image import Image from resize import resize_image def handle_resize(event, context): # Obtain the bucket name and key for the event bucket_name = event['Records'][0]['s3']['bucket']['name'] key_path = event['Records'][0]['s3']['object']['key'] response = boto3.resource('s3').Object(bucket_name, key_path).get() # Retrieve the S3 Object # Perform the resize operation with Image(blob=response['Body'].read()) as image: resized_data = resize_image(image, 400, 400).make_blob() # And finally, upload to the resize bucket the new image s3_connection.Object('test-resized', key_path).put(ACL='public-read', Body=resized_data) # Finally remove, as the bucket is public and we don't want just anyone dumping the list of our files! s3_object.delete()
النشر
مع اكتمال الشفرة ، ستحتاج إلى تحميلها على Amazon Lambda كوظيفة Lambda جديدة. هذا هو المكان الذي يلعب فيه ملف Makefile الذي تمت إضافته إلى بنية الدليل. سيتم استخدام ملف Makefile هذا لنشر تعريفات وظائف Lambda التي نقوم بإنشائها.
ROLE_ARN = arn:aws:iam::601885388019:role/lambda_role FUNCTION_NAME = ResizeImage REGION = us-west-1 TIMEOUT = 15 MEMORY_SIZE = 512 ZIPFILE_NAME = image_resize.zip HANDLER = handler.handle_resize clean_pyc : find . | grep .pyc$ | xargs rm install_deps : pip install -r requirements.txt -t . build : install_deps clean_pyc zip $(ZIPFILE_NAME) -r * create : build aws lambda create-function --region $(REGION) \ --function-name $(FUNCTION_NAME) \ --zip-file fileb://$(ZIPFILE_NAME) \ --role $(ROLE_ARN) \ --handler $(HANDLER) \ --runtime python2.7 \ --timeout $(TIMEOUT) \ --memory-size $(MEMORY_SIZE) update : build aws lambda update-function-code --region $(REGION) \ --function-name $(FUNCTION_NAME) \ --zip-file fileb://$(ZIPFILE_NAME) \ --publish
الوظائف الرئيسية لملف Makefile هذا هي "إنشاء" و "تحديث". تقوم هذه الوظائف أولاً بحزم الدليل الحالي ، والذي يمثل جميع التعليمات البرمجية اللازمة لتشغيل وظيفة Lambda. بعد ذلك ، سيتم تثبيت أي تبعيات محددة في ملف requirements.txt
على الدليل الفرعي الحالي ليتم تعبئتها. تقوم خطوة الحزم بضغط محتويات الدليل ليتم تحميلها لاحقًا باستخدام الأمر "awscli". يمكن تكييف ملف Makefile الخاص بنا للاستخدام في تعريف دالة Lambda الأخرى.
في الأداة المساعدة Makefile ، نحدد بعض المتغيرات اللازمة لإنشاء / تحديث صورتنا. قم بتكوينها حسب الضرورة حتى تعمل أوامر Makefile بشكل صحيح.
-
ROLE_ARN
: هذا هو اسم مورد أمازون الذي يحدد دورنا في تشغيل وظيفة Lambda. -
FUNCTION_NAME
: اسم وظيفة Lambda التي نقوم بإنشائها / تحديثها. -
REGION
: المنطقة التي سيتم إنشاء / تحديث وظيفة Lambda تحتها. -
TIMEOUT
: سيتم إنهاء المهلة بالثواني قبل استدعاء Lambda. -
MEMORY_SIZE
: حجم الذاكرة بالميغابايت التي يمكن لوظيفة Lambda الوصول إليها عند استدعائها. -
ZIPFILE_NAME
: اسم الحزمة المضغوطة التي تحتوي على رمز دالة Lambda والتبعيات. -
HANDLER
: مسار الاستيراد المطلق ، بالتدوين النقطي ، لدالة المعالج.
بمجرد التهيئة ، سيؤدي تشغيل الأمر make create
إلى إنشاء شيء مشابه للإخراج التالي:
$ make create pip install -r requirements.txt -t . ... find . | grep .pyc| xargs rm zip image_resize.zip -r * ... aws lambda create-function --region ap-northeast-1 \ --function-name ResizeImage2 \ --zip-file fileb://image_resize.zip \ --role arn:aws:iam::11111111111:role/lambda_role \ --handler handler.handle_resize \ --runtime python2.7 \ --timeout 15 \ --memory-size 512 { "CodeSha256": "doB1hsujmZnxZHidnLKP3XG2ifHM3jteLEBvsK1G2nasKSo=", "FunctionName": "ResizeImage", "CodeSize": 155578, "MemorySize": 512, "FunctionArn": "arn:aws:lambda:us-west-1:11111111111:function:ResizeImage", "Version": "$LATEST", "Role": "arn:aws:iam::11111111111:role/lambda_role", "Timeout": 15, "LastModified": "2016-01-10T11:11:11.000+0000", "Handler": "handler.handle_resize", "Runtime": "python2.7", "Description": "" }
اختبارات
بعد تنفيذ أمر الإنشاء ، تكون وظيفة تغيير الحجم لصورنا متاحة للاستخدام ، ولكن لم يتم توصيلها بحاوية S3 لتلقي الأحداث. لا يزال بإمكاننا اختبار الوظيفة عبر وحدة تحكم AWS للتأكيد على أن الوظيفة تتعامل بشكل صحيح مع أحداث تحميل ملف S3. في لوحة معلومات AWS Lambda ، والتي يمكن العثور عليها ضمن القسم الفرعي "Compute" من القائمة المنسدلة "Services" ، حدد اسم الوظيفة التي أنشأناها. توفر صفحة تفاصيل وظيفة Lambda قائمة منسدلة بعنوان "الإجراءات" تحتوي على خيار يسمى "تكوين حدث الاختبار".
سيؤدي النقر فوق هذا إلى فتح نموذج يسمح لك بتحديد حدث اختبار وبعض النماذج النموذجية. اختر مثال "وضع S3" ، واستبدل أي إشارات لاسم مجموعة باسم الحاوية التي تم إعدادها. بمجرد تكوين ذلك ، فإن الاستخدام اللاحق لزر "اختبار" في صفحة وظيفة Lambda سوف يستدعي وظيفة Lambda كما لو كان الحدث الذي تم تكوينه مسبقًا قد حدث بالفعل.
من أجل مراقبة أي تتبعات لمكدس الأخطاء أو رسائل السجل ، يمكنك عرض تدفق السجل في Cloudwatch. سيتم إنشاء مجموعة سجل جديدة في نفس الوقت الذي تم فيه إنشاء وظيفة Lambda. تعد تدفقات السجل هذه مفيدة ويمكن توجيهها إلى خدمات أخرى.
الاتصال بـ S3 Bucket Events
مرة أخرى في لوحة معلومات S3 ، وسّع قسم "الأحداث" المطوي الموجود في قائمة "الخصائص" لإظهار نموذج "إخطارات الأحداث". الحقول الإلزامية المراد ملؤها هي مدخلات "الأحداث" و "الإرسال إلى". من "الأحداث" ، حدد حدث "كائن تم إنشاؤه (الكل)". سيسمح هذا باعتراض جميع الأحداث التي تنشئ كائنًا في حاوية التحميل. لإدخال "الإرسال إلى" ، حدد زر الاختيار "وظيفة Lambda". سيظهر قسم جديد مع قائمة منسدلة تحتوي على وظيفة lambda "ResizeImage" التي قمنا بتكوينها كخيار. عند النقر فوق "حفظ" ، سيتم الآن توجيه أي أحداث "كائن تم إنشاؤه" كمدخل لاستدعاء وظيفة "ResizeImage" Lambda.
لدينا الآن الوظائف الأساسية للتطبيق. دعنا نجري اختبار cURL آخر للتأكد من أن كل شيء يعمل كما هو متوقع. استخدم cURL لتحميل صورة في حاوية S3 ، وتحقق يدويًا من تحميل الصورة في حاوية تغيير الحجم.
curl https://test-upload.s3.amazonaws.com -F 'key=test.jpeg' -F '[email protected]'
عند تنفيذ هذا الأمر ، يجب إنشاء الصورة التي تم تغيير حجمها في دلو "اختبار الحجم" بعد 50-1000 مللي ثانية اعتمادًا على ما إذا كانت وظيفة Lambda "محسنة" بالفعل.
قائمة وظيفة لامدا الصورة
رمز
ستقوم وظيفة ListImage Lambda باسترداد قائمة بالصور التي تم تغيير حجمها وعرضها على صفحة HTML للمستخدم. توفر صفحة HTML هذه أيضًا وظيفة للمستخدم لتحميل الصور الخاصة به. يتم استخدام Jinja2 في الوظيفة لتقديم HTML من تعريف القالب. تمامًا كما كان من قبل ، تم تحديد هذه المتطلبات في ملف requirements.txt
.
from __future__ import print_function import os import boto3 from jinja2 import Environment from jinja2 import FileSystemLoader def _render_template(image_urls): env = Environment(loader=FileSystemLoader(os.path.abspath(os.path.dirname(__file__)))) template = env.get_template('list.html') rendered_template = template.render(image_urls=image_urls) return rendered_template def handle_list_image(event, context): bucket = boto3.resource('s3').Bucket('test-resized') image_summaries = sorted((image_summary for image_summary in bucket.objects.all()), key=lambda o: o.last_modified) image_urls = [] for summary in image_summaries: image_urls.append( boto3.client('s3').generate_presigned_url( 'get_object', Params={ 'Bucket': summary.bucket_name, 'Key': summary.key } ) ) return {'htmlContent': _render_template(image_urls)}
<html> <head> <title>List Images</title> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> <script> var uploadImage = (function () { var inProgress = false; return function () { if (inProgress) { return; } inProgress = true; var formData = new FormData(); var fileData = $('#image-file').prop('files')[0]; formData.append('key', parseInt(Math.random() * 1000000)); formData.append('acl', 'public-read'); formData.append('file', fileData); $.ajax({ url: 'https://test-upload.s3.amazonaws.com/', type: 'POST', data: formData, processData: false, contentType: false, success: function (data) { window.location.reload(); } }); } })(); </script> <style type="text/css"> .image__container { float: left; width: 30%; margin-left: 2.5%; margin-right: 2.5%; max-width: 400px; } </style> </head> <body> <nav> <input type="file" onchange="uploadImage()" value="Upload Image" /> </nav> <section> {% for image_url in image_urls %} <div class="image__container"> <img src="{{ image_url }}" /> </div> {% endfor %} </section> </body> </html>
مرة أخرى ، يمكننا تغيير Makefile السابق واستخدام الأمر create لنشر وظيفة lambda الخاصة بنا.
بوابة API
اكتملت وظيفة ImageList Lambda ، ولكن لا يمكن تقديمها لأي مستخدم. هذا لأنه لا يمكن استدعاء وظائف Lambda إلا استجابة لحدث من خدمة أخرى ، أو برمجيًا. هذا هو المكان الذي تظهر فيه خدمة Amazon AWS API Gateway. يمكن العثور على بوابة API ضمن القسم الفرعي "خدمات التطبيقات".
بوابة API هي طريقة لنمذجة نقاط النهاية كمجموعة من الموارد والطرق ، وهي أساسًا واجهة REST. بالإضافة إلى توفير وسيلة للتحقق من صحة الطلبات وتحويلها ، تؤدي بوابة API وظائف أخرى مثل توفير طلبات تقييد / تحديد المعدل.
من لوحة معلومات بوابة API ، أنشئ واجهة برمجة تطبيقات جديدة لخدمة وظيفة ListImage. يمكن تعيين الاسم والوصف حسب تفضيلاتك. بمجرد الإنشاء ، انقر فوق اسم واجهة برمجة التطبيقات الجديدة للوصول إلى تفاصيل واجهة برمجة التطبيقات. قم بإنشاء مورد جديد لعنوان URL الجذر "/". سيتم استخدام عنوان URL هذا لخدمة صفحة HTML.
أثناء عرض تفاصيل صفحة المصدر الجذر ، أضف طريقة GET. عيّن "نوع التكامل" ليكون "وظيفة Lambda" ، واضبط "منطقة Lambda" على "us-west-1" أو منطقتك المحددة ، واكتب اسم وظيفة ListImage Lambda.
قبل أن نتمكن من البدء في تعيين استجابتنا لمخرج HTML ، نحتاج إلى تحديد "نموذج" يحدد مخططًا للاستجابة من الخادم بالإضافة إلى تعيين هذه الاستجابة لنوع المحتوى. حدد قسم "النماذج" لواجهة برمجة التطبيقات وانقر على "إنشاء" لإنشاء نموذج جديد. امنح النموذج الاسم "HTML" ، مع نوع المحتوى "text / html" وحدد المخطط على النحو التالي:
{ "$schema": "http://json-schema.org/draft-04/schema#", "title" : "HTML", "type" : "object" }
مرة أخرى على لوحة معلومات واجهة برمجة التطبيقات ، حدد المورد الذي أنشأناه وانتقل إلى قسم "استجابة التكامل". يحدد هذا القسم أي تحول يتم إجراؤه على العملية بعد تلقي استجابة من وظيفة Lambda قبل توصيل الاستجابة للخطوة النهائية.
افتح قسم "Mapping Templates" وأضف "نوع محتوى" جديدًا من "text / html". قم بإزالة "نوع المحتوى" القديم في نفس الوقت. على اليسار ، قم بتغيير القائمة المنسدلة من "Output Passthrough" إلى "Mapping template". سيسمح لنا ذلك بتعديل JSON الأولي الذي تقبله API Gateway ، واستخدام محتوى HTML داخل خاصية "htmlContent" للبيانات التي تم إرجاعها بدلاً من ذلك. بالنسبة إلى نموذج التعيين ، حدد "$ input.htmlContent" ليكون النموذج. أخيرًا ، قم بتغيير قسم "استجابة الطريقة" عن طريق إزالة "application / json" من "نماذج الاستجابة لـ 200" وإضافة "text / html" بدلاً من ذلك.
بالعودة إلى لوحة التحكم الخاصة بواجهة برمجة التطبيقات ، يوجد زر في الجزء العلوي الأيسر من الصفحة بعنوان "نشر API". انقر فوق هذا الزر لتحديث أو إنشاء واجهة برمجة التطبيقات بالموارد والطرق والنماذج والتعيينات المحددة. بمجرد الانتهاء من ذلك ، سيتم عرض عنوان URL لمرحلة النشر التي تم تحديدها (التدريج افتراضيًا). أخيرًا ، المثال كامل! يمكنك تحميل بعض الملفات لاختبار وعرض الصور التي تم تغيير حجمها.
تغليف
تعد AWS خدمة كبيرة ولن تختفي قريبًا. على الرغم من أن حجز البائع دائمًا أمر يجب توخي الحذر منه ، فإن AWS Lambda تقدم خدمة ضئيلة نسبيًا مع مجموعة غنية من خيارات التكوين الإضافية. ستوفر الاستفادة من الخدمات التي تقدمها AWS لتنفيذ تطبيقات قابلة للتطوير والصيانة بسهولة أكبر فائدة لاستخدام منصة AWS. يوفر AWS Lambda حلاً أنيقًا وقابل للتطوير وفعال من حيث التكلفة مدعومًا بمنصة على مستوى المؤسسات يستخدمها عدد كبير جدًا من المستهلكين. أعتقد أن التطبيقات "بدون خادم" هي طريق المستقبل. أخبرنا برأيك في التعليقات أدناه.