ورشة عمل تعديل التطبيقات

1. مقدمة

تاريخ آخر تعديل: 01‏-11‏-2024

كيف يمكننا تحديث تطبيق PHP قديم ليتوافق مع Google Cloud؟

(📽️ شاهِد فيديو تمهيديًا مدته 7 دقائق عن هذا الدليل التعليمي)

من الشائع أن يكون لديك تطبيقات قديمة تعمل على الموقع الإلكتروني وتحتاج إلى تحديث. ويعني ذلك جعلها قابلة للتوسّع والأمان والنشر في بيئات مختلفة.

في هذه الورشة، ستتمكّن من:

  1. حاويات تطبيق PHP
  2. انتقِل إلى خدمة قاعدة بيانات مُدارة ( Cloud SQL).
  3. النشر على Cloud Run (وهو بديل لخدمة GKE/Kubernetes التي لا تتطلّب أي عمليات)
  4. تأمين التطبيق باستخدام "إدارة الهوية وإمكانية الوصول" وSecret Manager
  5. تحديد مسار التكامل/النشر الآلي من خلال Cloud Build يمكن ربط Cloud Build بمستودع Git مستضاف على مقدّمي خدمات Git الرائجين، مثل GitHub أو GitLab، ويمكن تشغيله عند إجراء أي دفعة إلى الفرع الرئيسي، على سبيل المثال.
  6. استضاف صور التطبيقات على Cloud Storage. ويتم ذلك من خلال التثبيت، ولا يلزم استخدام أي رمز لتغيير التطبيق.
  7. تقديم وظائف الذكاء الاصطناعي التوليدي من خلال Gemini، المنظَّمة من خلال Cloud Functions (بدون خادم)
  8. التعرّف على أهداف مستوى الخدمة وتشغيل تطبيقك الذي تم تحديثه مؤخرًا.

من خلال اتّباع هذه الخطوات، يمكنك تحديث تطبيق PHP تدريجيًا، ما يؤدي إلى تحسين قابليته للتوسع وأمان استخدامه ومرونة نشره. بالإضافة إلى ذلك، يتيح لك الانتقال إلى Google Cloud الاستفادة من البنية الأساسية والخدمات القوية لضمان تشغيل تطبيقك بسلاسة في بيئة مُدارة في الأصل باستخدام السحابة الإلكترونية.

نعتقد أنّه يمكن تطبيق ما ستتعلمه من خلال اتّباع هذه الخطوات البسيطة على تطبيقك ومؤسستك وبلغة أو حزمة مختلفة وحالات استخدام مختلفة.

لمحة عن التطبيق

التطبيق ( الرمز، بموجب ترخيص MIT) الذي تشعّبه هو تطبيق أساسي بلغة PHP 5.7 مع مصادقة MySQL. الفكرة الرئيسية للتطبيق هي توفير منصة يمكن للمستخدمين من خلالها تحميل الصور، ويمكن للمشرفين الإشارة إلى الصور غير الملائمة. يتضمّن التطبيق جدولَين:

  • المستخدمون: تأتي مُجمَّعة مسبقًا مع المشرفين. يمكن لمستخدمين جدد التسجيل.
  • الصور: مرفق مع بعض نماذج الصور. يمكن للمستخدمين الذين سجّلوا الدخول تحميل صور جديدة. سنضيف بعض الأفكار هنا.

هدفك

نريد تحديث التطبيق القديم لاستخدامه في Google Cloud. وسنستفيد من أدواتها وخدماتها لتحسين قابلية التوسّع وتعزيز الأمان وأتمتة إدارة البنية الأساسية ودمج ميزات متقدّمة مثل معالجة الصور والمراقبة وتخزين البيانات باستخدام خدمات مثل Cloud SQL وCloud Run وCloud Build وSecret Manager وغيرها.

445f7a9ae37e9b4d.png

والأهم من ذلك، نريد تنفيذ ذلك خطوة بخطوة حتى تتمكّن من التعرّف على العملية الفكرية التي تستند إليها كل خطوة، وعادةً ما تفتح كل خطوة إمكانيات جديدة للخطوات التالية (على سبيل المثال، من الوحدة 2 إلى 3 ومن الوحدة 6 إلى 7).

ألم تقتنع بعد؟ يمكنك الاطّلاع على هذا الفيديو الذي تبلغ مدته 7 دقائق على YouTube.

المتطلبات

  • جهاز كمبيوتر مزوّد بمتصفّح ومتصل بالإنترنت
  • بعض الاعتمادات في Google Cloud Platform يمكنك طلب بعض المعلومات من أحد المعجبين بمنتجات Google في منطقتك.
  • يعمل الأمر gcloud.
  • هل تعمل محليًا؟ نزِّله هنا. ستحتاج أيضًا إلى محرِّر جيد (مثل vscode أو intellij).
  • هل تريد إجراء كل شيء "في السحابة الإلكترونية"؟ يمكنك استخدام Cloud Shell بعد ذلك.
  • مستخدم GitHub. ستحتاج إلى هذا الإجراء لتقسيم الرمز الأصلي 🧑🏻‍💻 gdgpescara/app-mod-workshop باستخدام مستودع git الخاص بك. هذا الأمر مطلوب للحصول على مسار CI/CD (الإتمام التلقائي -> إنشاء -> التفعيل)

يمكنك الاطّلاع على أمثلة على الحلول هنا:

يمكن المشاركة في هذه الورشة من جهاز الكمبيوتر أو إكمالها بالكامل على متصفّح.

2. إعداد المساهمين وإنشاء نسخة من التطبيق

6dafc658860c0ce5.png

تحصيل قيمة رصيد Google Cloud Platform وإعداد بيئة Google Cloud Platform [اختياري]

لتنفيذ هذه الورشة، تحتاج إلى حساب فوترة يتضمّن بعض الرصيد. إذا كانت لديك خدمة فوترة خاصة بك، يمكنك تخطّي هذه الخطوة.

أنشئ حسابًا جديدًا على Gmail من Google (*) لربطه برصيدك في Google Cloud Platform. اطلب من المدرّس الرابط لاستلام رصيد Google Cloud Platform أو استخدِم الأرصدة هنا: bit.ly/PHP-Amarcord-credits.

سجِّل الدخول باستخدام الحساب الذي تم إنشاؤه حديثًا واتّبِع التعليمات.

ff739240dbd84a30.png

(

) لماذا أحتاج إلى حساب Gmail جديد تمامًا؟*

لقد لاحظنا أنّ بعض المستخدمين لم يجتازوا دورة Codelab لأنّ حساباتهم (خاصة حسابات العمل أو حسابات الطلاب الإلكترونية) سبق أن تم استخدامها في Google Cloud Platform وأنّها تخضع لسياسات تنظيمية تفرض قيودًا على إمكانية إكمال الدورة. ننصحك إما بإنشاء حساب Gmail جديد أو استخدام حساب Gmail حالي (gmail.com) بدون سبق أن تعرّضت لبرنامج GCP.

انقر على الزر للاستفادة من الرصيد.

331658dc50213403.png

املأ النموذج التالي باسمك واسم العائلة ووافِق على الأحكام والشروط.

قد تحتاج إلى الانتظار لبضع ثوانٍ قبل ظهور حساب الفوترة هنا: https://console.cloud.google.com/billing

بعد الانتهاء، افتح Google Cloud Console وأنشئ مشروعًا جديدًا بالنقر على أداة اختيار المشاريع في القائمة المنسدلة في أعلى يمين الصفحة حيث يظهر الخيار "بدون مؤسسة". انظر أدناه

bd7548f78689db0b.png

أنشئ مشروعًا جديدًا إذا لم يكن لديك مشروع، كما هو موضّح في لقطة الشاشة أدناه. يتوفّر خيار "مشروع جديد" في أعلى يسار الصفحة.

6c82aebcb9f5cd47.png

تأكَّد من ربط المشروع الجديد بحساب الفوترة التجريبي على Google Cloud Platform على النحو التالي.

f202527d254893fb.png

يمكنك الآن استخدام Google Cloud Platform. إذا كنت مبتدئًا أو كنت تريد إجراء كل شيء في بيئة Cloud، يمكنك الوصول إلى Cloud Shell ومحرّره من خلال الزر التالي في أعلى يمين الشاشة كما هو موضّح أدناه.

7d732d7bf0deb12e.png

تأكَّد من اختيار مشروعك الجديد في أعلى يمين الصفحة:

لم يتم اختياره (خطأ):

c2ffd36a781b276a.png

المحددة (جيدة):

594563c158f4f590.png

إنشاء نسخة من التطبيق من GitHub

  1. انتقِل إلى التطبيق التجريبي: https://github.com/gdgpescara/app-mod-workshop
  2. انقر على 🍴 الشوكة.
  3. إذا لم يكن لديك حساب github، فستحتاج إلى إنشاء حساب جديد.
  4. عدِّل المحتوى كما تشاء.

734e51bfc29ee5df.png

  1. استنسِخ رمز التطبيق باستخدام git clone https://github.com/<YOUR-GITHUB-USER>/<YOUR-REPO-NAME>
  1. افتح مجلد المشروع المُكرّر باستخدام المحرِّر المفضّل لديك. إذا اخترت Cloud Shell، يمكنك إجراء ذلك من خلال النقر على "فتح المحرِّر" كما هو موضّح أدناه.

40f5977ea4c1d1cb.png

يتوفّر لديك كل ما تحتاجه باستخدام محرِّر Google Cloud Shell كما هو موضّح في الشكل التالي.

a4e5ffb3e9a35e84.png

3- الوحدة 1: إنشاء مثيل SQL

645902e511a432a6.png

إنشاء مثيل Google Cloud SQL

سيتصل تطبيق PHP بقاعدة بيانات MySQL، لذا نحتاج إلى تكراره على Google Cloud لنقل البيانات بسلاسة. إنّ Cloud SQL هي الخيار الأمثل لأنّها تتيح لك تشغيل قاعدة بيانات MySQL مُدارة بالكامل في السحابة الإلكترونية. في ما يلي الخطوات التي يجب اتّباعها:

  1. انتقِل إلى صفحة Cloud SQL: https://console.cloud.google.com/sql/instances
  2. انقر على "إنشاء مثيل"
  3. فعِّل واجهة برمجة التطبيقات (إذا لزم الأمر). قد يستغرق ذلك بضع ثوانٍ.
  4. اختَر MySQL.
  5. (نحاول توفير الإصدار الأقل تكلفة لك، كي يستمر لفترة أطول):
  • الإصدار: Enterprise
  • الإعداد المُسبَق: التطوير (جرّبنا Sandbox ولم ينجح معنا)
  • إصدار Mysql: ‏ 5.7 (يا له من إصدار قديم!)
  1. رقم تعريف المثيل: اختَر appmod-phpapp (إذا غيّرت هذا الخيار، تذكَّر أيضًا تغيير النصوص البرمجية والحلول المستقبلية وفقًا لذلك).
  2. كلمة المرور: أي شيء تريده ولكن مع تدوينها على شكل CLOUDSQL_INSTANCE_password
  3. المنطقة: يجب إبقاءها كما هي في بقية أقسام التطبيق (مثل ميلان = europe-west8).
  4. مدى التوفّر على مستوى منطقة معيّنة: منطقة واحدة (نحن نوفّر المال في العرض التجريبي)

انقر على الزر "إنشاء مثيل" لنشر قاعدة بيانات Cloud SQL. ⌛ يستغرق اكتمال العملية حوالي 10 دقائق⌛. في هذه الأثناء، يمكنك مواصلة قراءة المستندات. يمكنك أيضًا البدء في حلّ المشكلة في الوحدة التالية ("تجميع تطبيق PHP في حاوية") لأنّها لا تعتمد على هذه الوحدة في الجزء الأول (إلى أن يتم إصلاح اتصال قاعدة البيانات).

ملاحظة: من المفترض أن تبلغ تكلفة هذه النسخة حوالي 7 دولار أمريكي في اليوم. احرص على نشرها بعد انتهاء الورشة.

إنشاء قاعدة بيانات image_catalog ومستخدم في Cloud SQL

يتضمّن مشروع التطبيق مجلد db/ يحتوي على ملفي sql:

  1. 01_schema.sql: يحتوي على رمز SQL لإنشاء جدولَين يحتويان على بيانات "المستخدِمين" و"الصور".
  2. 02_seed.sql: يحتوي على رمز SQL لإدخال البيانات في الجداول التي تم إنشاؤها سابقًا.

سيتم استخدام هذه الملفات لاحقًا بعد إنشاء قاعدة بيانات image_catalog. يمكنك إجراء ذلك باتّباع الخطوات التالية:

  1. افتح المثيل وانقر على علامة التبويب "قواعد البيانات":
  2. انقر فوق "إنشاء قاعدة بيانات"
  3. يمكنك تسميته image_catalog (كما هو الحال في إعدادات تطبيق PHP).

997ef853e5ebd857.png

بعد ذلك، ننشئ مستخدم قاعدة البيانات. باستخدام ذلك، يمكننا المصادقة على قاعدة بيانات image_catalog (الكتالوج).

  1. انقر الآن على علامة التبويب المستخدمون
  2. انقر على "إضافة حساب مستخدم".
  3. المستخدم: لننشئ حسابًا:
  • اسم المستخدم: appmod-phpapp-user
  • كلمة المرور: اختر شيئًا يمكنك تذكّره أو انقر على "إنشاء"
  • احتفظ بالإعداد "السماح لأي مضيف (%)".
  1. انقر على "إضافة".

فتح قاعدة البيانات على عناوين IP معروفة

تجدر الإشارة إلى أنّ جميع قواعد البيانات في Cloud SQL تكون "معزولة" عند إنشائها. تحتاج إلى إعداد شبكة لإتاحة الوصول إليها بشكل صريح.

  1. انقر على المثيل.
  2. افتح القائمة "الاتصالات".
  3. انقر على علامة التبويب "الشبكات".
  4. انقر على "الشبكات المعتمَدة". أضِف الآن شبكة فرعية.
  • في الوقت الحالي، لننتقل إلى وضع "غير آمن" للسماح للتطبيق بالعمل:
  • الاسم: "كل شخص في العالم - غير آمن" (دعنا نذكر أنفسنا بهذا الحل منخفض التكلفة وهو أيضًا غير آمن).
  • الشبكة: "0.0.0.0/0" (ملاحظة: هذه الشبكة غير آمنة)

انقر على "حفظ".

ينبغي أن تظهر لك على النحو التالي:

5ccb9062a7071964.png

ملاحظة: يشكّل هذا الحلّ حلًا وسطًا جيدًا لإنهاء الورشة في O(ساعات). ومع ذلك، يُرجى الاطّلاع على مستند الأمان للمساعدة في تأمين حلّك للإصدار العلني.

حان الوقت لاختبار اتصال قاعدة البيانات.

لنرى ما إذا كان حساب المستخدِم image_catalog الذي أنشأناه سابقًا يعمل. يمكنك الوصول إلى Cloud SQL Studio داخل المثيل وإدخال قاعدة البيانات والمستخدم وكلمة المرور المطلوب مصادقةهما كما هو موضّح أدناه:

d56765c6154c11a4.png

الآن بعد أن أصبحت فيها، يمكنك فتح محرر SQL (لغة الاستعلام البنيوية) والانتقال إلى القسم التالي.

استيراد قاعدة البيانات من قاعدة البيانات

استخدم محرر SQL لاستيراد جداول image_catalog ببياناتها. استخرِج رمز SQL من ملفات SQL في المستودع وأدخِله واحدًا تلو الآخر بترتيب تسلسلي. 01_schema.sql ثم 02_seed.sql.

بعد ذلك، من المفترض أن يظهر لك جدولان في image_catalog، وهما users وimages كما هو موضّح أدناه:

65ba01e4c6c2dac0.png

يمكنك اختبار الميزة من خلال تنفيذ ما يلي في المحرِّر: select * from images;

احرص أيضًا على تدوين عنوان IP العلني، لأنّك ستحتاج إليه لاحقًا.

4. الوحدة 2: إنشاء حاوية لتطبيق PHP

e7f0e9979d8805f5.png

نريد إنشاء هذا التطبيق للسحابة الإلكترونية.

ويعني ذلك تجميع الرمز في ملف ZIP يحتوي على كل المعلومات اللازمة لتشغيله في السحابة الإلكترونية.

هناك بضع طرق لحزمة التطبيق:

  • Docker: رائج جدًا، ولكنّه من الصعب إعداده بشكل صحيح.
  • حِزم الإصدار: هذه الطريقة أقل شيوعًا، ولكنها تميل إلى "التخمين التلقائي" لما يجب إنشاؤه وتشغيله. غالبًا ما تنجح هذه الخطوات في حل المشكلة!

في سياق هذه الورشة التدريبية، سنفترض أنّك تستخدم Docker.

Docker

هذا هو الحلّ المناسب لك إذا أردت التحكّم في بياناتك. يكون هذا الإجراء منطقيًا عندما تحتاج إلى ضبط مكتبات معيّنة وإدخال سلوكيات معيّنة غير واضحة (مثل chmod في عمليات التحميل أو ملف تنفيذي غير عادي في تطبيقك).

بما أنّنا نريد في النهاية نشر تطبيقنا المُنشئ باستخدام حاويات على Cloud Run، يُرجى الاطّلاع على المستندات التالية ومحاولة ملء الفراغات. نقدّم العناصر الضرورية فقط لتسهيل الأمور في الوقت الحالي. سيبدو ملف Dockerfile النهائي على النحو التالي:

# Use an official PHP image with Apache
# Pull a suitable php image
FROM __________# Define the env variable for the Apache listening port 8080
ENV __________

# Set working directory inside the container
WORKDIR __________

# Install required PHP extensions: PDO, MySQL, and other dependencies
RUN __________

# Copy all application files into the container
COPY __________

# Configure Apache to listen on port 8080. Use ‘sed' command to change the default listening port.
RUN __________

# When in doubt, always expose to port 8080
EXPOSE __________

# Start Apache in the foreground
CMD __________

بالإضافة إلى ذلك، لاختبار تطبيقنا على الجهاز، علينا تغيير ملف config.php بطريقة تسمح لتطبيق PHP بالاتصال بقاعدة بيانات MYSQL المتاحة على Google CloudSQL. استنادًا إلى ما سبق لك إعداده، املأ الفراغات.

  • Db_host هو عنوان IP العلني لخدمة Cloud SQL، ويمكنك العثور عليه في وحدة التحكّم:

bd27071bf450a8d0.png

  • يجب ألا يتغيّر اسم قاعدة البيانات: image_catalog
  • يجب أن يكون مستخدم قاعدة البيانات appmod-phpapp-user.
  • Db_pass هو اسم اخترته. اضبطها بين علامتَي اقتباس مفردتَين واستخدم علامة الهروب حسب الحاجة.
<?php
// Database configuration
$db_host = '____________';
$db_name = '____________';
$db_user = '____________';
$db_pass = '____________';

try {
    $pdo = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die("Errore di connessione: " . $e->getMessage());
}

session_start();
?>

يمكنك أيضًا ترجمة بعض المقاطع الإيطالية إلى الإنجليزية باستخدام Gemini.

حسنًا، الآن بعد أن حصلت على Dockerfile وضبطت تطبيق PHP للاتصال بقاعدة البيانات، لنختبر ذلك.

ثبِّت Docker إذا لم يكن مثبّتًا بعد (الرابط). لن تحتاج إلى ذلك إذا كنت تستخدم Cloud Shell (هل هذا رائع؟).

حاوِل الآن إنشاء تطبيق PHP المستند إلى حاويات وتشغيله باستخدام أوامر docker build وrun المناسبة.

  • Docker Build -t <IMAGE_TAG_NAME> .
  • docker run -it -p <CONTAINER PORT>:<LOCAL MACHINE PORT> <IMAGE_TAG_NAME>

إذا كان كل شيء يعمل، فمن المفترض أن تتمكن من عرض صفحة الويب التالية عند الاتصال بالمضيف المحلي.

إذا كنت تستخدم Cloud Shell، يمكنك أيضًا تصدير المنفذ المحلي (مثل 8080) إلى المتصفّح، على النحو التالي:

docker build -t my-php-app-docker app-mod-workshop/ -f Dockerfile

Docker run -it -p 8080:8080 my-php-app-docker

بما أنّك الآن تعرف أنّ تطبيقك يعمل على المنفذ 8080، انقر على رمز "معاينة الويب" (متصفّح مع عين) ثم على معاينة على المنفذ 8080 (أو "تغيير المنفذ" لأي منفذ آخر).

33a24673f4550454.png

اختبار النتيجة في المتصفّح

من المفترض أن يظهر تطبيقك الآن على النحو التالي:

2718ece96b1f18b6.png

وإذا سجّلت الدخول باستخدام المشرف/admin123، من المفترض أن يظهر لك ما يلي:

68b62048c2e86aea.png

رائع. يعمل بشكل جيد 🎉🎉🎉

إذا كانت عملية إنشاء الحِزم باستخدام Docker ناجحة ولكنّ بيانات اعتماد قاعدة البيانات غير صحيحة، قد تظهر لك رسالة مثل هذه:

e22f45b79bab86e1.png

يُرجى إعادة المحاولة، فأنت قريب من اللفظ الصحيح.

حِزم الإنشاء [اختيارية]

باستخدام حِزم Buildpacks، يتم إنشاء التطبيق تلقائيًا. لا يمكنك التحكّم بشكل كامل في الإعدادات، لذا قد تنتهي بإعدادات غير متوقّعة.

من المفترض أن تكون لديك صورة جديدة في Docker في بيئتك المحلية. يمكنك محاولة تشغيل حاوية له، ولكن قد لا يعمل التطبيق لأنّنا لا نتحكّم بشكل كامل في كيفية إنشاء الصورة. في كل الأحوال، ندعوك إلى تجربة هذه الميزة ومشاركة رأيك في حال نجاحها. مع أطيب التحيّات.

الحفظ في Artifact Registry [اختياري]

من المفترض أن يكون لديك الآن تطبيق PHP مُحصور في حاوية وجاهز للنشر على السحابة الإلكترونية. بعد ذلك، نحتاج إلى مساحة في السحابة الإلكترونية لتخزين صورة Docker وجعلها متاحة للنشر في خدمات Google Cloud، مثل Cloud Run. يُعرف حلّ التخزين هذا باسم Artifact Registry، وهو خدمة مُدارة بالكامل من Google Cloud مصمّمة لتخزين عناصر التطبيقات، بما في ذلك صور حاويات Docker وحِزم Maven ووحدات npm والمزيد.

لننشئ مستودعًا في Google Cloud Artifact Registry باستخدام الزر المناسب.

e1123f0c924022e6.png

اختَر اسمًا صالحًا وتنسيقًا ومنطقة مناسبةً لتخزين العناصر.

4e516ed209c470ee.png

ارجع إلى علامة بيئة التطوير المحلية وانشر صورة حاوية التطبيق إلى مستودع Artifact Registry الذي تم إنشاؤه للتو. أكمِل الأوامر التالية لإجراء ذلك.

  • علامة Docker SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
  • دفعة مزيفة TARGET_IMAGE[:TAG]

من المفترض أن تظهر النتيجة كما هو موضّح في لقطة الشاشة التالية.

1e498feb4e88be9f.png

🎉🎉🎉 مبروك، يمكنك الانتقال إلى المستوى التالي.

ملاحظة: جرِّب أيضًا نقطة النهاية /upload.php وحاول تحميل صورة. قد تظهر لك رسالة "تم رفض الإذن". إذا كان الأمر كذلك، عليك إصلاح بعض chmod/chown في Dockerfile.

5- الوحدة 3: نشر التطبيق على Cloud Run

9ffca42774f6c5d1.png

لماذا Cloud Run؟

سؤال وجيه. قبل سنوات، كان من المؤكد أنّك اخترت Google App Engine.

ببساطة، يوفر Cloud Run اليوم حزمة تقنية أحدث، وهو أسهل في النشر وأقل تكلفة ويتقلّص إلى 0 في حال عدم استخدامه. وبفضل مرونتها في تشغيل أي حاوية لا تعتمد على الحالة ودمجها مع خدمات Google Cloud المختلفة، فإنّها مثالية لنشر الخدمات المصغرة والتطبيقات الحديثة بأقل قدر من التكاليف الإضافية وبأعلى كفاءة.

وبشكل أكثر تحديدًا، Cloud Run هو نظام أساسي مُدار بالكامل من خلال Google Cloud ويتيح لك تشغيل تطبيقات حاويتة بدون حالة في بيئة بلا خادم. وتتعامل هذه الخدمة تلقائيًا مع جميع البنية الأساسية، وتوسّع نطاقها من الصفر لتلبية الزيارات الواردة وتخفضه عندما تكون غير نشطة، ما يجعلها فعّالة وموفّرة من حيث التكلفة. تتيح لك خدمة Cloud Run استخدام أي لغة أو مكتبة طالما أنّها مُجمَّعة في حاوية، ما يسمح لك بالاستفادة من مرونة كبيرة في عملية التطوير. ويمكن دمجها بشكل جيد مع خدمات Google Cloud الأخرى، وهي مناسبة لإنشاء الخدمات الدقيقة وواجهات برمجة التطبيقات والمواقع الإلكترونية والتطبيقات المستندة إلى الأحداث بدون الحاجة إلى إدارة البنية الأساسية للخادم.

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

لإكمال هذه المهمة، يجب أن يكون gcloud مثبّتًا على جهازك. إذا لم يكن الأمر كذلك، يمكنك الاطّلاع على التعليمات هنا. بدلاً من ذلك، إذا كنت تستخدم Google Cloud Shell، ما مِن إجراءات يجب اتّخاذها.

قبل النشر...

إذا كنت تعمل في بيئتك المحلية، يمكنك المصادقة على Google Cloud باستخدام ما يلي:

  • $ gcloud auth login –update-adc # not needed in Cloud Shell

من المفترض أن تتم مصادقة حسابك من خلال تسجيل الدخول إلى OAuth على المتصفّح. تأكَّد من تسجيل الدخول من خلال Chrome باستخدام المستخدم نفسه (مثل vattelapesca@gmail.com) الذي سجَّل الدخول إلى Google Cloud مع تفعيل الفوترة.

تفعيل Cloud Run API باستخدام الأمر التالي

  • $ gcloud services enable run.googleapis.com

في هذه المرحلة، يكون كل شيء جاهزًا للنشر على Cloud Run.

نشر تطبيقك على Cloud Run باستخدام gcloud

الأمر الذي يتيح لك نشر التطبيق على Cloud Run هو gcloud run deploy. هناك عدّة خيارات يجب ضبطها لتحقيق هدفك. في ما يلي الحد الأدنى من الإعدادات:

  1. اسم خدمة تشغيل السحابة الإلكترونية التي تريد نشرها للتطبيق، وسترجع إليك "خدمة تشغيل السحابة الإلكترونية" عنوان URL الذي يوفّر نقطة نهاية لتطبيقك.
  2. منطقة Google Cloud التي سيتم تشغيل تطبيقك فيها
  3. صورة الحاوية التي تُغلِّف تطبيقك
  4. متغيّرات البيئة التي يحتاج تطبيقك إلى استخدامها أثناء تنفيذه
  5. علامة السماح بعدم المصادقة التي تسمح لجميع المستخدمين بالوصول إلى تطبيقك بدون مصادقة إضافية

يمكنك الرجوع إلى الوثائق لمعرفة كيفية تطبيق هذا الخيار على الأمر. ستستغرق عملية النشر بضع دقائق. إذا كانت كل المعلومات صحيحة، من المفترض أن تظهر لك رسالة مشابهة في Google Cloud Console.

ef1029fb62f8de81.png

f7191d579c21ca3e.png

انقر على عنوان URL الذي تقدّمه خدمة Cloud Run واختبر تطبيقك. بعد المصادقة، من المفترض أن تظهر لك رسالة مماثلة.

d571a90cd5a373f9.png

"gcloud run click" (النشر بدون أسئلة)

ربما لاحظت أنّ gcloud run deploy يطرح عليك الأسئلة المناسبة ويملؤك الفراغات التي تركتها. هذا مدهش.

ومع ذلك، سنضيف هذا الأمر في بعض الوحدات إلى مشغّل Cloud Build كي لا نتمكّن من الإجابة عن الأسئلة. علينا ملء كل خيار في الأمر. لذا عليك صياغة gcloud run deploy --option1 blah --foo bar --region your-fav-region الذهبي. كيف تنفّذ ذلك؟

  1. كرِّر الخطوات من 2 إلى 3 إلى 4 إلى أن يتوقف gcloud عن طرح الأسئلة:
  2. [LOOP] gcloud run deploy مع الخيارات التي تم العثور عليها حتى الآن
  3. أنظمة [LOOP] تطلب الخيار X
  4. [LOOP] البحث في المستندات العامة عن كيفية إعداد X من واجهة سطر الأوامر (CLI) إضافة الخيار --my-option [my-value].
  5. الرجوع إلى الخطوة 2 الآن، ما لم تكتمل gcloud بدون أسئلة إضافية
  6. هذا الأمر gcloud run deploy BLAH BLAH BLAH رائع. احفظ الأمر في مكان ما، ستحتاج إليه لاحقًا في خطوة Cloud Build.

يمكنك الاطّلاع على حلّ محتمل هنا.

تهانينا 🎉🎉🎉 لقد تم نشر تطبيقك بنجاح في Google Cloud وتحقيق الخطوة الأولى في عملية التحديث.

6- الوحدة النمطية 4: تنظيف كلمة المرور باستخدام المدير السري

95cd57b03b4e3c73.png

في الخطوة السابقة، تمكنّا من نشر تطبيقنا وتشغيله بنجاح في Cloud Run. مع ذلك، نفّذنا ذلك باستخدام ممارسة سيئة متعلقة بالأمان، وهي توفير بعض الأسرار بنص واضح.

النسخة الأولى: تعديل ملف config.php لاستخدام ENV

ربما لاحظت أنّنا وضعنا كلمة مرور قاعدة البيانات مباشرةً في الرمز البرمجي في ملف config.php. هذا أمر جيد لأغراض الاختبار ولمعرفة ما إذا كان التطبيق يعمل. ولكن لا يمكنك استخدام هذا الرمز أو إرساله في بيئة الإنتاج. يجب قراءة كلمة المرور (ومَعلمات الاتصال بقاعدة البيانات الأخرى) بشكل ديناميكي وتقديمها إلى التطبيق في وقت التشغيل. غيِّر ملف config.php لكي يقرأ مَعلمات قاعدة البيانات من متغيّرات ENV. في حال تعذّر ذلك، ننصحك بضبط القيم التلقائية. هذا أمر جيد في حال تعذّر تحميل ENV، لذا ستخبرك مخرجات الصفحة ما إذا كانت تستخدِم القيم التلقائية. املأ الفراغات واستبدِل الرمز في config.php.

<?php
// Database configuration with ENV variables. Set default values as well 
$db_host = getenv('DB_HOST') ?: _______;
$db_name = getenv('DB_NAME') ?: 'image_catalog';
$db_user = getenv('DB_USER') ?: 'appmod-phpapp-user';
$db_pass = getenv('DB_PASS') ?: _______;
// Note getenv() is PHP 5.3 compatible
try {
    $pdo = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die("Errore di connessione: " . $e->getMessage());
}

session_start();
?>

بما أنّ تطبيقك مُضمّن في حاويات، عليك توفير طريقة لتزويد التطبيق بمتغيّرات ENV، ويمكن إجراء ذلك ببضع طرق:

  • في وقت الإنشاء، في الملف الشامل. أضِف إلى ملف Dockerfile السابق المَعلمات الأربع باستخدام البنية ENV DB_VAR=ENV_VAR_VALUE. سيؤدي هذا إلى إعداد القيم التلقائية التي يمكن تجاوزها في وقت التشغيل. على سبيل المثال، يمكن تعيين "DB_NAME" و"DB_USER" هنا وليس في أي مكان آخر.
  • في وقت التشغيل يمكنك إعداد هذه المتغيّرات لخدمة Cloud Run، سواء من واجهة سطر الأوامر أو من واجهة المستخدم. هذا هو المكان المناسب لوضع جميع المتغيّرات الأربعة (ما لم تكن تريد الاحتفاظ بالإعدادات التلقائية المحدّدة في Dockerfile).

في المضيف المحلي، قد ترغب في وضع متغيرات ENV في ملف .env (راجع مجلد الحلول).

تأكَّد أيضًا من إضافة ‎.env إلى .gitignore : لا تريد دفع أسرارك إلى Github.

echo .env >> .gitignore

بعد ذلك، يمكنك اختبار المثيل محليًا:

docker run -it -p 8080:8080 --env-file .env my-php-app-docker

لقد حقّقت الآن ما يلي:

  1. سيقرأ تطبيقك المتغيّر ديناميكيًا من بيئة التشغيل.
  2. لقد تحسّنت أمان التطبيق بعد إزالة كلمة مرور قاعدة البيانات من الرمز البرمجي.)

يمكنك الآن نشر إصدار جديد على Cloud Run. لننتقل إلى واجهة المستخدم ونضبط متغيّرات البيئة يدويًا:

  • انتقِل إلى https://console.cloud.google.com/run.
  • انقر على تطبيقك.
  • انقر على "تعديل إصدار جديد ونشره".
  • في علامة التبويب الأولى "الحاويات"، انقر على علامة التبويب السفلية "المتغيّرات والأسرار".
  • انقر على "+ إضافة متغيّر" وأضِف جميع المتغيّرات المطلوبة. من المفترض أن يظهر لك الجدول التالي:

7a5fbfa448544d3.png

f2780c35585388ca.png

هل هذا مناسب؟ لا، لا يزال PASS مرئيًا لمعظم مشغّلي الشبكات. ويمكن التخفيف من تأثير ذلك باستخدام أداة Google Cloud Secret Manager.

الإصدار الثاني: أداة إدارة الأسرار

اختفت كلمات المرور من الرمز الذي أنشأته بنفسك، ما يعني أنّك نجحت في إزالة كلمات المرور من الرمز. هل تم حلّ المشكلة؟

ستظل كلمات المرور مرئية لأي مستخدم لديه إذن الوصول إلى Google Cloud Console. في الواقع، إذا وصلت إلى ملف نشر YAML في Cloud Run، ستتمكّن من استرجاعه. أو إذا حاولت تعديل أو نشر إصدار جديد من Cloud Run، ستظهر كلمة المرور في قسم "المتغيّرات والأسرار" كما هو موضّح في لقطات الشاشة أدناه.

Google Cloud Secret Manager هو خدمة آمنة ومركزية لإدارة المعلومات الحسّاسة، مثل مفاتيح واجهة برمجة التطبيقات وكلمات المرور والشهادات وغيرها من المفاتيح السرّية.

ويتيح لك تخزين الأسرار وإدارتها والوصول إليها باستخدام أذونات دقيقة وتشفير قوي. إنّ أداة Secret Manager مدمجة مع خدمة "إدارة الهوية والوصول" (IAM) في Google Cloud، ما يتيح لك التحكّم في المستخدمين الذين يمكنهم الوصول إلى أسرار معيّنة، ما يضمن أمان البيانات والامتثال التنظيمي.

وتتيح هذه الخدمة أيضًا ميزة تدوير الأسرار وإنشاء الإصدارات منها تلقائيًا، ما يسهّل إدارة دورة حياة الأسرار ويعزّز الأمان في التطبيقات على مستوى خدمات Google Cloud.

للوصول إلى مدير الأسرار، انتقِل من قائمة قائمة المهام إلى خدمات الأمان وابحث عنه ضمن قسم حماية البيانات كما هو موضّح في لقطة الشاشة أدناه.

6df83a1c3cb757f6.png

يمكنك تفعيل Secret Manager API بعد انتقالك إليها وفقًا للصورة التالية.

a96c312e2c098db1.png

  • انقر الآن على "إنشاء سر": لنسمّه منطقيًا:
  • الاسم: php-amarcord-db-pass
  • القيمة السرية: "كلمة مرور قاعدة البيانات" (تجاهل الجزء "تحميل الملف").
  • أضِف تعليقًا توضيحيًا إلى هذا الرابط السري، ومن المفترض أن يبدو كالتالي: projects/123456789012/secrets/php-amarcord-db-pass. هذا هو المؤشر الفريد للقيمة السرية (لنظام Terraform وCloud Run وغيرها). الرقم هو رقم مشروعك الفريد.

ملاحظة: حاوِل استخدام اصطلاحات تسمية متّسقة للسرّ، مع تخصيصها من اليمين إلى اليسار، على سبيل المثال: cloud-devrel-phpamarcord-dbpass

  • المؤسسة (مع الشركة)
  • الفريق (داخل المؤسسة)
  • الطلب (داخل الفريق)
  • اسم المتغيّر (داخل التطبيق)

سيتيح لك ذلك استخدام التعبيرات العادية السهلة للعثور على جميع أسرارك لتطبيق واحد.

إنشاء نسخة جديدة من تطبيق Cloud Run

الآن بعد أن أصبح لدينا مفتاح سرّي جديد، علينا التخلص من متغير ENV DB_PASS واستبداله بالمفتاح السري الجديد. وبالتالي:

  • الوصول إلى Cloud Run باستخدام Google Cloud Console
  • اختَر التطبيق.
  • انقر على "تحرير نسخة جديدة ونشرها"
  • ابحث عن علامة التبويب "المتغيّرات والمفاتيح السرية".
  • استخدِم الزر "+ الإشارة إلى سرّ" لإعادة ضبط متغيّر DB_PASS ENV.
  • استخدم نفس "DB_PASS" للمفاتيح السرية المشار إليها واستخدم أحدث إصدار.

9ed4e35be7654dcb.png

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

da0ccd7af39b04ed.png

نحاول معرفة كيفية حلّ هذه المشكلة. لحلّ هذه المشكلة، عليك الوصول إلى قسم إدارة الهوية وإمكانية الوصول والمشرف وتغيير أذونات المنح. مع أطيب التحيّات،

بعد تحديد المشكلة، يمكنك العودة إلى Cloud Run وإعادة نشر إصدار جديد. من المفترض أن تظهر النتيجة بالشكل التالي:

e89f9ca780169b6b.png

نصيحة: تُعد واجهة المستخدم (UI) رائعة في الإشارة إلى المشاكل في الأذونات. ننصحك بالتنقل في جميع روابط كيانات Cloud.

7- الوحدة 5: إعداد عملية التطوير/النشر المتكاملَين باستخدام Cloud Build

ba49b033c11be94c.png

ما أسباب اختيار مسار الإحالات الناجحة خارج إطار الإنترنت/CD؟

من المفترض أن تكون قد كتبت gcloud run deploy عدة مرات، ربما للإجابة عن السؤال نفسه مرارًا وتكرارًا.

هل سئمت من نشر تطبيقك يدويًا باستخدام ميزة gcloud run؟ ألا تعتقد أنّه من الرائع أن يتم نشر تطبيقك تلقائيًا في كل مرة تُرسل فيها تغييرًا جديدًا إلى مستودع Git؟

لاستخدام مسار إحالة الإصدارات إلى الإصدار العلني/النشر الدائم، ستحتاج إلى شيئَين:

  1. مستودع Git شخصي: لحسن الحظ، من المفترض أن تكون قد أنشأت نسخة من مستودع ورشة العمل في حسابك على GitHub في الخطوة 2. إذا لم يكن كذلك، فارجع وأكمل هذه الخطوة. يجب أن يظهر المستودع المتشعّب على النحو التالي: https://github.com/<YOUR_GITHUB_USER>/app-mod-workshop
  2. Cloud Build تتيح لك هذه الخدمة الرائعة والرخيصة ضبط عمليات التشغيل الآلي للإنشاءات لكل شيء تقريبًا: Terraform والتطبيقات المستندة إلى Docker وغير ذلك.

سيركز هذا القسم على إعداد Cloud Build.

الانضمام إلى Cloud Build

سنستخدم Cloud Build لتنفيذ ذلك:

  • أنشئ المصدر (باستخدام Dockerfile). فكر في هذا على أنه "ملف .zip كبير" يحتوي على كل ما تحتاجه لإنشائه وتشغيله ("إنشاء عنصر").
  • ادفع هذا العنصر إلى Artifact Registry (AR).
  • بعد ذلك، عليك إصدار أمر نشر من AR إلى Cloud Run للتطبيق "php-amarcord".
  • سيؤدي ذلك إلى إنشاء إصدار جديد ("مراجعة") من التطبيق الحالي (تخيّل طبقة تحتوي على الرمز الجديد) وسنضبطه لتحويل الزيارات إلى الإصدار الجديد في حال نجاح عملية الدفع.

في ما يلي مثال على بعض الإصدارات لتطبيقي php-amarcord:

f30f42d4571ad5e2.png

كيف ننفّذ كل ذلك؟

  1. من خلال إنشاء ملف YAML واحد مثالي: cloudbuild.yaml
  2. من خلال إنشاء مشغِّل Cloud Build.
  3. من خلال الاتصال بـ github repo من خلال واجهة مستخدم Cloud Build

إنشاء عامل تشغيل (و"مستودع Connect")

  • انتقِل إلى https://console.cloud.google.com/cloud-build/triggers
  • انقر على "إنشاء عامل تشغيل".
  • تجميع:
  • الاسم: شيء ذو معنى مثل on-git-commit-build-php-app
  • الحدث: الدفع إلى فرع
  • المصدر: "ربط مستودع جديد" نص بديل
  • سيؤدي ذلك إلى فتح نافذة على اليسار: "ربط المستودع"
  • موفّر المصدر: "Github" (الأول)
  • "متابعة"
  • سيفتح Authenticate نافذة على github للمصادقة المتبادلة. اتّبِع الخطوات وانتظر بصبر. إذا كان لديك العديد من المستودعات، قد يستغرق الأمر بعض الوقت.
  • "اختيار المستودع": اختَر حسابك/مستودعك وضع علامة في المربّع بجانب "أقرّ بذلك...".
  • إذا ظهر لك الخطأ: لم يتم تثبيت تطبيق GitHub على أي من مستودعاتك، يُرجى النقر على "تثبيت Google Cloud Build" واتّباع التعليمات.
  • 23e0e0f1219afea3.pngانقر على "ربط".
  • bafd904ec07122d2.png
  • هكذا! تم ربط مستودعك الآن.
  • لنعود إلى جزء "العامل المشغِّل"....
  • الإعداد: يتم رصده تلقائيًا (*)
  • خيارات متقدّمة: اختَر حساب الخدمة "[PROJECT_NUMBER]- compute@developer.gserviceaccount.com".
  • xxxxx هو معرّف مشروعك.
  • إنّ حساب الخدمة التلقائي لوحدة الحساب مناسب لنهج المختبر، ولكن لا تستخدِمه في الإنتاج. ( مزيد من المعلومات)
  • اترك كل الإعدادات الأخرى كما هي.
  • انقر على الزر "إنشاء".

(*) هذه هي الطريقة الأسهل لأنّها تتحقّق من Dockerfile أو cloudbuild.yaml. ومع ذلك، يمنحك الرمز cloudbuild.yaml قدرة حقيقية على تحديد الإجراء الذي يجب اتّخاذه في كل خطوة.

لقد استمتِعنا بالقوة

لن يعمل المشغِّل الآن ما لم تمنح حساب خدمة Cloud Build (ما هو حساب الخدمة؟ هو البريد الإلكتروني لـ "الروبوت" الذي يتصرف نيابةً عنك في مهمة، وهو في هذه الحالة إنشاء أشياء في السحابة!).

لن يتمكّن مشرف الحسابات من إنشاء التطبيق ونشره ما لم تمنحه الإذن بذلك. لحسن الحظ، الأمر سهل.

  • انتقِل إلى "Cloud Build" > " الإعدادات".
  • حساب الخدمة "[PROJECT_NUMBER]- compute@developer.gserviceaccount.com"
  • ضع علامة في هذه المربعات:
  • Cloud Run
  • Secret Manager
  • حسابات الخدمة
  • Cloud Build
  • ضَع علامة أيضًا في المربّع "ضبط كحساب الخدمة المفضَّل".

8715acca72286a46.png

أين ملف YAML في Cloud Build؟

ننصحك بشدة بقضاء بعض الوقت في إنشاء ملف YAML الخاص ببناء السحابة الإلكترونية.

إذا لم يكن لديك الوقت أو لم تكن تريد تخصيص الوقت لذلك، يمكنك الحصول على بعض الإلهام من مجلد الحلول هذا: .solutions

يمكنك الآن دفع تغيير إلى github ومراقبة Cloud Build من جهته.

قد يكون إعداد Cloud Build صعبًا. من المتوقّع أن تتلقّى ردودًا من خلال:

  • التحقّق من السجلات في https://console.cloud.google.com/cloud-build/builds;region=global
  • العثور على الخطأ
  • يتم إصلاح الخطأ في الرمز البرمجي، وإعادة إصدار git commit / git push.
  • في بعض الأحيان لا يكون الخطأ في الرمز، ولكن في بعض التهيئة. في هذه الحالة، يمكنك إصدار إصدار جديد من واجهة المستخدم (إصدار السحابة الإلكترونية > العوامل المشغِّلة > تشغيل).

97acd16980a144ab.png

يُرجى العِلم أنّه في حال استخدام هذا الحل، سيظلّ عليك تنفيذ بعض الإجراءات. على سبيل المثال، عليك ضبط متغيّرات ENV لنقاط نهاية dev/prod التي تم إنشاؤها حديثًا:

3da8723e4ff80c0a.png

هناك طريقتان لإجراء ذلك:

  • من خلال واجهة المستخدم: من خلال إعادة ضبط متغيّرات ENV
  • من خلال CLI من خلال إنشاء نص برمجي "مثالي" لك. يمكنك العثور على مثال هنا: gcloud-run-deploy.sh . عليك تعديل بعض الإعدادات، مثل نقطة النهاية ورقم المشروع. يمكنك العثور على رقم مشروعك في نظرة عامة على Cloud.

كيف يمكنني إرسال الرمز إلى GitHub؟

لا يشمل نطاق هذه الورشة التدريبية تعليمك أفضل طريقة لنقل git push إلى github. في حال مواجهة مشكلة وكنت تستخدم Cloud Shell، يمكنك اتّباع إحدى الطريقتَين التاليتَين:

  1. CLI: أضِف مفتاح ssh محليًا وأضِف جهاز كمبيوتر بعيدًا باستخدام git@github.com:YOUR_USER/app-mod-workshop.git (بدلاً من http).
  2. VSCode: إذا كنت تستخدم محرر Cloud Shell، يمكنك استخدام علامة التبويب "التحكم في المصدر" (ctrl-shift-G) والنقر على "مزامنة التغييرات" واتّباع التعليمات. من المفترض أن تتمكّن من مصادقة حسابك على GitHub في vscode، ويصبح من السهل بعد ذلك سحب/دفع الملفات.

f0d53f839c7fa3b6.png

يُرجى git add clodubuild.yaml بين الملفات الأخرى، وإلا لن تنجح العملية.

مقارنة بين "مطابقة الإصدارات العلنية والإصدارات التجريبية" الكاملة والجزئية [اختياري]

إذا نسخت إصدار النموذج من هنا، سيكون لديك إصداران متطابقان من DEV وPROD. هذا أمر رائع، وهو متوافق مع القاعدة 10 من قواعد تطبيق Twelve-Factor.

ومع ذلك، نستخدم نقطتَي نهاية مختلفتَين على الويب لإنشاء تطبيق يشير إلى قاعدة البيانات نفسها. هذا جيد بما يكفي لورشة عمل؛ ومع ذلك، في الحياة الواقعية، تحتاج إلى قضاء بعض الوقت لإنشاء بيئة إنتاج مناسبة. وهذا يعني توفُّر قاعدتَي بيانات (واحدة للتطوير والأخرى للإصدار العلني) واختيار مكان وضعهما أيضًا لاسترداد البيانات في حالات الكوارث / ضمان مدى التوفّر العالي. يتجاوز ذلك نطاق هذه الورشة، ولكنّه يستحق التأمل.

إذا كان لديك الوقت لإجراء نسخة "مفصّلة" من عملية الإنتاج، يُرجى مراعاة جميع الموارد التي تحتاج إلى نسخها، مثل:

  • قاعدة بيانات Cloud SQL (وربما مثيل SQL)
  • حزمة GCS
  • وظيفة السحابة الإلكترونية.
  • يمكنك استخدام Gemini 1.5 Flash كنموذج في مرحلة التطوير (أرخص وأسرع) وGemini 1.5 Pro (أكثر فعالية).

بشكل عام، في كل مرة تُجري فيها تغييرًا على التطبيق، يجب التفكير بشكل نقدي: هل يجب أن تتضمّن قناة الإصدار العلني القيمة نفسها أم لا؟ وإذا لم يكن الأمر كذلك، يمكنك تكرار الجهد المبذول. من السهل جدًا إجراء ذلك باستخدام Terraform، حيث يمكنك إدخال بيئتك (-dev، -prod) كلاحقة لمواردك.

8. الوحدة 6: نقل البيانات إلى Google Cloud Storage

a680e0f287dd2dfb.png

مساحة التخزين

يخزِّن التطبيق حاليًا الحالة في حاوية docker. في حالة تعطل الجهاز، أو انفجار التطبيق، أو ببساطة عند دفع نسخة جديدة من الإصدار الجديد، ستتم جدولة نسخة جديدة، مع وحدة تخزين تمت إعادة تعيينها (=>فارغة). أيضا

كيف يمكننا حلّ هذه المشكلة؟ هناك عدد من الطرق.

  1. تخزين الصور في قاعدة البيانات هذا ما انتهى به الأمر باستخدام تطبيق PHP السابق. إنه أبسط حل لأنه لا يضيف تعقيدًا إليه. ولكنّ ذلك يضيف وقت استجابة وحملًا إلى قاعدة بياناتك بالتأكيد.
  2. هل يمكنك نقل تطبيقك على Cloud Run إلى حلّ يتوافق مع مساحة التخزين: GCE + قرص دائم؟ هل يمكن أن يكون GKE + مساحة التخزين؟
  3. انتقِل إلى GCS. توفّر Google Cloud Storage أفضل مساحة تخزين في فئتها لخدمات Google Cloud بالكامل، وهي الحل الأكثر شيوعًا في السحابة الإلكترونية. ومع ذلك، يتطلب الأمر منا تصحيح البيانات باستخدام مكتبات PHP. هل لدينا مكتبات PHP 5.7 لخدمة GCS؟ هل يتوافق PHP 5.7 مع Composer (يبدو أنّ PHP 5.3.2 هو أقدم إصدار متوافق مع Composer)؟
  4. هل يمكنك استخدام docker sidecar؟
  5. أو يمكنك استخدام عمليات ربط وحدة تخزين Cloud Run في GCS. يبدو هذا رائعًا.

🤔 نقل مساحة التخزين (مفتوح)

[مفتوح] في هذا التمرين، نريد منك العثور على حلّ لنقل صورك بطريقة تحافظ على ثباتها.

اختبار القبول

لا أريد إخبارك بالحل، ولكن أريد حدوث ذلك:

  1. تحمّل newpic.jpg. سيظهر لك ذلك في التطبيق.
  2. ترقية التطبيق إلى إصدار جديد
  3. لا يزال newpic.jpg متوفّرًا ومرئيًا.

💡 الحل المحتمل (عمليات تثبيت الحجم في Cloud Run GCS)

يتيح لنا ذلك إتمام عمليات تحميل الملفات بشكل رسمي مع عدم لمس الرمز على الإطلاق (بصرف النظر عن عرض وصف الصورة، ولكنه أمر تافه ويهدف إلى إرضاء العين فقط).

من المفترض أن يسمح لك ذلك بربط مجلد من Cloud Run بـ GCS، وذلك على النحو التالي:

  1. ستظهر جميع عمليات التحميل إلى GCS في تطبيقك.
  2. سيتم تحميل جميع الملفات التي تحمّلها إلى تطبيقك إلى GCS.
  3. ستتم معالجة العناصر التي تم تحميلها في GCS (الفصل 7).

ملاحظة: يُرجى قراءة أحكام FUSE الدقيقة. لا يُعدّ ذلك أمرًا جيدًا إذا كانت هناك مشكلة في الأداء.

إنشاء حزمة GCS

‫GCS هي خدمة التخزين الشاملة في Google Cloud. وقد تم اختباره على نطاق واسع، ويتم استخدامه من قِبل كل خدمة من خدمات Google Cloud Platform التي تحتاج إلى مساحة تخزين.

تجدر الإشارة إلى أنّ تصدير Cloud Shell PROJECT_ID باسم GOOGLE_CLOUD_PROJECT:

$ export PROJECT_ID=$GOOGLE_CLOUD_PROJECT

#!/bin/bash

set -euo pipefail

# Your Cloud Run Service Name, eg php-amarcord-dev
SERVICE_NAME='php-amarcord-dev'
BUCKET="${PROJECT_ID}-public-images"
GS_BUCKET="gs://${BUCKET}"

# Create bucket
gsutil mb -l "$GCP_REGION" -p "$PROJECT_ID" "$GS_BUCKET/"

# Copy original pictures there - better if you add an image of YOURS before.
gsutil cp ./uploads/*.png "$GS_BUCKET/"

ضبط Cloud Run لتثبيت الحزمة في المجلد /uploads/

لننتقل الآن إلى الجزء الأنيق. سنُنشئ وحدة تخزين php_uploads ونطلب من Cloud Run تنفيذ قاعدة تثبيت FUSE على MOUNT_PATH (مثل /var/www/html/uploads/):

#!/bin/bash

set -euo pipefail

# .. keep variables from previous script..

# Uploads folder within your docker container.
# Tweak it for your app code.
MOUNT_PATH='/var/www/html/uploads/'

# Inject a volume mount to your GCS bucket in the right folder.
gcloud --project "$PROJECT_ID" beta run services update "$SERVICE_NAME" \
    --region $GCP_REGION \
    --execution-environment gen2 \
    --add-volume=name=php_uploads,type=cloud-storage,bucket="$BUCKET"  \
    --add-volume-mount=volume=php_uploads,mount-path="$MOUNT_PATH"

كرِّر الآن هذه الخطوة لجميع نقاط النهاية التي تريد توجيهها إلى Cloud Storage.

يمكنك أيضًا إجراء ذلك من واجهة المستخدم.

  1. ضمن علامة التبويب "الأحجام"، أنشئ عمليات ربط أحجام تشير إلى حزمة التخزين من النوع "حزمة Cloud Storage"، على سبيل المثال باسم "php_uploads".
  2. ضمن "الحاويات" > "عمليات تثبيت مستوى الصوت"، ثبِّت مستوى الصوت الذي أنشأته للتو على نقطة مستوى الصوت التي يطلبها تطبيقك. ويعتمد ذلك على ملف Docker، ولكن قد يبدو على النحو التالي: var/www/html/uploads/ .

في كلتا الحالتَين، إذا نجحت، من المفترض أن يؤدي تعديل المراجعة الجديدة في Cloud Run إلى ظهور رسالة مشابهة لما يلي:

6c2bb98fc1b0e077.png

اختبِر الآن التطبيق الجديد من خلال تحميل صورة جديدة واحدة إلى نقطة نهاية /upload.php.

يجب أن تظهر الصور بسلاسة على GCS بدون كتابة سطر واحد من PHP:

70032b216afee2d7.png

ما الذي حدث؟

حدث شيء سحري للغاية.

لا يزال تطبيق قديم يتضمّن رمزًا قديمًا يؤدي وظيفته. تتيح لنا الحزمة الجديدة والمطوّرة تخزين جميع الصور في تطبيقنا بشكل مريح في حزمة Cloud Bucket ذات الحالة. يمكنك الآن تحقيق ما تريد:

  • هل تريد إرسال رسالة إلكترونية في كل مرة تصل فيها صورة تتضمّن محتوى "خطير" أو "عُري"؟ يمكنك إجراء ذلك بدون لمس رمز PHP.
  • هل تريد استخدام نموذج Gemini Multimodal في كل مرة يتم فيها إدخال صورة لوصفها، وتحميل قاعدة البيانات مع وصفها؟ ويمكنك إجراء ذلك بدون تعديل رمز PHP. ألا تصدقني؟ واصِل القراءة في الفصل 7.

لقد فتحنا للتو مساحة كبيرة من الفرص هنا.

9. الوحدة 7: تحسين أداء تطبيقك باستخدام Google Gemini

c00425f0ad83b32c.png

لديك الآن تطبيق PHP جديد وحديث ورائع (مثل تطبيق Fiat 126 لعام 2024) يتضمّن مساحة تخزين مستخدَمة في السحابة الإلكترونية.

ما استخداماته؟

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

في الفصل السابق، سمح لنا نموذج الحلّ بتثبيت الصور /uploads/ على GCS، ما أدّى بشكلٍ تلقائي إلى فصل منطق التطبيق عن مساحة تخزين الصور.

يتطلّب منك هذا التمرين تنفيذ ما يلي:

  • أن تكون قد أكملت التمرين في الفصل 6 (التخزين) بنجاح
  • أن يكون لديك حزمة GCS تتضمّن عمليات تحميل الصور، حيث يحمّل المستخدمون الصور على تطبيقك وتتدفق الصور إلى حزمة التخزين

إعداد دالة Cloud (باستخدام Python)

هل تساءلت يومًا عن كيفية تنفيذ تطبيق مستند إلى الأحداث؟ على سبيل المثال:

  • عندما يحدث &lt;event&gt; => أرسل رسالة إلكترونية
  • عندما يحدث <event> => إذا كانت <condition> صحيحة، فقم بتحديث قاعدة البيانات.

يمكن أن يكون الحدث أيّ شيء، بدءًا من السجلّ الجديد المتوفّر في BigQuery أو عنصر جديد تم تغييره في مجلد في GCS أو رسالة جديدة في انتظار المعالجة في Pub/Sub.

توفّر Google Cloud نماذج متعددة لتحقيق ذلك. في ما يلي أبرز التغييرات:

في هذا التمرين، سوف نتعمق في دالة Cloud لتحقيق نتيجة مذهلة. وسنقدّم لك تمارين اختيارية.

لاحظ أن الرمز النموذجي متوفر ضمن .solutions/

إعداد وظيفة Cloud (🐍 python)

نحاول إنشاء إطار عمل طموح للغاية.

  1. عند إنشاء صورة جديدة على GCS (ربما لأنّ أحد المستخدمين حمّله على التطبيق، ولكن ليس فقط)
  2. .. يُرجى الاتصال بفريق Gemini لوصفها والحصول على وصف نصي للصورة .. (يُرجى التحقّق من تنسيق MIME والتأكّد من أنّها صورة وليست ملف PDF أو MP3 أو نصًا)
  3. .. وتعديل قاعدة البيانات بهذا الوصف. (قد يتطلّب ذلك تصحيح قاعدة البيانات لإضافة عمود description إلى جدول images).

تصحيح قاعدة البيانات لإضافة description إلى الصور

  1. افتح Cloud SQL Studio:

b92b07c4cba658ef.png

  1. أدخِل المستخدم وكلمة المرور في قاعدة بيانات الصور.
  2. أدخِل طلب SQL هذا الذي يضيف عمودًا لوصف الصورة:

ALTER TABLE images ADD COLUMN description TEXT;

3691aced78a6389.png

ونجحت في ذلك. جرِّب الآن التحقّق مما إذا كان قد تم حلّ المشكلة:

SELECT * FROM images;

من المفترض أن يظهر لك عمود الوصف الجديد:

bed69d6ad0263114.png

كتابة Gemini f(x)

ملاحظة: تم إنشاء هذه الدالة باستخدام مساعدة Gemini في الترميز.

ملاحظة: عند إنشاء هذه الدالة، قد تواجه أخطاء في أذونات إدارة الهوية وإمكانية الوصول. تم توثيق بعضها أدناه ضمن الفقرة "الأخطاء المحتمَلة".

  1. تفعيل واجهات برمجة التطبيقات
  2. الانتقال إلى https://console.cloud.google.com/functions/list
  3. انقر على "إنشاء دالة".
  4. تفعيل واجهات برمجة التطبيقات من معالج واجهة برمجة التطبيقات:

d22b82658cfd4c48.png

يمكنك إنشاء GCF من واجهة المستخدم أو من سطر الأوامر. سنستخدم هنا سطر الأوامر.

يمكن العثور على رمز محتمل ضمن .solutions/.

  1. أنشئ مجلدًا لاستضافة الرمز، مثل "gcf/". أدخِل المجلد.
  2. أنشئ ملف requirements.txt:
google-cloud-storage
google-cloud-aiplatform
pymysql
  1. أنشئ دالة Python. نموذج الرمز البرمجي هنا: gcf/main.py.
#!/usr/bin/env python

"""Complete this"""

from google.cloud import storage
from google.cloud import aiplatform
import vertexai
from vertexai.generative_models import GenerativeModel, Part
import os
import pymysql
import pymysql.cursors

# Replace with your project ID
PROJECT_ID = "your-project-id"
GEMINI_MODEL = "gemini-1.5-pro-002"
DEFAULT_PROMPT = "Generate a caption for this image: "

def gemini_describe_image_from_gcs(gcs_url, image_prompt=DEFAULT_PROMPT):
    pass

def update_db_with_description(image_filename, caption, db_user, db_pass, db_host, db_name):
    pass

def generate_caption(event, context):
    """
    Cloud Function triggered by a GCS event.
    Args:
        event (dict): The dictionary with data specific to this type of event.
        context (google.cloud.functions.Context): The context parameter contains
                                                event metadata such as event ID
                                                and timestamp.
    """
    pass
  1. ادفع الدالة. يمكنك استخدام نص برمجي مشابه لهذا النص: gcf/push-to-gcf.sh.

ملاحظة 1: احرص على الحصول على متغيرات البيئة بالقيم الصحيحة، أو أضِفها ببساطة في أعلى الصفحة (GS_BUCKET=blah، ..):

الملاحظة 2: سيؤدي ذلك إلى نشر كل الرمز البرمجي المحلي (.)، لذا احرص على إحاطة الرمز البرمجي بمجلد معيّن واستخدام .gcloudignore باحترافية لتجنّب نشر مكتبات ضخمة. ( مثال).

#!/bin/bash

set -euo pipefail

# add your logic here, for instance:
source .env || exit 2 

echo "Pushing ☁️ f(x)☁ to 🪣 $GS_BUCKET, along with DB config.. (DB_PASS=$DB_PASS)"

gcloud --project "$PROJECT_ID" functions deploy php_amarcord_generate_caption \
    --runtime python310 \
    --region "$GCP_REGION" \
    --trigger-event google.cloud.storage.object.v1.finalized \
    --trigger-resource "$BUCKET" \
    --set-env-vars "DB_HOST=$DB_HOST,DB_NAME=$DB_NAME,DB_PASS=$DB_PASS,DB_USER=$DB_USER" \
    --source . \
    --entry-point generate_caption \
    --gen2

ملاحظة: في هذا المثال، ستكون generate_caption هي الطريقة التي يتم استدعاؤها، وستُرسل Cloud Function حدث GCS إليها مع جميع المعلومات ذات الصلة (اسم الحزمة، واسم العنصر، وما إلى ذلك). يمكنك تخصيص بعض الوقت لتصحيح أخطاء قائمة python للحدث.

اختبار الدالة

اختبارات الوحدة

تحتوي الدالة على العديد من الأجزاء المتحركة. قد تحتاج إلى اختبار كل العناصر الفردية.

يمكنك العثور على مثال في gcf/test.py.

واجهة مستخدم Cloud Functions

خصِّص أيضًا بعض الوقت لاستكشاف وظيفتك في واجهة المستخدم. تستحق كل علامة تبويب الاستكشاف، لا سيما Source (العلامة المفضّلة لديّ) وVariables وTrigger وLogs. ستقضي الكثير من الوقت في Logs لتحديد المشاكل وحلّها (اطّلِع أيضًا على الأخطاء المحتمَلة في أسفل هذه الصفحة). احرص أيضًا على التحقّق من Permissions.

cf3ded30d532a2c7.png

اختبار E2E

حان الوقت لاختبار الدالة يدويًا.

  1. انتقِل إلى تطبيقك وسجِّل الدخول.
  2. تحميل صورة (يجب ألا تكون كبيرة جدًا، لأنّنا واجهنا مشاكل في الصور الكبيرة)
  3. التحقّق من واجهة المستخدم التي تم تحميل الصورة إليها
  4. تحقَّق من Cloud SQL Studio من أنّه تم تعديل الوصف. سجِّل الدخول وشغِّل هذا الاستعلام: SELECT * FROM images.

43a680b12dbbdda0.png

وهي مناسبة تمامًا. قد نرغب أيضًا في تحديث الواجهة الأمامية لإظهار هذا الوصف.

تعديل PHP لعرض [اختياري]

لقد أثبتنا أنّ التطبيق يعمل. ومع ذلك، سيكون من اللطيف أن يرى المستخدمون أيضًا هذا الوصف.

لا نحتاج إلى أن نكون خبراء في PHP لإضافة الوصف إلى index.php. من المفترض أن يعمل هذا الرمز (نعم، كتبه Gemini أيضًا):

<?php if (!empty($image['description'])): ?>
    <p class="font-bold">Gemini Caption:</p>
    <p class="italic"><?php echo $image['description']; ?></p>
<?php endif; ?>

يمكنك وضع هذا الرمز داخل foreach حسب رغبتك.

في الخطوات التالية، سنرى أيضًا إصدارًا أكثر جمالًا لواجهة المستخدم، وذلك بفضل ميزة "مساعدة الرموز البرمجية" في Gemini. قد تبدو النسخة الجميلة على النحو التالي:

fdc12de0c88c4464.png

الاستنتاجات

تم تنشيط إحدى وظائف Cloud على عناصر جديدة يتم عرضها على GCS، وهي قادرة على إضافة تعليقات توضيحية إلى محتوى الصورة كما يمكن لشخص فعل ذلك، وتعديل قاعدة البيانات تلقائيًا. ممتاز.

ما هي الخطوات التالية؟ يمكنك اتّباع المنطق نفسه لتحقيق وظيفتَين رائعتَين.

[اختياري] إضافة المزيد من وظائف Cloud [مفتوح]

تتوفّر ميزتان إضافيتان.

📩 عامل تشغيل البريد الإلكتروني

عامل تشغيل البريد الإلكتروني الذي يرسل إليك رسالة إلكترونية في كل مرة يرسل فيها مستخدم صورة

  • هل يتم ذلك كثيرًا؟ إضافة قيد آخر: صورة كبيرة أو صورة يتضمّن محتواها في Gemini الكلمات "عُري/عُري/عنيف"
  • ننصحك بالاطّلاع على EventArc لمعرفة ذلك.

🚫 الإشراف التلقائي على الصور غير الملائمة

يُبلغ حاليًا أحد المشرفين عن الصور باعتبارها "غير ملائمة". ماذا عن تكليف Gemini بالأحمال الثقيلة والإشراف على المساحة؟ أضِف اختبارًا للإبلاغ عن المحتوى الذي يؤدي إلى تشغيل غير ملائم وعدِّل قاعدة البيانات كما تعلّمنا في الدالة السابقة. وهذا يعني بشكل أساسي أخذ الدالة السابقة وتغيير الطلب وتعديل قاعدة البيانات استنادًا إلى الإجابة.

ملاحظة: تُنتج تكنولوجيات الذكاء الاصطناعي التوليدي نتائج غير متوقّعة. تأكَّد من أنّ "التصميم الإبداعي" من Gemini قد تم وضعه "على المسار الصحيح". يمكنك طلب إجابة محدّدة مثل نتيجة ثقة من 0 إلى 1 أو ملف JSON أو غير ذلك. يمكنك تحقيق ذلك بعدة طرق، على سبيل المثال: * استخدام مكتبات Python pydantic وlangchain وما إلى ذلك * استخدام الإخراج المنظَّم في Gemini.

ملاحظة: قد تكون لديك دوال متعددة أو أن يكون لديك طلب واحد يفرض إجابة JSON (يعمل الفلتر مع "مخرجات Gemini المنظَّمة" كما هو موضح أعلاه)، مثل:

ما هو الطلب لإنشاء هذا؟

{
    "description": "This is the picture of an arrosticino",
    "suitable": TRUE
}

يمكنك إدراج حقول إضافية في المطالبة للحصول على إحصاءات مثل: هل هناك شيء جيد بشأنها؟ هل هناك مشكلة في ذلك؟ هل يمكنك التعرّف على المكان؟ هل هناك بعض النصوص (تقنية التعرّف على النصوص OCR أصبحت أسهل من أي وقت مضى):

  • goods: "يبدو أنّه طعام شهي"
  • bads: "يبدو أنّه طعام غير صحي"
  • OCR: "Da consumare preferibilmente prima del 10 Novembre 2024"
  • location: "بيسكارا، لونغوماري"

على الرغم من أنّه من الأفضل عادةً استخدام دالة N لـ N نتيجة، إلا أنّه من المفيد جدًا استخدام دالة تؤدي 10 إجراءات. اطّلِع على هذه المقالة التي كتبها "ريكاردو" لمعرفة كيفية إجراء ذلك.

الأخطاء المحتمَلة (في الغالب في "إدارة الهوية وإمكانية الوصول" / الأذونات)

عندما طوّرتُ هذا الحلّ لأول مرة، واجهتُ بعض المشاكل في أذونات إدارة الهوية وإمكانية الوصول. سأضيفها هنا للتعاطف معك وتقديم بعض الأفكار حول كيفية حلّها.

الخطأ: أذونات غير كافية لحساب الخدمة

  1. يُرجى العِلم أنّه لتفعيل وظيفة GCF تستمع إلى حزمة GCS، عليك إعداد الأذونات المناسبة لحساب الخدمة الذي تستخدمه في المهمة، كما هو موضّح في الشكل:

22f51012fa6b4a24.png

قد تحتاج أيضًا إلى تفعيل EventArc APIs قبل بضع دقائق من توفّرها بالكامل.

خطأ: استدعاء تشغيل السحابة الإلكترونية غير متوفّر

  1. في ما يلي تعليق آخر من واجهة المستخدم بشأن أذونات GCF ( دور Cloud Run Invoker):

be72e17294f2d3f3.png

يمكن إصلاح هذا الخطأ من خلال تنفيذ الأمر في الصورة، والذي يشبه fix-permissions.sh.

يمكنك الاطّلاع على وصف لهذه المشكلة هنا: https://cloud.google.com/functions/docs/securing/authenticating

الخطأ: تم تجاوز الحدّ الأقصى للذاكرة

في المرة الأولى التي أجريت فيها عملية التشغيل، أظهرت السجلات ما يلي: "تم تجاوز الحد الأقصى للذاكرة الذي يبلغ 244 ميغابايت، حيث تم استخدام 270 ميغابايت. ننصحك بزيادة الحد الأقصى للذاكرة، راجِع https://cloud.google.com/functions/docs/configuring/memory". أضِف ذاكرة وصول عشوائي إلى GCF مرة أخرى. يمكنك إجراء ذلك بسهولة في واجهة المستخدم. في ما يلي مشكلة محتملة:

bed69d6ad0263114.png

بدلاً من ذلك، يمكنك أيضًا إصلاح النص البرمجي للنشر في السحابة الإلكترونية من أجل إيقاف إدارة الأجهزة الجوّالة للمؤسسات (MEM) أو وحدة المعالجة المركزية (CPU). تستغرق هذه العملية وقتًا أطول.

خطأ: تم نشر PubSub

أدّى إنشاء عامل تشغيل باستخدام الإصدار 1 من GCF إلى ظهور هذا الخطأ مرة واحدة:

e5c338ee35ad4c24.png

مجددًا، يمكن حلّ هذه المشكلة بسهولة من خلال الانتقال إلى إدارة الهوية وإمكانية الوصول ومنح حساب الخدمة الخاص بك دور "الناشر/الناشر".

رسالة خطأ: لم يتم استخدام Vertex AI

إذا ظهرت لك رسالة الخطأ هذه:

تم رفض الإذن: 403 لم يتم استخدام واجهة برمجة التطبيقات Vertex AI API في المشروع YOUR_PROJECT من قبل أو تم إيقافها. يمكنك تفعيل هذه الميزة من خلال الانتقال إلى https://console.developers.google.com/apis/api/aiplatform.googleapis.com/overview?project=YOR_PROJECT.

ما عليك سوى تفعيل Vertex AI APis. في ما يلي أسهل طريقة لتفعيل جميع واجهات برمجة التطبيقات المطلوبة:

  1. https://console.cloud.google.com/vertex-ai
  2. انقر على "تفعيل جميع واجهات برمجة التطبيقات المقترَحة".

492f05ac377f3630.png

خطأ: لم يتم العثور على مشغِّل EventArc

إذا ظهرت لك هذه الرسالة، يُرجى إعادة نشر الدالة.

8ec4fc11833d7420.png

الخطأ: 400 جارٍ توفير الخدمة لوكيل الخدمة

يتم توفير 400 وكيل خدمة ( https://cloud.google.com/vertex-ai/docs/general/access-control#service-agents ). يجب توفُّر وكلاء الخدمة لقراءة ملف Cloud Storage المقدَّم. لذا يرجى إعادة المحاولة بعد بضع دقائق.

إذا حدث ذلك، يُرجى الانتظار لبعض الوقت أو التواصل مع أحد موظفي Google.

10. الوحدة 8: إنشاء مستويات الخدمة لوقت الاستجابة

في هذا الفصل، نحاول تحقيق ما يلي:

  1. إنشاء عروض الأسعار المتغيرة
  2. إنشاء مستويات الخدمة استنادًا إلى مستويات الأداء
  3. إنشاء تنبيهات استنادًا إلى مستويات الخدمة

f63426182c052123.png

هذا موضوع مفضّل لدى المؤلف، لأنّ ريكاردو يعمل في مجال SRE/DevOps في Google Cloud.

(مفتوح) إنشاء مؤشرات مستوى الخدمة ومستويات الخدمة الدنيا لهذا التطبيق

ما مدى جودة تطبيق لا يمكنك معرفة متى يتعذّر استخدامه؟

ما هو مستوى الخدمة (SLO)؟

هذا أمر شاق. ابتكرت Google أهداف مستوى الخدمة. للاطّلاع على مزيد من المعلومات، يمكنك مراجعة ما يلي:

الخطوة 1: إنشاء SLI/SLO لمدى التوفّر

لنبدأ بمدى توفُّر هدف مستوى الخدمة، لأنّه الوسيلة الأسهل والأكثر أهمية التي تريد قياسها.

لحسن الحظ، يوفّر Cloud Run دعمًا مُعدًّا مسبقًا لأهداف مستوى الخدمة، وذلك بفضل Istio.

بعد تشغيل تطبيقك على Cloud، يمكنك إجراء ذلك بسهولة تامة في غضون 30 ثانية.

  • انتقِل إلى صفحة Cloud Run.
  • انقر على تطبيقك أو اختَره.
  • اختَر علامة التبويب SLOs.
  • انقر على "+ إنشاء مستوى الخدمة".
  • مدى التوفّر، استنادًا إلى الطلب
  • متابعة
  • الشهر التقويمي / %99
  • انقر على "إنشاء مستوى الخدمة".

e471c7ebdc56cdf6.png

الخطوة 2: إعداد التنبيهات بشأن مستوى الخدمة هذا

نقترح إنشاء تنبيهَين:

  1. أحدهما يتضمّن معدّل حرق بطيء ("حرق بطيء") لتنبيهك عبر البريد الإلكتروني (يحاكي تذكرة أوّلية منخفضة).
  2. سرعة استهلاك عالية ("Fastburn") لتنبيهك عبر الرسائل القصيرة (يحاكي طلب الدعم ذي الأولوية العالية أو جهاز البيجر)

انتقِل إلى SLO tab من قبل.

افعل ذلك مرتين:

314bfd6b9ef0a260.png

  • انقر على "إنشاء تنبيه SLO" (الزر 🔔 مع علامة زائد في داخله، على يسار الصفحة).
  • مدة معاينة الإعلان، والحدّ الأدنى لمعدّل الاستنفاد:
  • [سريع]. الأولى: 60 دقيقة / 10 x
  • [بطيء] الثانية: 720 دقيقة / 2 x
  • قناة الإشعارات: انقر على "إدارة قنوات الإشعارات".
  • أولاً، "البريد الإلكتروني" -> إضافة جديد -> ..
  • ثانيًا، "الرسائل القصيرة" -> إضافة رقم جديد -> إثبات الملكية على الهاتف.
  • نصيحة: أفضل استخدام الرموز التعبيرية في الأسماء! إنّه أمر ممتع للعروض التوضيحية.
  • عند الانتهاء، انقر على علامة X الكبيرة في أعلى يسار الصفحة.
  • حدد الهاتف أولاً (بسرعة)، ثم البريد الإلكتروني التالي (ببطء).
  • أضِف بعض نماذج المستندات، مثل:
  • [PHP Amarcord] Riccardo told me to type sudo reboot or to check documentation in http://example.com/playbooks/1.php but I guess he was joking.

هكذا!

النتيجة النهائية

يمكننا اعتبار هذا التمرين منتهٍ بعد أن يكون لديك مستوى خدمة تشغيلي واحد وتنبيهان لوقت توفّر الخدمة، ويتم إرسال التنبيهات إلى بريدك الإلكتروني وهاتفك.

يمكنك إضافة وقت استجابة (وأنصحك بشدة بإجراء ذلك) أو حتى وقت استجابة أكثر تعقيدًا. بالنسبة إلى وقت الاستجابة، اختَر وقت استجابة معقولًا. وإذا لم تكن متأكّدًا، اختَر 200 ملي ثانية.

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

لقد أكملت كل الخطوات، فما الذي ينقصك؟

إليك بعض الأفكار التي يمكنك أخذها في الاعتبار:

اللعب مع Gemini

يمكنك استخدام Gemini بطريقتَين:

  1. Vertex AI "طريقة Enterprise" المتداخلة مع Google Cloud Platform، والتي استكشَفناها في الفصل 7 (GCF+Gemini) تعمل جميع عمليات المصادقة بشكلٍ سحري، وتتداخل الخدمات مع بعضها بشكلٍ رائع.
  2. تكنولوجيات الذكاء الاصطناعي من Google "طريقة المستهلك" يمكنك الحصول على مفتاح واجهة برمجة تطبيقات Gemini من هنا وبدء إنشاء نصوص برمجية صغيرة يمكن ربطها بأيّ حمولة عمل لديك حاليًا (العمل المملوك، والسحبات الأخرى، وlocalhost، وما إلى ذلك). ما عليك سوى استبدال مفتاح واجهة برمجة التطبيقات وسيبدأ الرمز البرمجي بالعمل بشكلٍ سحري.

نشجعك على محاولة استكشاف (2) من خلال مشاريع الحيوانات الأليفة الخاصة بك.

تحسين واجهة المستخدم

لست جيدًا في واجهات المستخدم. ولكن Gemini هو تطبيق مصمّم لهذا الغرض. يمكنك استخدام صفحة PHP واحدة وكتابة ما يلي:

I have a VERY old PHP application. I want to touch it as little as possible. Can you help me:

1. add some nice CSS to it, a single static include for tailwind or similar, whatever you prefer
2. Transform the image print with description into cards, which fit 4 per line in the canvas?

Here's the code:

-----------------------------------
[Paste your PHP page, for instance index.php - mind the token limit!]

يمكنك إجراء ذلك بسهولة في أقل من 5 دقائق، وذلك من خلال عملية واحدة في Cloud Build. :)

كان ردّ Gemini مثاليًا (أي أنّه لم يكن عليّ تغيير أي شيء):

8a3d5fe37ec40bf8.png

في ما يلي التنسيق الجديد في تطبيق المؤلف الشخصي:

81620eb90ae3229a.png

ملاحظة: يتم لصق الرمز كصورة لأنّنا لا نريد تشجيعك على استخدامه، ولكن لنطلب من Gemini كتابة الرمز نيابةً عنك، مع مراعاة قيود واجهة المستخدم/الواجهة الإبداعية الخاصة بك. ثق بي. سيمكنك بعد ذلك إجراء تغييرات بسيطة جدًا.

الأمان

إنّ تأمين هذا التطبيق بشكلٍ صحيح ليس هدفًا من أهداف هذه الورشة التي تبلغ مدتها 4 ساعات.

للحصول على بعض الأفكار، يمكنك الاطّلاع على SECURITY doc.

12. تهانينا!

تهانينا 🎉🎉🎉 ، لقد نجحت في تحديث تطبيق PHP القديم بنجاح باستخدام Google Cloud.

24cb9a39b1841fbd.png

في ما يلي ملخص لما تعلمته في هذا الدرس التطبيقي حول الترميز:

  • كيفية نشر قاعدة بيانات MYSQL في Google Cloud SQL وكيفية نقل قاعدة بياناتك الحالية إليها
  • طريقة احتواء تطبيق PHP على Docker وBuildpacks وتخزين صورته في Google Cloud Artifact Registry
  • كيفية نشر تطبيقك المُنشئ في حاوية على Cloud Run وتشغيله باستخدام Cloud SQL
  • كيفية تخزين مَعلمات الضبط الحسّاسة أو استخدامها سرًا (مثل كلمة مرور قاعدة البيانات) باستخدام أداة "إدارة الأسرار" من Google
  • كيفية إعداد مسار التكامل المستمر/النشر المستمر باستخدام Google Cloud Build لإنشاء تطبيق PHP ونشره تلقائيًا عند دفع أي رمز إلى مستودع GitHub
  • كيفية استخدام Cloud Storage "لإدخال" موارد تطبيقك إلى السحابة الإلكترونية
  • كيفية الاستفادة من تقنيات الحوسبة بدون خادم لإنشاء سير عمل رائعة على Google Cloud بدون تعديل رمز تطبيقك
  • الاستفادة من إمكانات Gemini المتعدّدة الوسائط للحصول على حالات استخدام مناسبة

هذه بداية رائعة لرحلتك إلى تحديث التطبيقات من خلال Google Cloud.

🔁 الملاحظات

إذا أردت إخبارنا بتجربتك في هذه الورشة، يُرجى ملء نموذج الملاحظات هذا.

نرحب بملاحظاتك والطلبات بشأن أجزاء من الرمز البرمجي التي تفتخر بها بشكل خاص.

🙏 مع أطيب التحيّات،

يشكر المؤلف Mirko Gilioli وMaurizio Ipsale من Datatonic على المساعدة في كتابة المقالة واختبار الحلّ.