PHP Serverless على AWS لامدا

مرحبا بالجميع. يوم الاثنين ، سيتم عقد الدرس الأول في المجموعة الجديدة من الدورة التدريبية "Backend PHP Developer" . في هذا الصدد ، نواصل نشر مواد مفيدة حول هذا الموضوع. لنبدأ.



مثل Simon Wordley ، أعتقد أن الحوسبة الخالية من الخوادم تعد مجالًا مثيرًا للاهتمام للغاية ، ويعزى ذلك في المقام الأول إلى نظام الدفع الحبيبي (الدفع فقط عند تنفيذ التعليمات البرمجية الخاصة بك) ، ولا داعي للقلق بشأن خدمة وإعداد الخوادم والحاويات. لدرجة أنني أعمل مع PHP Runtime المفتوح لـ Apache OpenWhisk ، وهو إصدار تجاري متاح كأحد ميزات IBM Cloud .

هناك مزودون آخرون بدون خادم ، و AWS Lambda هي شركة رائدة في السوق ، ولكن حتى وقت قريب ، كان دعم PHP مرهقًا ومتواضعًا للغاية. تغير هذا في نهاية عام 2018 مع واجهة برمجة تطبيقات وقت التشغيل Lambda الجديدة ودعم الطبقة .

دعونا نلقي نظرة على الجوانب العملية للخوادم بدون PHP على Lambda باستخدام Serverless Framework .

TL ؛ د


الكود المصدري لـ Hello World بسيط في مستودع lambda-php الخاص بي على جيثب. انتقل إلى قسم الملاحظات ويمكننا المتابعة.

فب وقت التشغيل


تسمح لك واجهة برمجة تطبيقات وقت التشغيل باستخدام أي وقت تشغيل مع Lambda. بطريقة ما ، يشبه هذا OpenWhisk ، حيث يوجد واجهة برمجة تطبيقات HTTP بين النظام الأساسي بدون خادم ووقت التشغيل. هناك اختلاف كبير واحد هو أنه مع Lambda ، يرسل وقت التشغيل طلبًا إلى النظام الأساسي لتلقي بيانات الاتصال ، في حين يقوم OpenWhisk باستدعاء نقطة النهاية التي يجب أن يوفرها وقت التشغيل. لمزيد من المعلومات ، اطلع على منشور AWS الخاص بمدونة Michael Moussa الذي ألهمني للقيام بهذه المهمة.

للبدء ، نحتاج إلى وقت تشغيل PHP لـ Lambda. ستتكون من PHP قابل للتنفيذ ، كود PHP لاستدعاء وظيفة بدون خادم ، وملف bootstrap ، كما هو مطلوب من قبل النظام الأساسي. من هذه الأشياء الثلاثة نجمع طبقة. يمكن إعادة استخدام الطبقات في حسابات مختلفة ، لذلك أنا مندهش لأن AWS لا توفر لنا حساب PHP. لا يصدق ، ولكن صحيح ، أنهم لا يستخدمون PHP 7.3 ، لذلك سيكون لدينا لبناء منطقتنا.
جميع الملفات التي وضعناها في دليل layer/php في مشروعنا.

بناء PHP قابل للتنفيذ


نحتاج إلى PHP قابل للتنفيذ والذي سيتم تشغيله داخل حاويات Lambda. أسهل طريقة للقيام بذلك هي تجميعها على نفس المنصة مثل Lambda ، لذلك سوف نستخدم EC2. يشرح مقال مايكل كيفية القيام بذلك ، ولفت هذه الأوامر في البرنامج النصي compile_php.sh ، ثم لنسخها إلى مثيل EC2 ، قم بتشغيل ونسخ الملف القابل للتنفيذ مرة أخرى إلى جهاز الكمبيوتر الخاص بي:

 $ export AWS_IP=ec2-user@{ipaddress} $ export SSH_KEY_FILE=~/.ssh/aws-key.rsa $ scp -i $SSH_KEY_FILE compile_php.sh $AWS_IP:doc/compile_php.sh $ ssh -i $SSH_KEY_FILE -t $AWS_IP "chmod a+x compile_php.sh && ./compile_php.sh 7.3.0" $ scp -i $SSH_KEY_FILE $AWS_IP:php-7-bin/bin/php layer/php/php 


هذا النهج سيجعله قابلاً للتكرار جيدًا ، ونأمل أن يتم الترقية إلى إصدارات جديدة من PHP.

إلباس الحذاء


بما أننا نستخدم واجهة برمجة تطبيقات وقت التشغيل ، نحتاج إلى ملف bootstrap . يتطلب Lambda نفسه مثل هذا الاسم لتحديد الملف ؛ فإنه يستجيب لاستدعاء وظيفة يطابق الصور عن طريق استدعاء API في حلقة.

بشكل أساسي ، يجب أن نكون في حلقة ونستدعي نقطة النهاية /next لفهم ما يجب الاتصال به بعد ذلك ، ثم نسميها ، ثم نرسل الإجابة إلى نقطة النهاية /response .
يقدم AWS مثالاً في BASH باستخدام curl :

 while true do HEADERS="$(mktemp)" # Get an event EVENT_DATA=$(curl -sS -LD "$HEADERS" -X GET "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/next") REQUEST_ID=$(grep -Fi Lambda-Runtime-Aws-Request-Id "$HEADERS" | tr -d '[:space:]' | cut -d: -f2) # Execute the handler function from the script RESPONSE=$($(echo "$_HANDLER" | cut -d. -f2) "$EVENT_DATA") # Send the response curl -X POST "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$REQUEST_ID/response" -d "$RESPONSE" done 


نريد أن نفعل الشيء نفسه في PHP ، وعلى الرغم من أنني أستطيع أن أكتبها بنفسي ، فإن Pariksit Agnihotri هو بالفعل أمامي في PHP-Lambda-Runtime / runtime.php ، لذلك نحن فقط نسخ هذا إلى layer/php/runtime.php . في الإصدار الخاص بي ، قمت بإجراء العديد من التغييرات ، وأضفت json_encoding وحسّنت معالج الأخطاء.
layer/php/bootstrap الملف layer/php/bootstrap بسيطة للغاية ، وكل ما هو مطلوب منها هو تشغيل PHP القابل للتنفيذ باستخدام هذا الملف:

 #!/bin/sh cd $LAMBDA_TASK_ROOT /opt/php /opt/runtime.php 


هذا كل شيء. الآن لدينا ثلاثة ملفات في طبقة / php:

  • php - php الملف القابل للتنفيذ؛
  • runtime.php - ملف وقت تشغيل API ؛
  • bootstrap هو ملف Lambda المطلوب.


نتيجة لذلك ، سيصبح كل ذلك طبقة PHP (طبقة) في تطبيق Lambda الخاص بنا.

تكوين إطار Serverless


يوفر إطار عمل Serverless تكوينًا قابل للتكرار ونشر تطبيق بدون خادم. أنا معجب بهذا المفهوم وأريد استخدام المزيد من هذه الأدوات. سوف نستخدم إطار عمل Serverless الخاص بـ PHP Hello World.
نظرًا لعدم وجود قالب مناسب للتطبيقات في PHP في إطار Serverless ، فإننا ببساطة نقوم بإنشاء ملف serverless.yml في الدليل من خلال مشروعنا.
بالنسبة للمبتدئين ، والأكثر أساسية:

 service: php-hello-world provider: name: aws runtime: provided region: eu-west-2 memorySize: 128 


سوف نسمي تطبيقنا php-hello-world ونستخدم AWS كمزود. منذ أن كنت في المملكة المتحدة ، أنشأت منطقة لندن . لا نحتاج إلى الكثير من الذاكرة ، لذلك ستكون سعة 128 ميجابايت كافية.
وقت التشغيل هو اللغة التي تريد تنفيذ وظيفتك بها. لاستخدام runtime API الذي سيتم تنفيذه ملف bootstrap لدينا ، قمت بتعيين هذا الحقل إلى المقدمة .
وستحتاج إلى ملف .gitignore يحتوي على:

 .serverless 


منذ في git نحن لسنا بحاجة إلى هذا الدليل.
بعد ذلك ، دعونا نضيف serverless.yml إلى serverless.yml عن طريق إضافة:

 layers: php: path: layer/php 


سيؤدي ذلك إلى إنشاء طبقة AWS PhpLambdaLayer اسم PhpLambdaLayer ، والذي يمكننا الرجوع إليه في PhpLambdaLayer .

Hello World وظيفة Hello World
الآن يمكننا كتابة وظيفة php serverless لدينا. يجب إدخال هذا في ملف handler.php :

 <?php function hello($eventData) : array { return ["msg" => "hello from PHP " . PHP_VERSION]; } 


تأخذ الوظيفة معلومات حول الحدث وتقوم بإرجاع صفيف اقتران.
لإخبار خادم بلا إطار عن نشر وظيفتنا ، تحتاج إلى إضافة ما يلي إلى ملف serverless.yml :

 functions: hello: handler: handler.hello layers: - {Ref: PhpLambdaLayer} 


إطار Serverless يدعم العديد من الوظائف لتطبيق واحد. لكل منهم اسم ، في هذه الحالة hello ، وفي حالتنا ، معالج ، وهو اسم ملف بدون امتداد ، متبوعًا بنقطة ، ثم اسم الوظيفة في هذا الملف. وبالتالي ، فإن معالج handler.hello يعني أننا سوف نقوم بتشغيل وظيفة hello() في handler.php .
أخيرًا ، نقوم أيضًا بالإبلاغ عن الوظائف إلى طبقة PHP الخاصة بنا حتى تتمكن من تنفيذ كود PHP.

نشر في لامدا


لتوسيع وظيفتنا بطبقتها ، نقوم بتشغيل الأمر التالي:

 $ sls deploy 


إذا تم تنفيذ الأمر لأطول فترة ممكنة ، فسيتم الحصول على إخراج مماثل لهذا:



وفاء وظيفتنا


بعد النشر ، يمكننا استدعاء الوظيفة باستخدام الأمر:

 $ sls invoke -f hello -l 




وانتهيت!

لتلخيص


مع طبقات جديدة وواجهات برمجة التطبيقات لوقت التشغيل ، يمكنك الآن تشغيل وظائف PHP الخالية من الخادم بسهولة في Lambda. هذه أخبار جيدة لمطوري PHP المرتبطين بـ AWS.

في انتظار تعليقاتكم ، الأصدقاء!

Source: https://habr.com/ru/post/ar453116/


All Articles