1. مقدمة
تاريخ آخر تعديل: 01-11-2024
كيف يمكننا تحديث تطبيق PHP قديم ليتوافق مع Google Cloud؟
(📽️ شاهِد فيديو تمهيديًا مدته 7 دقائق عن هذا الدليل التعليمي)
من الشائع أن يكون لديك تطبيقات قديمة تعمل على الموقع الإلكتروني وتحتاج إلى تحديث. ويعني ذلك جعلها قابلة للتوسّع والأمان والنشر في بيئات مختلفة.
في هذه الورشة، ستتمكّن من:
- حاويات تطبيق PHP
- انتقِل إلى خدمة قاعدة بيانات مُدارة ( Cloud SQL).
- النشر على Cloud Run (وهو بديل لخدمة GKE/Kubernetes التي لا تتطلّب أي عمليات)
- تأمين التطبيق باستخدام "إدارة الهوية وإمكانية الوصول" وSecret Manager
- تحديد مسار التكامل/النشر الآلي من خلال Cloud Build يمكن ربط Cloud Build بمستودع Git مستضاف على مقدّمي خدمات Git الرائجين، مثل GitHub أو GitLab، ويمكن تشغيله عند إجراء أي دفعة إلى الفرع الرئيسي، على سبيل المثال.
- استضافة صور التطبيق على Cloud Storage ويتم ذلك من خلال التثبيت، ولا يلزم استخدام أي رمز برمجي لتغيير التطبيق.
- تقديم وظائف الذكاء الاصطناعي التوليدي من خلال Gemini، المنظَّمة من خلال Cloud Functions (بدون خادم)
- تعرَّف على الحدود الدنيا لسرعة التشغيل وتشغيل تطبيقك الذي تم تجديده مؤخرًا.
من خلال اتّباع هذه الخطوات، يمكنك تحديث تطبيق PHP تدريجيًا، ما يؤدي إلى تحسين قابليته للتوسع وأمان استخدامه ومرونة نشره. بالإضافة إلى ذلك، يتيح لك الانتقال إلى Google Cloud الاستفادة من البنية الأساسية والخدمات القوية لضمان تشغيل تطبيقك بسلاسة في بيئة مُدارة في الأصل باستخدام السحابة الإلكترونية.
نعتقد أنّ ما ستتعلمه من خلال اتّباع هذه الخطوات البسيطة يمكن تطبيقه على تطبيقك ومؤسستك باستخدام لغة أو حِزمة مختلفة وحالات استخدام مختلفة.
لمحة عن التطبيق
التطبيق ( الرمز البرمجي، بموجب ترخيص MIT) الذي ستتم إنشاء نسخة منه هو تطبيق أساسي مكتوب بلغة PHP 5.7 مع مصادقة MySQL. الفكرة الرئيسية للتطبيق هي توفير منصة يمكن للمستخدمين من خلالها تحميل الصور، ويمكن للمشرفين الإشارة إلى الصور غير الملائمة. يتضمّن التطبيق جدولَين:
- المستخدمون: تأتي مُجمَّعة مسبقًا مع المشرفين. يمكن للمستخدمين الجدد التسجيل.
- الصور: يتضمّن هذا القسم بعض نماذج الصور. يمكن للمستخدمين الذين سجّلوا الدخول تحميل صور جديدة. سنضيف بعض الأفكار هنا.
هدفك
نريد تحديث التطبيق القديم لاستخدامه في Google Cloud. وسنستفيد من أدواتها وخدماتها لتحسين قابلية التوسّع وتعزيز الأمان وأتمتة إدارة البنية الأساسية ودمج ميزات متقدّمة مثل معالجة الصور والمراقبة وتخزين البيانات باستخدام خدمات مثل Cloud SQL وCloud Run وCloud Build وSecret Manager وغيرها.
والأهم من ذلك، نريد تنفيذ ذلك خطوة بخطوة حتى تتمكّن من التعرّف على العملية الفكرية التي تتضمّنها كل خطوة، وعادةً ما تفتح كل خطوة إمكانيات جديدة للخطوات التالية (على سبيل المثال، من الوحدة 2 إلى 3 ومن الوحدة 6 إلى 7).
ألم نقنعك بعد؟ يمكنك الاطّلاع على هذا الفيديو الذي تبلغ مدته 7 دقائق على YouTube.
المتطلبات
- جهاز كمبيوتر مزوّد بمتصفّح ومتصل بالإنترنت
- بعض الاعتمادات في Google Cloud Platform يمكنك طلب المساعدة من أحد خبراء Google المحليين. ;)
- يعمل الأمر
gcloud
. - هل تعمل على الجهاز؟ يمكنك تنزيله هنا. ستحتاج أيضًا إلى محرِّر جيد (مثل vscode أو intellij).
- هل تريد إجراء كل شيء "في السحابة الإلكترونية"؟ يمكنك استخدام Cloud Shell بعد ذلك.
- مستخدم GitHub ستحتاج إلى هذا الإجراء لتقسيم الرمز الأصلي 🧑🏻💻 gdgpescara/app-mod-workshop باستخدام مستودع git الخاص بك. هذا الإجراء مطلوب للحصول على مسار عمل CI/CD الخاص بك (الالتزام التلقائي -> الإنشاء -> النشر).
يمكنك الاطّلاع على أمثلة على الحلول هنا:
- مستودع المؤلف: https://github.com/Friends-of-Ricc/app-mod-workshop
- مستودع البرنامج التدريبي الأصلي، ضمن مجلدات
.solutions/
لكل فصل
يمكن المشاركة في هذه الورشة من جهاز الكمبيوتر أو إكمالها بالكامل على متصفّح.
2. إعداد المساهمين وإنشاء نسخة من التطبيق
استخدام رصيد Google Cloud Platform وإعداد بيئة Google Cloud Platform [اختياري]
لتنفيذ هذه الورشة، تحتاج إلى حساب فوترة يتضمّن بعض الرصيد. إذا كانت لديك خدمة فوترة خاصة بك، يمكنك تخطّي هذه الخطوة.
أنشئ حسابًا جديدًا على Gmail من Google (*) لربطه برصيدك في Google Cloud Platform. اطلب من المدرّس الرابط لاستلام رصيد Google Cloud Platform أو استخدِم الأرصدة هنا: bit.ly/PHP-Amarcord-credits .
سجِّل الدخول باستخدام الحساب الذي تم إنشاؤه حديثًا واتّبِع التعليمات.
(
) لماذا أحتاج إلى حساب Gmail جديد تمامًا؟*
لقد لاحظنا أنّ بعض المستخدمين لم يجتازوا دورة Codelab لأنّ حساباتهم (خاصة حسابات العمل أو حسابات الطلاب الإلكترونية) سبق أن تم استخدامها في Google Cloud Platform وأنّها تخضع لسياسات تنظيمية تفرض قيودًا على إمكانية إكمال الدورة. ننصحك بإنشاء حساب Gmail جديد أو استخدام حساب Gmail حالي (gmail.com) لم يسبق له استخدام Google Cloud Platform.
انقر على الزر للاستفادة من الرصيد.
يُرجى ملء النموذج التالي باسمك واسم عائلتك والموافقة على البنود والشروط.
قد تحتاج إلى الانتظار لبضع ثوانٍ قبل ظهور حساب الفوترة هنا: https://console.cloud.google.com/billing
بعد الانتهاء، افتح Google Cloud Console وأنشئ مشروعًا جديدًا بالنقر على أداة اختيار المشاريع في القائمة المنسدلة في أعلى يمين الصفحة حيث يظهر الخيار "بدون مؤسسة". انظر أدناه
أنشئ مشروعًا جديدًا إذا لم يكن لديك مشروع، كما هو موضّح في لقطة الشاشة أدناه. يتوفّر خيار "مشروع جديد" في أعلى يسار الصفحة.
احرص على ربط المشروع الجديد بحساب الفوترة التجريبي على Google Cloud Platform على النحو التالي:
يمكنك الآن استخدام Google Cloud Platform. إذا كنت مبتدئًا أو كنت تريد إجراء كل شيء في بيئة Cloud، يمكنك الوصول إلى Cloud Shell ومحرّره من خلال الزر التالي في أعلى يمين الصفحة كما هو موضّح أدناه.
تأكَّد من اختيار مشروعك الجديد في أعلى يمين الصفحة:
لم يتم اختياره (خطأ):
تم اختياره (جيد):
إنشاء نسخة من التطبيق من GitHub
- انتقِل إلى التطبيق التجريبي: https://github.com/gdgpescara/app-mod-workshop
- انقر على 🍴 الشوكة.
- إذا لم يكن لديك حساب على github، عليك إنشاء حساب جديد.
- عدِّل العناصر كما تريد.
- استنساخ رمز التطبيق باستخدام
git clone
https://github.com/
YOUR-GITHUB-USER/YOUR-REPO-NAME
- افتح مجلد المشروع المُكرّر باستخدام المحرِّر المفضّل لديك. إذا اخترت Cloud Shell، يمكنك إجراء ذلك من خلال النقر على فتح المحرِّر كما هو موضّح أدناه.
يتوفّر لديك كل ما تحتاجه باستخدام محرِّر Google Cloud Shell كما هو موضّح في الشكل التالي.
يمكن إجراء ذلك بشكل مرئي من خلال النقر على "فتح المجلد" واختيار المجلد، والذي يُحتمل أن يكون app-mod-workshop
في المجلد الرئيسي.
3- الوحدة 1: إنشاء مثيل SQL
إنشاء مثيل Google Cloud SQL
سيتصل تطبيق PHP بقاعدة بيانات MySQL، لذا نحتاج إلى نسخه إلى Google Cloud لنقل البيانات بسلاسة. إنّ Cloud SQL هي الخيار الأمثل لأنّها تتيح لك تشغيل قاعدة بيانات MySQL مُدارة بالكامل في Cloud. في ما يلي الخطوات التي يجب اتّباعها:
- انتقِل إلى صفحة Cloud SQL: https://console.cloud.google.com/sql/instances
- انقر على "إنشاء مثيل".
- فعِّل واجهة برمجة التطبيقات (إذا لزم الأمر). قد يستغرق ذلك بضع ثوانٍ.
- اختَر MySQL.
- (نحاول توفير الإصدار الأقل تكلفة لك، كي يستمر لفترة أطول):
- الإصدار: Enterprise
- الإعداد المُسبَق: التطوير (جرّبنا Sandbox ولم ينجح معنا)
- إصدار Mysql: 5.7 (يا له من إصدار قديم!)
- رقم تعريف المثيل: اختَر
appmod-phpapp
(إذا غيّرت هذا الخيار، تذكَّر أيضًا تغيير النصوص البرمجية والحلول المستقبلية وفقًا لذلك). - كلمة المرور: أي كلمة تريدها، ولكن يُرجى تدوينها على النحو التالي: CLOUDSQL_INSTANCE_PASSWORD
- المنطقة: يجب إبقاءها كما هي في بقية أقسام التطبيق (مثل ميلان =
europe-west8
). - مدى التوفّر على مستوى منطقة معيّنة: منطقة واحدة (نحن نوفّر المال في العرض التجريبي)
انقر على الزر "إنشاء مثيل" لنشر قاعدة بيانات Cloud SQL. ⌛ يستغرق اكتمال العملية حوالي 10 دقائق⌛. في هذه الأثناء، يمكنك مواصلة قراءة المستندات. يمكنك أيضًا البدء في حلّ الوحدة التالية ("تجميع تطبيق PHP في حاوية") لأنّها لا تعتمد على هذه الوحدة في الجزء الأول (إلى أن يتم إصلاح اتصال قاعدة البيانات).
ملاحظة: من المفترض أن تبلغ تكلفة هذه النسخة حوالي 7 دولار أمريكي في اليوم. احرص على نشرها بعد انتهاء الورشة.
إنشاء قاعدة بيانات image_catalog ومستخدم في Cloud SQL
يتضمّن مشروع التطبيق مجلد db/
يحتوي على ملفي sql:
- 01_schema.sql : يحتوي على رمز SQL لإنشاء جدولَين يحتويان على بيانات "المستخدِمين" و"الصور".
- 02_seed.sql: يحتوي على رمز SQL لإنشاء جدول بيانات في الجداول التي تم إنشاؤها سابقًا.
سيتم استخدام هذه الملفات لاحقًا بعد إنشاء قاعدة بيانات image_catalog
. يمكنك إجراء ذلك باتّباع الخطوات التالية:
- افتح المثيل وانقر على علامة التبويب "قواعد البيانات":
- انقر على "إنشاء قاعدة بيانات".
- يمكنك تسميته
image_catalog
(كما هو الحال في إعدادات تطبيق PHP).
بعد ذلك، ننشئ مستخدم قاعدة البيانات. باستخدام هذا الإجراء، يمكننا المصادقة في قاعدة بيانات image_catalog.
- انقر الآن على علامة التبويب المستخدمون.
- انقر على "إضافة حساب مستخدم".
- المستخدم: لننشئ حسابًا:
- اسم المستخدم:
appmod-phpapp-user
- كلمة المرور: اختَر كلمة يمكنك تذكُّرها، أو انقر على "إنشاء".
- احتفظ بالإعداد "السماح لأي مضيف (%)".
- انقر على "إضافة".
فتح قاعدة البيانات للعناوين IP المعروفة
تجدر الإشارة إلى أنّ جميع قواعد البيانات في Cloud SQL تكون "معزولة" عند إنشائها. يجب إعداد شبكة صراحةً للوصول إليها.
- انقر على المثيل.
- افتح القائمة "عمليات الربط".
- انقر على علامة التبويب "الشبكات".
- انقر على "الشبكات المعتمَدة". أضِف الآن شبكة (أي شبكة فرعية).
- في الوقت الحالي، لنختار إعدادات سريعة ولكن غير آمنة للسماح للتطبيق بالعمل. يمكنك لاحقًا حصرها في عناوين IP التي تثق بها:
- الاسم: "Everyone in the world - INSECURE".
- الشبكة: "
0.0.0.0/0"
(ملاحظة: هذا هو الجزء غير الآمن) - انقر على "تم".
- انقر على "حفظ".
ينبغي أن تظهر لك على النحو التالي:
ملاحظة: يشكّل هذا الحلّ حلًا وسطًا جيدًا لإنهاء الورشة في O(ساعات). ومع ذلك، يُرجى الاطّلاع على مستند الأمان للمساعدة في تأمين حلّك للإصدار العلني.
حان وقت اختبار اتصال قاعدة البيانات.
لنرى ما إذا كان حساب المستخدِم image_catalog
الذي أنشأناه سابقًا يعمل.
يُرجى الوصول إلى "Cloud SQL Studio" داخل المثيل وإدخال قاعدة البيانات والمستخدم وكلمة المرور المطلوب مصادقةهما كما هو موضّح أدناه:
بعد أن أصبحت في الصفحة، يمكنك فتح "محرر SQL" والانتقال إلى القسم التالي.
استيراد قاعدة البيانات من قاعدة البيانات
استخدِم "محرر لغة الاستعلامات البنيوية" لاستيراد جداول image_catalog
مع بياناتها. انسخ رمز SQL من الملفات في المستودع ( 01_schema.sql ثم 02_seed.sql) ونفِّذها الواحد تلو الآخر بترتيب تسلسلي.
بعد ذلك، من المفترض أن يظهر لك جدولان في image_catalog، وهما users وimages كما هو موضّح أدناه:
يمكنك اختبارها من خلال تنفيذ ما يلي في المحرّر: select * from images;
احرص أيضًا على تدوين عنوان IP العلني لمثيل Cloud SQL، لأنّك ستحتاج إليه لاحقًا. للحصول على عنوان IP، انتقِل إلى الصفحة الرئيسية لمثيل Cloud SQL ضمن صفحة نظرة عامة. (نظرة عامة > الاتصال بهذه النسخة > عنوان IP العام)
4. الوحدة 2: إنشاء حاوية لتطبيق PHP
نريد إنشاء هذا التطبيق للسحابة الإلكترونية.
ويعني ذلك تجميع الرمز في ملف ZIP يحتوي على كل المعلومات اللازمة لتشغيله في السحابة الإلكترونية.
هناك بضع طرق لحزمة التطبيق:
- Docker: رائج جدًا، ولكنّه معقد جدًا في الإعداد الصحيح.
- حِزم الإنشاء: هذه الطريقة أقل شيوعًا، ولكنها تميل إلى "التخمين التلقائي" لما يجب إنشاؤه وتشغيله. وغالبًا ما تنجح هذه الطريقة.
في سياق هذه الورشة التدريبية، سنفترض أنّك تستخدم Docker.
إذا اخترت استخدام Cloud Shell، حان وقت إعادة فتحه (انقر على رمزه في أعلى يسار وحدة تحكّم السحابة الإلكترونية).
من المفترض أن يؤدي ذلك إلى فتح وحدة تحكم ملائمة في أسفل الصفحة، حيث من المفترض أن تكون قد أنشأت نسخة من الرمز في خطوة الإعداد.
Docker
إذا أردت التحكّم في المحتوى، هذا هو الحلّ المناسب لك. يكون هذا الإجراء منطقيًا عندما تحتاج إلى ضبط مكتبات معيّنة وتنفيذ سلوكيات معيّنة غير واضحة (مثل chmod في عمليات التحميل أو ملف تنفيذي غير عادي في تطبيقك).
بما أنّنا نريد في النهاية نشر تطبيقنا المُنشئ باستخدام حاويات إلى Cloud Run، يُرجى الاطّلاع على المستندات التالية. كيف يمكنك إعادة نقله من PHP 8 إلى PHP 5.7؟ يمكنك استخدام Gemini لإجراء ذلك. بدلاً من ذلك، يمكنك استخدام هذا الإصدار المُعدّ مسبقًا:
يتوفّر أحدث إصدار من Dockerfile
هنا.
لاختبار تطبيقنا على الجهاز، علينا تغيير ملف config.php بطريقة تسمح لتطبيق PHP بالاتصال بقاعدة بيانات MYSQL المتوفّرة على Google CloudSQL. استنادًا إلى ما سبق لك إعداده، املأ الفراغات:
<?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();
?>
DB_HOST
هو عنوان IP العلني لخدمة Cloud SQL، ويمكنك العثور عليه في وحدة تحكّم SQL:
- يجب ألا يتغيّر
DB_NAME
:image_catalog
- يجب أن يكون
DB_USER
appmod-phpapp-user
DB_PASS
هو شيء اخترته. اضبطها بين علامتَي اقتباس مفردتَين واستخدم علامة الهروب حسب الحاجة.
يمكنك أيضًا ترجمة بعض المقاطع 🇮🇹 الإيطالية إلى الإنجليزية باستخدام Gemini.
حسنًا، بعد أن حصلت على Dockerfile
وضبطت تطبيق PHP للاتصال بقاعدة البيانات، لنختبر ذلك.
ثبِّت Docker إذا لم يكن مثبّتًا بعد ( الرابط). لست بحاجة إلى ذلك إذا كنت تستخدم Cloud Shell (ما أروع ذلك).
حاوِل الآن إنشاء تطبيق PHP المستند إلى حاويات وتشغيله باستخدام أوامر docker build وrun المناسبة.
# Build command - don't forget the final . This works if Dockerfile is inside the code folder:
$ docker build -t my-php-app-docker .
# Local Run command: most likely ports will be 8080:8080
$ docker run -it -p <CONTAINER_PORT>:<LOCAL_MACHINE_PORT> my-php-app-docker
إذا كان كل شيء يعمل على ما يرام، من المفترض أن تظهر لك صفحة الويب التالية عند الاتصال بالمضيف المحلي. أصبح تطبيقك الآن يعمل على المنفذ 8080، انقر على رمز "معاينة الويب" (متصفّح مع عين) ثم على معاينة على المنفذ 8080 (أو "تغيير المنفذ" لأي منفذ آخر).
اختبار النتيجة في المتصفّح
من المفترض أن يظهر تطبيقك الآن على النحو التالي:
وإذا سجّلت الدخول باستخدام المشرف/admin123، من المفترض أن يظهر لك ما يلي:
رائع. بخلاف النص الإيطالي، يعمل التطبيق بشكل جيد. 🎉🎉🎉
إذا كانت عملية إنشاء الحِزم باستخدام Docker ناجحة ولكنّ بيانات اعتماد قاعدة البيانات غير صحيحة، قد تظهر لك رسالة مثل هذه:
يُرجى إعادة المحاولة، فأنت قريب من اللفظ الصحيح.
الحفظ في Artifact Registry [اختياري]
من المفترض أن يكون لديك الآن تطبيق PHP مُحصور في حاوية وجاهز للنشر على السحابة الإلكترونية. بعد ذلك، نحتاج إلى مساحة في السحابة الإلكترونية لتخزين صورة Docker وجعلها متاحة للنشر في خدمات Google Cloud، مثل Cloud Run. يُعرف حلّ التخزين هذا باسم Artifact Registry، وهو خدمة مُدارة بالكامل من Google Cloud مصمّمة لتخزين عناصر التطبيقات، بما في ذلك صور حاويات Docker وحِزم Maven ووحدات npm والمزيد.
لننشئ مستودعًا في Google Cloud Artifact Registry باستخدام الزر المناسب.
اختَر اسمًا صالحًا وتنسيقًا ومنطقة مناسبةً لتخزين العناصر.
ارجع إلى علامة بيئة التطوير المحلية وادفع صورة حاوية التطبيق إلى مستودع Artifact Registry الذي تم إنشاؤه للتو. أكمِل الأوامر التالية لإجراء ذلك.
- docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
- docker push TARGET_IMAGE[:TAG]
من المفترض أن تظهر النتيجة كما هو موضّح في لقطة الشاشة التالية.
🎉🎉🎉 مبروك، يمكنك الانتقال إلى المستوى التالي. قبل ذلك، يمكنك تخصيص دقيقتين لمحاولة التحميل/تسجيل الدخول/تسجيل الخروج والتعرّف على نقاط نهاية التطبيق، لأنّك ستحتاج إليها لاحقًا.
الأخطاء المحتملة
إذا ظهرت لك أخطاء في الحِزم، جرِّب استخدام Gemini لشرح الخطأ وإصلاحه، مع تقديم ما يلي:
- ملف Dockerfile الحالي
- الخطأ الذي تم تلقّيه
- [إذا لزم الأمر] رمز PHP الذي يتم تنفيذه
أذونات التحميل جرِّب أيضًا نقطة النهاية /upload.php
وحاول تحميل صورة. قد يظهر لك الخطأ أدناه. إذا كان الأمر كذلك، عليك إصلاح بعض chmod/chown
في Dockerfile
.
تحذير: move_uploaded_file(uploads/image (3).png): تعذّر فتح البث: تم رفض الإذن في /var/www/html/upload.php في السطر 11
PDOException "تعذّر العثور على برنامج التشغيل" (أو "Errore di connessione: تعذّر العثور على برنامج التشغيل"). تأكَّد من أنّ ملف Dockerfile يتضمّن مكتبات PDO المناسبة لنظام mysql (pdo_mysql
) للاتصال بقاعدة البيانات. يمكنك الاطّلاع على حلول في هذا الرابط.
تعذّر إعادة توجيه طلبك إلى الخلفية. تعذّر الاتصال بخادم على المنفذ 8080. يعني هذا أنّك ربما تعرض المنفذ غير الصحيح. تأكَّد من أنّك تعرض المنفذ الذي يقدّم منه Apache/Nginx المحتوى. هذا ليس أمرًا بسيطًا. جرِّب استخدام المنفذ 8080 إن أمكن (لتسهيل استخدام Cloud Run). إذا كنت تريد الاحتفاظ بمنفذ 80 (على سبيل المثال، لأنّ Apache يريد ذلك)، استخدِم أمرًا مختلفًا لتشغيله:
$ docker run -it -p 8080:80 # force 80
# Use the PORT environment variable in Apache configuration files.
# https://cloud.google.com/run/docs/reference/container-contract#port
RUN sed -i 's/80/${PORT}/g' /etc/apache2/sites-available/000-default.conf /etc/apache2/ports.conf
5- الوحدة 3: نشر التطبيق على Cloud Run
ما هي مزايا 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 cloudbuild.googleapis.com
في هذه المرحلة، يكون كل شيء جاهزًا للنشر على Cloud Run.
نشر تطبيقك على Cloud Run باستخدام gcloud
الأمر الذي يتيح لك نشر التطبيق على Cloud Run هو gcloud run deploy
. هناك عدّة خيارات يجب ضبطها لتحقيق هدفك. في ما يلي الحد الأدنى من الخيارات (التي يمكنك تقديمها من خلال سطر الأوامر، أو ستطلب منك الأداة تقديمها من خلال طلب تفاعلي):
- اسم خدمة Cloud Run التي تريد نشرها لتطبيقك. ستعرِض لك خدمة Cloud Run عنوان URL يقدّم نقطة نهاية لتطبيقك.
- منطقة Google Cloud التي سيتم تشغيل تطبيقك فيها (
--region
REGION) - صورة الحاوية التي تُغلِّف تطبيقك
- متغيّرات البيئة التي يحتاج تطبيقك إلى استخدامها أثناء تنفيذه
- علامة Allow-Unauthenticated التي تسمح للجميع بالوصول إلى تطبيقك بدون إجراء مصادقة إضافية
يمكنك الرجوع إلى المستندات (أو الانتقال للأسفل للاطّلاع على حلّ محتمل) لمعرفة كيفية تطبيق هذا الخيار على سطر الأوامر.
ستستغرق عملية النشر بضع دقائق. إذا كانت كل البيانات صحيحة، من المفترض أن يظهر لك ما يلي في Google Cloud Console.
انقر على عنوان URL الذي تقدّمه خدمة Cloud Run واختَبر تطبيقك. بعد المصادقة، من المفترض أن يظهر لك ما يلي:
"gcloud run deploy" بدون وسيطات
ربما لاحظت أنّ gcloud run deploy
يطرح عليك الأسئلة المناسبة ويملؤك الفراغات التي تركتها. هذا مدهش.
ومع ذلك، في بعض الوحدات، سنضيف هذا الأمر إلى عامل تشغيل Cloud Build حتى لا نتمكّن من توفير أسئلة تفاعلية. علينا ملء كل خيار في الأمر. لنفترض أنّك تريد إنشاء gcloud run deploy --option1 blah --foo bar --region your-fav-region
ذهبي. كيف تنفّذ ذلك؟
- كرِّر الخطوات من 2 إلى 3 إلى 4 إلى أن يتوقف gcloud عن طرح الأسئلة:
- [LOOP]
gcloud run deploy
مع الخيارات التي تم العثور عليها حتى الآن - [LOOP] تطلب الأنظمة الخيار X
- [LOOP] البحث في المستندات العامة عن كيفية إعداد X من CLI مع إضافة الخيار
--my-option [my-value]
- يمكنك الرجوع إلى الخطوة 2 الآن، ما لم تكتمل عملية gcloud بدون أي أسئلة أخرى.
- هذا الأمر gcloud run deploy BLAH BLAH BLAH رائع. احفظ الأمر في مكان ما، لأنّك ستحتاج إليه لاحقًا في خطوة Cloud Build.
يمكنك الاطّلاع على حلّ محتمل هنا. يمكنك الاطّلاع على المستندات هنا.
مبروك 🎉🎉🎉 لقد نجحت في نشر تطبيقك على Google Cloud، ما يشكّل الخطوة الأولى في عملية التحديث.
6- الوحدة 4: إزالة كلمات المرور غير الصالحة باستخدام أداة "إدارة الأسرار"
في الخطوة السابقة، تمكّنا من نشر تطبيقنا وتشغيله بنجاح في 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') ?: 'localhost';
$db_name = getenv('DB_NAME') ?: 'image_catalog';
$db_user = getenv('DB_USER') ?: 'appmod-phpapp-user';
$db_pass = getenv('DB_PASS') ?: 'wrong_password';
// 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. أضِف إلى ملف Dockerfile السابق المَعلمات الأربع باستخدام البنية ENV DB_VAR=ENV_VAR_VALUE. سيؤدي ذلك إلى إعداد قيم تلقائية يمكن إلغاؤها أثناء التشغيل. على سبيل المثال، يمكن ضبط "DB_NAME" و"DB_USER" هنا فقط.
- في وقت التشغيل يمكنك إعداد هذه المتغيّرات لخدمة Cloud Run، سواء من واجهة سطر الأوامر أو من واجهة المستخدم. هذا هو المكان المناسب لوضع جميع المتغيّرات الأربعة (ما لم تكن تريد الاحتفاظ بالإعدادات التلقائية المحدّدة في Dockerfile).
في localhost، قد تحتاج إلى وضع متغيّرات ENV في ملف .env
(تحقَّق من مجلد solutions).
تأكَّد أيضًا من إضافة .env إلى .gitignore
: لا تريد دفع أسرارك إلى Github.
echo .env >> .gitignore
بعد ذلك، يمكنك اختبار المثيل على الجهاز:
docker run -it -p 8080:8080 --env-file .env my-php-app-docker
لقد حقّقت الآن ما يلي:
- سيقرأ تطبيقك المتغيّر ديناميكيًا من بيئة التشغيل.
- لقد تحسّنت أمان التطبيق بعد إزالة كلمة مرور قاعدة البيانات من الرمز البرمجي.)
يمكنك الآن نشر إصدار جديد على Cloud Run. لننتقل إلى واجهة المستخدم ونضبط متغيّرات البيئة يدويًا:
- انتقِل إلى https://console.cloud.google.com/run.
- انقر على تطبيقك.
- انقر على "تعديل إصدار جديد ونشره".
- في علامة التبويب الأولى "الحاويات"، انقر على علامة التبويب السفلية "المتغيّرات والأسرار".
- انقر على "+ إضافة متغيّر" وأضِف كل المتغيّرات المطلوبة. من المفترض أن يظهر لك الجدول التالي:
هل هذا مناسب؟ لا، لا يزال PASS مرئيًا لمعظم مشغّلي الشبكات. ويمكن التخفيف من تأثير ذلك باستخدام أداة Google Cloud Secret Manager.
الإصدار الثاني: أداة إدارة الأسرار
اختفت كلمات المرور من الرمز الذي أنشأته بنفسك، وهذا يعني أنّك نجحت في إزالة كلمات المرور من الرمز. هل تم حلّ المشكلة؟
ستظل كلمات المرور مرئية لأي مستخدم لديه إذن الوصول إلى Google Cloud Console. في الواقع، إذا وصلت إلى ملف نشر YAML في Cloud Run، ستتمكّن من استرجاعه. أو إذا حاولت تعديل أو نشر إصدار جديد من Cloud Run، ستظهر كلمة المرور في قسم "المتغيّرات والأسرار" كما هو موضّح في لقطات الشاشة أدناه.
مدير الأسرار من Google Cloud هو خدمة مركزية وآمنة لإدارة المعلومات الحسّاسة، مثل مفاتيح واجهة برمجة التطبيقات وكلمات المرور والشهادات والأسرار الأخرى.
ويتيح لك تخزين الأسرار وإدارتها والوصول إليها باستخدام أذونات دقيقة وتشفير قوي. إنّ أداة Secret Manager مدمجة مع خدمة "إدارة الهوية والوصول" (IAM) في Google Cloud، ما يتيح لك التحكّم في المستخدمين الذين يمكنهم الوصول إلى أسرار معيّنة، ما يضمن أمان البيانات والامتثال التنظيمي.
وتتيح هذه الخدمة أيضًا ميزة تدوير الأسرار وإنشاء الإصدارات منها تلقائيًا، ما يسهّل إدارة دورة حياة الأسرار ويعزّز الأمان في التطبيقات على مستوى خدمات Google Cloud.
للوصول إلى مدير الأسرار، انتقِل من قائمة قائمة المهام إلى خدمات الأمان وابحث عنه ضمن قسم حماية البيانات كما هو موضّح في لقطة الشاشة أدناه.
فعِّل واجهة برمجة التطبيقات Secret Manager API بعد الوصول إلى الصفحة وفقًا للصورة التالية.
- الآن، انقر على إنشاء سر: لنحدّد الخطوات بشكل منطقي:
- الاسم:
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" نفسه للسرّ المُشار إليه واستخدِم أحدث إصدار.
بعد الانتهاء، من المفترض أن تظهر لك رسالة الخطأ التالية:
نحاول معرفة كيفية حلّ هذه المشكلة. لحلّ هذه المشكلة، عليك الانتقال إلى قسم إدارة الهوية وإمكانية الوصول والمشرف وتغيير أذونات المنح. مع أطيب التحيّات،
بعد تحديد المشكلة، يمكنك العودة إلى Cloud Run وإعادة نشر إصدار جديد. من المفترض أن تظهر النتيجة بالشكل التالي:
ملاحظة: تُعدّ "وحدة تحكّم المطوّرين" (واجهة المستخدم) رائعة في الإشارة إلى مشاكل الأذونات. ننصحك بالانتقال إلى جميع روابط كيانات Cloud.
7- الوحدة 5: إعداد عملية التطوير/النشر المتكاملَين باستخدام Cloud Build
لماذا مسار عمل CI/CD؟
من المفترض أن تكون قد كتبت gcloud run deploy
عدة مرات، ربما للإجابة عن السؤال نفسه مرارًا وتكرارًا.
هل سئمت من نشر تطبيقك يدويًا باستخدام gcloud run deploy؟ ألا تعتقد أنّه من الرائع أن يتم نشر تطبيقك تلقائيًا في كل مرة تُرسل فيها تغييرًا جديدًا إلى مستودع Git؟
لاستخدام مسار إحالة الإصدارات إلى الإصدار العلني/النشر الدائم، ستحتاج إلى شيئَين:
- مستودع Git شخصي: لحسن الحظ، من المفترض أن تكون قد أنشأت نسخة من مستودع ورشة العمل في حسابك على GitHub في الخطوة 2. إذا لم يكن الأمر كذلك، يُرجى الرجوع إلى الخطوة السابقة وإكمالها. من المفترض أن يظهر مستودعك المشتق على النحو التالي:
https://github.com/<YOUR_GITHUB_USER>/app-mod-workshop
- Cloud Build: تتيح لك هذه الخدمة الرائعة والرخيصة ضبط عمليات التشغيل الآلي للإنشاءات لكل شيء تقريبًا: Terraform والتطبيقات المستندة إلى Docker وغير ذلك.
سيركز هذا القسم على إعداد Cloud Build.
استخدام Cloud Build
سنستخدم Cloud Build لتنفيذ ذلك:
- أنشئ المصدر (باستخدام Dockerfile). يمكنك اعتباره "ملفًا كبيرًا بتنسيق .zip" يحتوي على كل ما تحتاجه لإنشاء التطبيق وتشغيله (أي "العنصر الذي تم إنشاؤه").
- ادفع هذا العنصر إلى Artifact Registry (AR).
- بعد ذلك، عليك إصدار أمر نشر من AR إلى Cloud Run للتطبيق "php-amarcord".
- سيؤدي ذلك إلى إنشاء إصدار جديد ("مراجعة") من التطبيق الحالي (تخيّل طبقة تتضمّن الرمز الجديد)، وسنضبطه لتحويل الزيارات إلى الإصدار الجديد في حال نجاح عملية الدفع.
في ما يلي مثال على بعض الإصدارات لتطبيقي php-amarcord
:
كيف ننفّذ كل ذلك؟
- من خلال إنشاء ملف YAML واحد مثالي:
cloudbuild.yaml
- من خلال إنشاء مشغِّل Cloud Build
- من خلال الاتصال بـ github repo من خلال واجهة مستخدم Cloud Build.
إنشاء عامل تشغيل (و"مستودع Connect")
- انتقِل إلى https://console.cloud.google.com/cloud-build/triggers.
- انقر على "إنشاء عبارة تشغيل".
- تجميع:
- الاسم: اسم له دلالة، مثل
on-git-commit-build-php-app
- الحدث: الدفع إلى فرع
- المصدر: "ربط مستودع جديد"
- سيؤدي ذلك إلى فتح نافذة على يسار الصفحة: "ربط المستودع".
- موفّر المصدر: "Github" (الأول)
- "متابعة"
- ستفتح أداة المصادقة نافذة على github للمصادقة المتبادلة. اتّبِع الخطوات وانتظر بصبر. إذا كان لديك العديد من المستودعات، قد يستغرق الأمر بعض الوقت.
- "اختيار المستودع": اختَر حسابك/مستودعك وضع علامة في المربّع بجانب "أقرّ بذلك...".
- إذا ظهر لك الخطأ: لم يتم تثبيت تطبيق GitHub على أي من مستودعاتك، يُرجى النقر على "تثبيت Google Cloud Build" واتّباع التعليمات.
انقر على "ربط".
- هكذا! تم ربط مستودعك الآن.
- لنعود إلى جزء "العامل المشغِّل"....
- الإعداد: يتم رصده تلقائيًا (*)
- خيارات متقدّمة: اختَر حساب الخدمة "[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
- ضَع علامة أيضًا في المربّع بجانب "ضبطه كحساب الخدمة المفضّل".
أين ملف YAML الخاص بـ Cloud Build؟
ننصحك بشدة بقضاء بعض الوقت في إنشاء ملف YAML الخاص ببناء السحابة الإلكترونية.
إذا لم يكن لديك الوقت أو لم تكن تريد تخصيص الوقت لذلك، يمكنك الحصول على بعض الإلهام من مجلد الحلول هذا: .solutions
يمكنك الآن دفع تغيير إلى github ومراقبة Cloud Build من جهته.
قد يكون إعداد Cloud Build أمرًا صعبًا. من المتوقّع أن تتلقّى ردودًا من خلال:
- التحقّق من السجلات في https://console.cloud.google.com/cloud-build/builds;region=global
- العثور على الخطأ
- يتم إصلاح الخطأ في الرمز البرمجي، وإعادة إصدار git commit / git push.
- في بعض الأحيان، لا يكون الخطأ في الرمز البرمجي، بل في بعض الإعدادات. في هذه الحالة، يمكنك إصدار إصدار جديد من واجهة المستخدم (الإصدار في السحابة الإلكترونية > "المشغِّلات" > تشغيل).
يُرجى العِلم أنّه في حال استخدام هذا الحل، سيظلّ عليك تنفيذ بعض الإجراءات. على سبيل المثال، عليك ضبط متغيّرات ENV لنقاط نهاية dev/prod التي تم إنشاؤها حديثًا:
هناك طريقتان لإجراء ذلك:
- من خلال واجهة المستخدم: من خلال ضبط متغيّرات ENV مرة أخرى
- من خلال CLI من خلال إنشاء النص البرمجي "المثالي" لك. يمكنك العثور على مثال هنا: gcloud-run-deploy.sh . عليك تعديل بعض الإعدادات، مثل نقطة النهاية ورقم المشروع. يمكنك العثور على رقم مشروعك في نظرة عامة على Cloud.
كيف يمكنني إرسال الرمز إلى GitHub؟
لا يشمل نطاق هذه الورشة التدريبية تعليمك أفضل طريقة لنقل git push
إلى GitHub. في حال مواجهة مشكلة وكنت تستخدم Cloud Shell، يمكنك اتّباع إحدى الطريقتَين التاليتَين:
- CLI: أضِف مفتاح ssh محليًا وأضِف جهاز كمبيوتر بعيدًا باستخدام git@github.com:YOUR_USER/app-mod-workshop.git (بدلاً من http).
- VSCode إذا كنت تستخدم محرِّر Cloud Shell، يمكنك استخدام علامة التبويب "تحكّم في المصدر" (ctrl-shift-G)، والنقر على "مزامنة التغييرات" واتّباع التعليمات. من المفترض أن تتمكّن من مصادقة حسابك على GitHub في vscode، ويصبح من السهل بعد ذلك سحب/دفع الملفات.
يُرجى 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
مساحة التخزين
يخزِّن التطبيق حاليًا الحالة في حاوية docker. إذا تعطّل الجهاز أو تعطّل التطبيق أو إذا أرسلت نسخة جديدة، سيتم تحديد موعد لنشر نسخة جديدة في مساحة تخزين فارغة جديدة: 🙈
كيف يمكننا حلّ هذه المشكلة؟ هناك عدد من الطرق.
- تخزين الصور في قاعدة البيانات لقد فعلتُ ذلك في تطبيق PHP السابق. وهو أبسط حلّ، لأنّه لا يضيف تعقيدًا إليه. ولكنّ ذلك يضيف وقت استجابة وحملًا إلى قاعدة بياناتك بالتأكيد.
- هل يمكنك نقل تطبيقك على Cloud Run إلى حلّ يتوافق مع مساحة التخزين: GCE + قرص دائم؟ هل يمكن أن يكون GKE + مساحة التخزين؟ ملاحظة: كلما زادت قدرتك على التحكّم، قلّت مرونتك.
- انتقِل إلى GCS. توفّر Google Cloud Storage أفضل مساحة تخزين في فئتها لخدمات Google Cloud بالكامل، وهي الحل الأكثر شيوعًا في السحابة الإلكترونية. ومع ذلك، يتطلّب ذلك استخدام مكتبات PHP. هل لدينا مكتبات PHP 5.7 لخدمة GCS؟ هل يتوافق
PHP 5.7
معComposer
(يبدو أنّ PHP 5.3.2 هو أقدم إصدار متوافق مع Composer)؟ - هل يمكنك استخدام docker sidecar؟
- أو يمكنك استخدام عمليات ربط وحدة تخزين Cloud Run في GCS. يبدو هذا رائعًا.
🤔 نقل مساحة التخزين (مفتوح)
[مفتوح] في هذا التمرين، نريد منك العثور على حلّ لنقل صورك بطريقة تحافظ على ثباتها.
اختبار القبول
لا أريد أن أخبرك بالحل، ولكن أريد أن يحدث ما يلي:
- تحمّل
newpic.jpg
. سيظهر لك هذا المبلغ في التطبيق. - ترقية التطبيق إلى إصدار جديد
- لا يزال
newpic.jpg
متوفّرًا ومرئيًا.
💡 الحلّ المحتمل (عمليات ربط وحدة تخزين في GCS Cloud Run)
هذا حلّ رائع جدًا يسمح لنا بتحميل الملفات التي تتضمّن حالة بدون تعديل الرمز على الإطلاق (باستثناء عرض وصف الصورة، ولكن هذا أمر بسيط ومجرد زخرفة).
من المفترض أن يسمح لك ذلك بربط مجلد من Cloud Run بـ GCS، وذلك على النحو التالي:
- ستظهر جميع عمليات التحميل إلى GCS في تطبيقك.
- سيتم تحميل جميع الملفات التي تحمّلها إلى تطبيقك إلى GCS.
- ستتم معالجة العناصر التي تم تحميلها في GCS (الفصل 7).
ملاحظة: يُرجى قراءة أحكام FUSE الدقيقة. لا يُعدّ ذلك أمرًا جيدًا إذا كانت هناك مشكلة في الأداء.
إنشاء حزمة GCS
GCS هي خدمة التخزين الشاملة في Google Cloud. وقد تم اختباره على نطاق واسع، وتستخدمه كل خدمة من خدمات GCP التي تحتاج إلى مساحة تخزين.
يُرجى العِلم أنّ 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.
يمكنك أيضًا إجراء ذلك من واجهة المستخدم.
- ضمن علامة التبويب "الأحجام"، أنشئ عمليات ربط أحجام تشير إلى حزمة، من النوع "حزمة Cloud Storage"، على سبيل المثال باسم "php_uploads".
- ضمن "الحاويات" > "عمليات ربط وحدة التخزين"، ثبِّت وحدة التخزين التي أنشأتها للتو على نقطة وحدة التخزين التي طلبها تطبيقك. يعتمد ذلك على ملف dockerfile، ولكن قد يبدو مثل
var/www/html/uploads/
.
في كلتا الحالتَين، إذا نجحت، من المفترض أن يؤدي تعديل المراجعة الجديدة في Cloud Run إلى ظهور رسالة مشابهة لما يلي:
اختبِر الآن التطبيق الجديد من خلال تحميل صورة جديدة واحدة إلى نقطة نهاية /upload.php
.
يجب أن تظهر الصور بسلاسة على GCS بدون كتابة سطر واحد من PHP:
ما الذي حدث للتو؟
حدثت أمور سحرية جدًا.
لا يزال تطبيق قديم يتضمّن رمزًا قديمًا يؤدي وظيفته. تتيح لنا الحزمة الجديدة والمطوّرة تخزين جميع الصور في تطبيقنا بشكل مريح في حزمة Cloud Bucket ذات الحالة. يمكنك الآن إنشاء تجارب رائعة:
- هل تريد إرسال رسالة إلكترونية في كل مرة تصل فيها صورة تتضمّن محتوى "خطير" أو "عُري"؟ ويمكنك إجراء ذلك بدون تعديل رمز PHP.
- هل تريد استخدام نموذج Gemini Multimodal في كل مرة يتم فيها إدخال صورة لوصفها، وتحميل قاعدة البيانات مع وصفها؟ ويمكنك إجراء ذلك بدون تعديل رمز PHP. ألا تصدقني؟ واصِل القراءة في الفصل 7.
لقد فتحنا للتو مساحة كبيرة من الفرص هنا.
9. الوحدة 7: تحسين أداء تطبيقك باستخدام Google Gemini
لديك الآن تطبيق PHP جديد ورائع ومُعَدّل (مثل Fiat 126
لعام 2024) مزوّد بمساحة تخزين في السحابة الإلكترونية.
ما استخداماته؟
المتطلبات الأساسية
في الفصل السابق، سمح لنا نموذج الحلّ بتثبيت الصور /uploads/
على GCS، ما أدّى بشكلٍ تلقائي إلى فصل منطق التطبيق عن مساحة تخزين الصور.
يتطلّب منك هذا التمرين تنفيذ ما يلي:
- أن تكون قد أكملت التمرين في الفصل 6 (التخزين) بنجاح
- أن يكون لديك حزمة GCS تتضمّن عمليات تحميل الصور، حيث يحمّل المستخدمون الصور على تطبيقك وتتدفق الصور إلى حِزمك
إعداد دالة Cloud (باستخدام Python)
هل تساءلت يومًا عن كيفية تنفيذ تطبيق مستند إلى الأحداث؟ على سبيل المثال:
- عند حدوث <event> => إرسال رسالة إلكترونية
- عند وقوع <event> => إذا كان <condition> صحيحًا، عدِّل قاعدة البيانات.
يمكن أن يكون الحدث أيّ شيء، بدءًا من السجلّ الجديد المتوفّر في BigQuery أو عنصر جديد تم تغييره في مجلد في GCS أو رسالة جديدة في انتظار المعالجة في Pub/Sub.
توفّر Google Cloud نماذج متعددة لتحقيق ذلك. في ما يلي أهم التغييرات:
- EventArc: اطّلِع على كيفية تلقّي أحداث GCS. من الرائع إنشاء مخططات DAG وتنسيق الإجراءات استنادًا إلى صيغة if-then-else في السحابة الإلكترونية.
- Cloud Scheduler: وهي رائعة، على سبيل المثال، لتشغيل مهام cron في منتصف الليل في السحابة الإلكترونية.
- Cloud Workflows: على غرار "مسار الحدث"، تتيح لك هذه الميزة إجراء ما يلي:
- وظائف Cloud Run (المعروفة باسم
lambdas
) - Cloud Composer: هو في الأساس إصدار Google من Apache Airflow، وهو رائع أيضًا للمخططات البيانية للعمليات.
في هذا التمرين، سنغوص في Cloud Function لتحقيق نتيجة رائعة. وسنقدّم لك تمارين اختيارية.
يُرجى العلم أنّ نموذج الرمز متوفر ضمن .solutions/
.
إعداد دالة Cloud (🐍 python)
نحن نحاول إنشاء مبادرة طموحة جدًا.
- عند إنشاء صورة جديدة على GCS (ربما لأنّ أحد المستخدمين حمّله على التطبيق، ولكن ليس هذا فقط)
- .. يُرجى الاتصال بفريق Gemini لوصفها والحصول على وصف نصي للصورة .. (يُرجى التحقّق من تنسيق MIME والتأكّد من أنّها صورة وليست ملف PDF أو MP3 أو نصًا)
- .. وتعديل قاعدة البيانات باستخدام هذا الوصف (قد يتطلّب ذلك تصحيح قاعدة البيانات لإضافة عمود
description
إلى جدولimages
).
تصحيح قاعدة البيانات لإضافة description
إلى الصور
- افتح Cloud SQL Studio:
- أدخِل اسم المستخدم وكلمة المرور لقاعدة بيانات الصور.
- أدخِل طلب SQL هذا الذي يضيف عمودًا لوصف الصورة:
ALTER TABLE images ADD COLUMN description TEXT;
ونجحت الخطة. جرِّب الآن التحقّق مما إذا كان قد تم حلّ المشكلة:
SELECT * FROM images;
من المفترض أن يظهر لك عمود الوصف الجديد:
كتابة f(x) في Gemini
ملاحظة: تم إنشاء هذه الدالة باستخدام مساعدة Gemini في الترميز.
ملاحظة: عند إنشاء هذه الدالة، قد تواجه أخطاء في أذونات إدارة الهوية وإمكانية الوصول. تم توثيق بعضها أدناه ضمن الفقرة "الأخطاء المحتمَلة".
- تفعيل واجهات برمجة التطبيقات
- انتقِل إلى https://console.cloud.google.com/functions/list.
- انقر على "إنشاء دالة".
- تفعيل واجهات برمجة التطبيقات من معالج واجهة برمجة التطبيقات:
يمكنك إنشاء GCF من واجهة المستخدم أو من سطر الأوامر. سنستخدم هنا سطر الأوامر.
يمكن العثور على رمز محتمل ضمن .solutions/
.
- أنشئ مجلدًا لاستضافة الرمز البرمجي، مثل "gcf/". أدخِل المجلد.
- أنشئ ملف
requirements.txt
:
google-cloud-storage
google-cloud-aiplatform
pymysql
- أنشئ دالة 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
- ادفع الدالة. يمكنك استخدام نص برمجي مشابه لهذا النص: 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
.
اختبار E2E
حان الوقت لاختبار الدالة يدويًا.
- انتقِل إلى تطبيقك وسجِّل الدخول.
- تحميل صورة (يجب ألا تكون كبيرة جدًا، لأنّنا واجهنا مشاكل في الصور الكبيرة)
- التحقّق من واجهة المستخدم التي تم تحميل الصورة إليها
- تأكَّد من أنّه تم تعديل الوصف في Cloud SQL Studio. سجِّل الدخول وشغِّل هذا الاستعلام:
SELECT * FROM images
.
وهو أمر أثبت فعاليته. قد نحتاج أيضًا إلى تعديل الواجهة الأمامية لعرض هذا الوصف.
تعديل 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. قد تبدو النسخة الجميلة على النحو التالي:
الاستنتاجات
تم تنشيط إحدى وظائف 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
: "Pescara, Lungomare"
على الرغم من أنّه من الأفضل عادةً استخدام دالة N لنتائج N، إلا أنّه من المفيد جدًا استخدام دالة تؤدي 10 إجراءات. اطّلِع على هذه المقالة التي كتبها "ريكاردو" لمعرفة كيفية إجراء ذلك.
الأخطاء المحتمَلة (معظمها في "إدارة الهوية وإمكانية الوصول" / الأذونات)
عندما طوّرتُ هذا الحلّ لأول مرة، واجهتُ بعض المشاكل في أذونات إدارة الهوية وإمكانية الوصول. سأضيفها هنا للتعاطف معك وتقديم بعض الأفكار حول كيفية حلّها.
خطأ: لا تتوفّر أذونات كافية لحساب الخدمة
- يُرجى العِلم أنّه لتفعيل إحدى وظائف GCF التي تستمع إلى حزمة GCS، عليك إعداد الأذونات المناسبة لحساب الخدمة الذي تستخدمه في المهمة، كما هو موضّح في الشكل:
قد تحتاج أيضًا إلى تفعيل EventArc APIs قبل بضع دقائق من توفّرها بالكامل.
خطأ: لا يتوفّر عنصر Cloud Run invoker
- في ما يلي تعليق آخر من واجهة المستخدم بشأن أذونات GCF ( دور Cloud run Invoker):
يمكن إصلاح هذا الخطأ من خلال تنفيذ الأمر في الصورة، والذي يشبه fix-permissions.sh.
يمكنك الاطّلاع على وصف لهذه المشكلة هنا: https://cloud.google.com/functions/docs/securing/authenticating
خطأ: تم تجاوز الحد الأقصى المسموح به للذاكرة
في المرة الأولى التي أجريت فيها عملية التشغيل، أظهرت السجلات ما يلي: "تم تجاوز الحد الأقصى للذاكرة الذي يبلغ 244 ميغابايت، حيث تم استخدام 270 ميغابايت. ننصحك بزيادة الحد الأقصى للذاكرة، راجِع https://cloud.google.com/functions/docs/configuring/memory". أضِف ذاكرة وصول عشوائي (RAM) إلى GCF مرة أخرى. يمكنك إجراء ذلك بسهولة في واجهة المستخدم. في ما يلي مشكلة محتملة:
بدلاً من ذلك، يمكنك أيضًا إصلاح نص التشغيل لنشر Cloud لزيادة ذاكرة الوصول العشوائي/وحدة المعالجة المركزية. تستغرق هذه العملية وقتًا أطول قليلاً.
خطأ: تم نشر PubSub
أدّى إنشاء عامل تشغيل باستخدام الإصدار 1 من GCF إلى ظهور الخطأ التالي مرة واحدة:
يمكن حلّ هذه المشكلة مرة أخرى من خلال الانتقال إلى IAM ومنح حساب الخدمة دور "ناشر Pub/Sub".
خطأ: لم يتم استخدام Vertex AI
إذا ظهرت لك رسالة الخطأ هذه:
تم رفض الإذن: 403 لم يتم استخدام واجهة برمجة التطبيقات Vertex AI API في المشروع YOUR_PROJECT من قبل أو تم إيقافها. يمكنك تفعيلها من خلال الانتقال إلى https://console.developers.google.com/apis/api/aiplatform.googleapis.com/overview?project=YOR_PROJECT.
ما عليك سوى تفعيل واجهات برمجة تطبيقات Vertex AI. في ما يلي أسهل طريقة لتفعيل جميع واجهات برمجة التطبيقات المطلوبة:
- https://console.cloud.google.com/vertex-ai
- انقر على "تفعيل جميع واجهات برمجة التطبيقات المقترَحة".
خطأ: لم يتم العثور على مشغِّل EventArc
إذا ظهرت لك هذه الرسالة، يُرجى إعادة نشر الدالة.
خطأ: يتم توفير 400 موظّف دعم
يتم توفير 400 وكيل خدمة ( https://cloud.google.com/vertex-ai/docs/general/access-control#service-agents ). يجب توفُّر وكلاء الخدمة لقراءة ملف Cloud Storage المقدَّم. لذا يُرجى إعادة المحاولة بعد بضع دقائق.
إذا حدث ذلك، يُرجى الانتظار لبعض الوقت أو التواصل مع أحد موظفي Google.
10. الوحدة 8: إنشاء مستويات الخدمة لوقت الاستجابة لطلبات المستخدمين
في هذا الفصل، نحاول تحقيق ما يلي:
- إنشاء عروض الأسعار المتغيرة
- إنشاء مستويات الخدمة استنادًا إلى مؤشرات مستوى الخدمة
- إنشاء تنبيهات استنادًا إلى مستويات الخدمة
هذا موضوع مهم جدًا للمؤلف، لأنّ Riccardo يعمل في مجال SRE / DevOps في Google Cloud.
(مفتوح) إنشاء مؤشرات مستوى الخدمة ومستويات الخدمة الدنيا لهذا التطبيق
ما مدى جودة تطبيق لا يمكنك معرفة متى يتعذّر استخدامه؟
ما هو مستوى الخدمة (SLO)؟
هذا أمر شاق. ابتكرت Google أهداف مستوى الخدمة. للاطّلاع على مزيد من المعلومات، يمكنك الاطّلاع على ما يلي:
- كتاب SRE - الفصل 2 - تنفيذ اتفاقيات مستوى الخدمة (SLO) ( 👉 المزيد من كتب SRE)
- فنّ اتفاقيات مستوى الخدمة ( فيديو رائع) هذه الدورة التدريبية رائعة للتعرّف على مزيد من المعلومات حول كيفية وضع مستويات الخدمة المثالية لخدمتك.
- دورة تدريبية حول هندسة الاستمرارية في الخدمة على Coursera لقد ساهمتُ في ذلك.
الخطوة 1: إنشاء مقياس SLI/SLO لمستوى الخدمة المتعلّق بمدى التوفّر
لنبدأ بـ "مقياس مستوى الخدمة لوقت التوفّر"، لأنّه أسهل وأهم مقياس تريد قياسه.
لحسن الحظ، يوفّر Cloud Run دعمًا مُعدًّا مسبقًا لأهداف مستوى الخدمة، وذلك بفضل Istio.
بعد تشغيل تطبيقك على Cloud، يمكنك إجراء ذلك بسهولة تامة في غضون 30 ثانية.
- انتقِل إلى صفحة Cloud Run.
- انقر على تطبيقك أو اختَره.
- اختَر علامة التبويب
SLOs
. - انقر على "+ إنشاء مستوى الخدمة".
- مدى التوفّر، استنادًا إلى الطلب
- متابعة
- الشهر التقويمي / %99
- انقر على "إنشاء مستوى الخدمة".
الخطوة 2: إعداد التنبيهات بشأن مستوى الخدمة هذا
نقترح إنشاء تنبيهَين:
- سرعة استهلاك منخفضة ("بطيء") لتنبيهك عبر البريد الإلكتروني (يحاكي تذكرة منخفضة الأولوية)
- سرعة استهلاك عالية ("Fastburn") لتنبيهك عبر الرسائل القصيرة (يحاكي طلب الدعم ذي الأولوية العالية أو جهاز البيجر)
انتقِل إلى SLO tab
من قبل.
كرِّر هذه الخطوات مرّتين:
- انقر على "إنشاء تنبيه SLO" (الزر 🔔 مع علامة زائد في داخله، على يسار الصفحة).
- مدّة فترة معاينة الإعلان، الحدّ الأدنى لمعدّل الاستنفاد:
- [FAST]. الأولى:
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 بطريقتَين:
- Vertex AI: "طريقة Enterprise" المتداخلة مع Google Cloud Platform، والتي استكشَفناها في الفصل 7 (GCF+Gemini) تعمل جميع عمليات المصادقة بشكلٍ سحري، وتتداخل الخدمات مع بعضها بشكلٍ رائع.
- تكنولوجيات الذكاء الاصطناعي من 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 مثاليًا (أي أنّه لم يكن عليّ تغيير أي شيء):
في ما يلي التنسيق الجديد في تطبيق المؤلف الشخصي:
ملاحظة: يتم لصق الرمز كصورة لأنّنا لا نريد أن نشجعك على استخدام الرمز، بل نريد أن تطلب من Gemini كتابة الرمز نيابةً عنك، مع مراعاة قيود واجهة المستخدم/التصميم الإبداعي. صدقني، ستحتاج إلى إجراء تغييرات بسيطة جدًا بعد ذلك.
الأمان
إنّ تأمين هذا التطبيق بشكلٍ صحيح ليس هدفًا لهذه الورشة التي تبلغ مدتها 4 ساعات، لأنّ ذلك سيزيد من الوقت اللازم لإكمال هذه الورشة بمقدار من مرة إلى مرتين.
مع ذلك، هذا الموضوع مهم جدًا. لقد جمعنا بعض الأفكار في SECURITY
.
12. تهانينا!
مبروك 🎉🎉🎉، لقد نجحت في تحديث تطبيق PHP القديم باستخدام Google Cloud.
في ما يلي ملخص لما تعلمته في هذا الدرس التطبيقي حول الترميز:
- كيفية نشر قاعدة بيانات في 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 المتعددة الوسائط لحالة استخدام مناسبة.
- تنفيذ مبادئ SRE ضمن Google Cloud
هذه بداية رائعة لرحلتك في تحديث التطبيقات باستخدام Google Cloud.
🔁 الملاحظات
إذا أردت إخبارنا بتجربتك في هذه الورشة، ننصحك بملء هذا نموذج الملاحظات.
نرحب بملاحظاتك والطلبات بشأن أجزاء من الرمز البرمجي التي تفتخر بها بشكل خاص.
🙏 مع أطيب التحيّات،
يشكر المؤلف ميركو جيلولي وموريزيو إيبسالي من Datatonic على المساعدة في كتابة التقرير واختبار الحلّ.