1. مقدمة
ما سبب صعوبة إدارة التطبيقات؟
أحد الأسباب الرئيسية هو أنه غالبًا ما يتعين أن يكون المطوّرون مسؤولين عن النظم بدوام جزئي. ضع في اعتبارك هذه القائمة (الجزئية) المتعلقة بالمخاوف لتطوير تطبيق ويب حديث على مستوى الإنتاج ونشره وإدارته :
لا أعرف شيئًا عنك، لكن هذه هي كل الأشياء التي لا أريد أن أقلق بشأنها! ما أريد التفكير به حقًا هو منطق طلبي:
وباختصار، هو ما تدور حوله Cloud Run، ما يمنحك القدرة على التركيز على تطبيقك وترك كل مهام الإدارة والصيانة لشخص آخر، وبالتحديد شركة Google التي استثمرت ملايين الساعات في تحسين وإتقان مهاراتهم في هذا المجال.
بالإضافة إلى التحديات الإدارية المذكورة أعلاه، عليك أيضًا التعامل مع:
- التبعيات: يجب أن تتطابق البيئة التي يعمل فيها تطبيقك بشكل دقيق مع البيئة التي تم اختباره فيها، كلما أمكن ذلك. ويمكن أن يشمل ذلك أبعادًا عديدة، منها نظام التشغيل ومكتبات الدعم ومترجم اللغة أو برنامج التجميع وتكوين الأجهزة والعديد من العوامل الأخرى.
- التوزيع: إنّ الانتقال من تجسيد محلي لتطبيق إلى آخر تتم مشاركته على نطاق واسع على الإنترنت يتطلب غالبًا تغيير بيئة وقت التشغيل والقفزة الكمّية في مستوى التعقيد ومنحنى تعلّم شديد.
وتتولى Cloud Run هذه المشاكل وغيرها من المشاكل الكثيرة. ولكن بدلاً من أن نصدق ما سبق، لننشئ تطبيقًا معًا ونتعرّف على مدى سهولة الانتقال من بيئة تطوير محلية إلى تطبيق سحابي على مستوى الإنتاج في بضع خطوات بسيطة فقط.
الإجراءات التي ستنفّذها
- ستنشئ تطبيق ويب بسيطًا وتتحقق من تشغيله على النحو المتوقع في بيئة التطوير.
- وبعد ذلك، ستنتقل إلى إصدار حاوية للتطبيق نفسه. وفي أثناء ذلك، سوف تستكشف معنى إنشاء الحاويات وسبب أهميتها.
- وأخيرًا، ستنشر تطبيقك إلى السحابة، وستتعرف على مدى سهولة إدارة خدمة Cloud Run باستخدام سطر الأوامر وGoogle Cloud Console.
المعلومات التي ستطّلع عليها:
- كيفية إنشاء تطبيق بسيط لخادم الويب في Python
- كيفية حزم تطبيقك في حاوية Docker يتم تشغيلها من أي مكان
- طريقة نشر تطبيقك على السحابة الإلكترونية ليتمكّن أي مستخدم من تجربة تصميمك الجديد
- كيفية تبسيط الخطوات المذكورة أعلاه بشكل أكبر باستخدام حِزم Buildpacks
- كيفية استخدام أداة سطر الأوامر في Google Cloud وواجهة مستخدم الويب في Cloud Console
المتطلبات...
- متصفح الويب
- حساب Google
يستهدف هذا التمرين المعملي المطوّرين من جميع المستويات، بما في ذلك المبتدئين. ستستخدم بايثون، لكنك لست بحاجة إلى أن تكون على دراية ببرمجة بايثون لفهم ما يحدث لأننا سنشرح كل الرموز التي تستخدمها.
2. إكمال الإعداد
يتناول هذا القسم كل الإجراءات المطلوبة للبدء في هذا التمرين.
إعداد بيئة ذاتية
- سجِّل الدخول إلى Cloud Console وأنشِئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. (إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.)
يُرجى تذكُّر رقم تعريف المشروع، وهو اسم فريد في جميع مشاريع Google Cloud (سبق أن تم استخدام الاسم أعلاه ولن يكون مناسبًا لك). ستتم الإشارة إليها لاحقًا في هذا الدرس التطبيقي حول الترميز باسم PROJECT_ID
.
- بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام موارد Google Cloud.
إنّ تنفيذ هذا الدرس التطبيقي حول الترميز لن يكون مكلفًا أو مكلفًا على الإطلاق. احرص على اتّباع أي تعليمات في قسم "الحذف سريعًا". الذي يقدم لك نصائح حول كيفية إيقاف تشغيل الموارد حتى لا تتكبّد أي فواتير خارج نطاق هذا البرنامج التعليمي. يكون مستخدمو Google Cloud الجدد مؤهَّلون للانضمام إلى برنامج فترة تجريبية مجانية بقيمة 300 دولار أمريكي.
بدء Cloud Shell
ستعمل في هذا التمرين المعملي في جلسة Cloud Shell، وهي عبارة عن مترجم أوامر يستضيفه جهاز افتراضي يعمل على السحابة الإلكترونية من Google. كان بإمكانك تشغيل هذا القسم محليًا بسهولة على جهاز الكمبيوتر، ولكن استخدام Cloud Shell يمنح الجميع إمكانية الوصول إلى تجربة قابلة للتكرار في بيئة متسقة. بعد انتهاء التمرين المعملي، يمكنك إعادة محاولة استخدام هذا القسم على جهاز الكمبيوتر.
تفعيل Cloud Shell
- من Cloud Console، انقر على تفعيل Cloud Shell
.
إذا لم يسبق لك بدء تشغيل Cloud Shell، ستظهر لك شاشة وسيطة (الجزء السفلي غير المرئي من الصفحة) تصف ماهيتها. وفي هذه الحالة، انقر على متابعة (ولن تظهر لك مرة أخرى). إليك ما تبدو عليه هذه الشاشة التي تُستخدم لمرة واحدة:
من المفترَض أن تستغرق عملية توفير المتطلبات اللازمة والاتصال بخدمة Cloud Shell بضع دقائق فقط.
يتم تحميل هذا الجهاز الافتراضي مع جميع أدوات التطوير التي تحتاجها. وتوفّر هذه الشبكة دليلاً رئيسيًا دائمًا بسعة 5 غيغابايت ويتم تشغيله في Google Cloud، ما يحسّن بشكل كبير من أداء الشبكة والمصادقة. يمكنك تنفيذ معظم عملك، إن لم يكن كلّه، في هذا الدرس التطبيقي حول الترميز باستخدام متصفّح أو جهاز Chromebook.
بعد الربط بخدمة Cloud Shell، من المفترَض أن يظهر لك أنّه سبق أن تمت مصادقتك وأنّ المشروع قد تم ضبطه على رقم تعريف مشروعك.
- شغِّل الأمر التالي في Cloud Shell لتأكيد مصادقتك:
gcloud auth list
مخرجات الأمر
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
- شغّل الأمر التالي في Cloud Shell للتأكد من معرفة الأمر gcloud بمشروعك:
gcloud config list project
مخرجات الأمر
[core] project = <PROJECT_ID>
إذا لم يكن كذلك، يمكنك تعيينه من خلال هذا الأمر:
gcloud config set project <PROJECT_ID>
مخرجات الأمر
Updated property [core/project].
حدِّد بعض متغيّرات البيئة في الوحدة الطرفية لتسهيل مهامك اليومية باتّباع الخطوات التالية:
export PROJ=$GOOGLE_CLOUD_PROJECT export APP=hello export PORT=8080 export REGION="us-central1" export TAG="gcr.io/$PROJ/$APP"
تفعيل واجهات برمجة التطبيقات
في الخطوات اللاحقة، سترى الحاجة إلى هذه الخدمات (وسبب ذلك)، ولكن في الوقت الحالي، شغِّل هذا الأمر لمنح مشروعك إذن الوصول إلى خدمات Cloud Build وContainer Registry وCloud Run:
gcloud services enable cloudbuild.googleapis.com \ containerregistry.googleapis.com \ run.googleapis.com
يُفترض أن ينتج عن ذلك رسالة ناجحة مشابهة للرسالة التالية:
Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.
3- إنشاء تطبيق ويب بسيط
يمكنك البدء بالنقر على الزر Open Editor
أعلى لوحة Cloud Shell. تبدو هكذا:
ستجد بعد ذلك في بيئة IDE مشابهة لـ Visual Studio Code، حيث يمكنك إنشاء مشاريع وتعديل رمز المصدر وتشغيل برامجك وما إلى ذلك. إذا كانت شاشتك ضيقة جدًا، فيمكنك توسيع أو تقليص الخط الفاصل بين وحدة التحكم ونافذة التعديل/الطرفية عن طريق سحب الشريط الأفقي بين هاتين المنطقتين، كما هو موضح هنا:
يمكنك التبديل بين المحرر والمحطة الطرفية من خلال النقر على الزرين Open Editor
وOpen Terminal
على التوالي. حاول التبديل بين هاتين البيئتين الآن.
بعد ذلك، أنشئ مجلدًا لتخزين فيه عملك ضمن هذا التمرين، وذلك عن طريق تحديد ملف-> مجلد جديد وإدخال hello
ثم النقر على OK
. وستجري في هذا المجلد جميع الملفات التي تنشئها في هذا التمرين وكل الأعمال التي تنفذها في Cloud Shell.
يمكنك الآن إنشاء ملف requirements.txt
. ويخبر ذلك Python بالمكتبات التي يعتمد عليها تطبيقك. في تطبيق الويب البسيط هذا، ستستخدم وحدة Python شائعة لإنشاء خوادم ويب تُسمى Flask
وإطار عمل لخادم الويب يُسمى gunicorn
. في نافذة Cloud Editor، انقر على "File" (ملف)-> "New File" (ملف جديد) لإنشاء ملف جديد. عندما يُطلب منك إدخال اسم الملف الجديد، أدخِل requirements.txt
واضغط على الزر OK
. تأكد من أن الملف الجديد ينتهي به الأمر في مجلد مشروع hello
.
أدخِل الأسطر التالية في الملف الجديد للإشارة إلى أنّ تطبيقك يعتمد على حزمة Python Flask وخادم الويب gunicorn.
Flask gunicorn
لست بحاجة إلى حفظ هذا الملف بشكلٍ صريح لأنّ Cloud Editor سيحفظ التغييرات تلقائيًا لك.
النسخة 1: مرحبًا بكم
باستخدام الأسلوب نفسه، أنشئ ملفًا جديدًا آخر باسم main.py
. سيكون هذا هو ملف المصدر الرئيسي (والوحيد) لتطبيقك بلغة Python. مرة أخرى، تأكَّد من أنّ الملف الجديد ينتهي في مجلد مشروع "hello
".
أدرِج الرمز التالي في هذا الملف:
from flask import Flask
import os
import random
app = Flask(__name__) # Create a Flask object.
PORT = os.environ.get("PORT") # Get PORT setting from the environment.
# The app.route decorator routes any GET requests sent to the root path
# to this function, which responds with a "Hello world!" HTML document.
@app.route("/", methods=["GET"])
def say_hello():
html = "<h1>Hello world!</h1>"
return html
# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
app.run(host="0.0.0.0", port=PORT)
عُد مرة أخرى إلى الوحدة الطرفية ثم انتقِل إلى مجلد المشروع باستخدام الأمر التالي:
cd hello
شغّل الأمر التالي لتثبيت تبعيات المشروع:
pip3 install -r requirements.txt
شغِّل التطبيق الآن من خلال تنفيذ الأمر التالي في الوحدة الطرفية:
python3 main.py
في هذه المرحلة، يتم تشغيل تطبيقك على الجهاز الافتراضي المخصّص لجلسة Cloud Shell. يشتمل Cloud Shell على آلية خادم وكيل تتيح لك الوصول إلى خوادم الويب (مثل الخادم الذي بدأته للتو) التي يتم تشغيلها على جهازك الافتراضي من أي مكان على شبكة الإنترنت العالمية.
انقر على الزر web preview
ثم على عنصر القائمة Preview on Port 8080
على النحو التالي:
سيؤدي ذلك إلى فتح علامة تبويب متصفّح ويب للوصول إلى التطبيق قيد التشغيل، والذي من المفترض أن يبدو على النحو التالي:
الإصدار 2: صدى مسار عنوان URL
ارجع إلى Cloud Editor (عبر الزر Open Editor
) وأضِف دعمًا للاحقة لاحقة عنوان URL اختيارية من خلال تعديل ملف main.py
على النحو التالي:
from flask import Flask
import os
import random
app = Flask(__name__) # Create a Flask object.
PORT = os.environ.get("PORT") # Get PORT setting from environment.
# The app.route decorator routes any GET requests sent to the root path
# to this function, which responds with a "Hello world!" HTML document.
# If something is specified as the URL path (after the '/'), say_hello()
# responds with "Hello X", where X is the string at the end of the URL.
@app.route("/", methods=["GET"])
@app.route("/<name>", methods=["GET"]) # ← NEW
def say_hello(name="world"): # ← MODIFIED
html = f"<h1>Hello {name}!</h1>" # ← MODIFIED
return html
# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
app.run(host="0.0.0.0", port=PORT)
عُد إلى "المحطة الطرفية" (عبر الزر Open Terminal
) وأدخل control-C
(اضغط مع الاستمرار على مفتاح التحكم "C") لإيقاف التطبيق قيد التشغيل ثم أعِد تشغيله عن طريق إدخال:
python3 main.py
مرة أخرى، انقر على الزر web preview
ثم على عنصر القائمة Preview on Port 8080
لفتح علامة تبويب في متصفّح الويب للوصول إلى التطبيق قيد التشغيل. ينبغي أن ترى "مرحبًا بالعالم!" مرة أخرى ولكن استبدل الآن نص عنوان URL الذي يلي حرف الشرطة المائلة بأي سلسلة من اختيارك (مثل /your-name
) وتأكد من ظهور شيء مثل هذا:
الإصدار 3: ألوان عشوائية
ويمكنك الآن إتاحة ألوان الخلفيات العشوائية من خلال الرجوع إلى Cloud Editor (عبر الزر Open Editor
) وتعديل ملف main.py
على النحو التالي:
from flask import Flask
import os
import random
app = Flask(__name__) # Create a Flask object.
PORT = os.environ.get("PORT") # Get PORT setting from the environment.
# This function decides whether foreground text should be
# displayed in black or white, to maximize fg/bg contrast.
def set_text_color(rgb): # ← NEW
sum = round( # ← NEW
(int(rgb[0]) * 0.299) # ← NEW
+ (int(rgb[1]) * 0.587) # ← NEW
+ (int(rgb[2]) * 0.114) # ← NEW
) # ← NEW
return "black" if sum > 186 else "white" # ← NEW
# The app.route decorator routes any GET requests sent to the root path
# to this function, which responds with a "Hello world!" HTML document.
# If something is specified as the URL path (after the '/'), say_hello()
# responds with "Hello X", where X is the string at the end of the URL.
# To verify each new invocation of these requests, the HTML document
# includes CSS styling to produce a randomly colored background.
@app.route("/", methods=["GET"])
@app.route("/<name>", methods=["GET"])
def say_hello(name="world"):
bg = random.sample(range(1, 255), 3) # ← NEW
hex = (int(bg[0]) * 256) + (int(bg[1]) * 16) + int(bg[2]) # ← NEW
fg_color = set_text_color(bg) # ← NEW
bg_color = f"#{hex:06x}" # ← NEW
style = f"color:{fg_color}; background-color:{bg_color}" # ← NEW
html = f'<h1 style="{style}">Hello {name}!</h1>' # ← MODIFIED
return html
# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
app.run(host="0.0.0.0", port=PORT)
عُد إلى "المحطة الطرفية" (عبر الزر Open Terminal
) وأدخل control-C
(اضغط مع الاستمرار على مفتاح التحكم "C") لإيقاف التطبيق قيد التشغيل ثم أعِد تشغيله عن طريق إدخال:
python3 main.py
مرة أخرى، انقر على الزر web preview
ثم على عنصر القائمة Preview on Port 8080
لفتح علامة تبويب في متصفّح الويب للوصول إلى التطبيق قيد التشغيل. من المفترض أن يظهر لك النص الذي تم إنشاؤه، مع أي لاحقة محددة أو الإعداد التلقائي "مرحبًا بالعالم!" سلسلة، معروضة أمام خلفية ذات ألوان عشوائية، على النحو التالي:
أعِد تحميل الصفحة عدة مرات لترى أنّ لون الخلفية العشوائي يتغيّر في كل مرة تزور فيها التطبيق.
وبهذا، نكون قد اكتمل تطبيقك - تهانينا! في الخطوة التالية، ستتعرّف على كيفية تجميع تطبيقك في حاوية، والغرض من إجراء ذلك.
4. تعبئة تطبيقك في حاويات
ما هي الحاوية؟
تتيح لنا الحاويات بشكل عام، و Docker على وجه الخصوص، إنشاء مربّع نموذجي لتشغيل تطبيق مع تجميع كل ملحقاته معًا. نطلق على النتيجة صورة حاوية. في هذا القسم، ستقوم بإنشاء صورة حاوية، ستستخدمها لتغليف تطبيقك وجميع تبعياته.
بالحديث عن العناصر الاعتمادية، في خطوة سابقة، عندما كنت تشغِّل تطبيقك في بيئة المطوِّرين، كان عليك تشغيل pip3 install -r requirements.txt
والتأكّد من أنّ ملف items.txt يحتوي على جميع المكتبات التابعة لك والإصدارات المقابلة لها. باستخدام الحاويات، يمكنك تثبيت تلك المتطلبات عند إنشاء صورة الحاوية، لذلك لا داعي لقلق مستهلك الحاوية بشأن تثبيت أي حاويات.
ستشكّل صورة الحاوية هذه الوحدة الأساسية لنشر تطبيقك على نظام التشغيل Cloud Run. ونظرًا لأنه يمكن استخدام الحاويات على أي خادم افتراضي أو حقيقي تقريبًا، فإنّ هذا يتيح لنا طريقة لنشر تطبيقك في أي مكان تريده ونقل تطبيقك من مقدّم خدمة إلى آخر أو من داخل الشركة إلى السحابة.
تساعد الحاويات في جعل تطبيقاتك:
- قابلة لإعادة الإنتاج - الحاويات مستقلة وكاملة
- النقل - تعد الحاويات وحدات أساسية في مجالات مختلفة - تتيح إمكانية نقل التطبيقات عبر مزوّدي خدمات السحابة الإلكترونية وبيئاتها
باختصار، تتيح الحاويات أخيرًا "الكتابة مرة واحدة والتشغيل في كل مكان". ويتمثل استثناء واحد لتلك القاعدة في أنّ الحاوية التي تم إنشاؤها تقتصر على نوع المعالج الذي تم إنشاؤها عليه، ولكن هناك طرق لإنشاء إصدارات حاوية لإعدادات الأجهزة الأخرى أيضًا.
تحدّثنا بما يكفي - لنصنع وعاءً. ستستخدم تكنولوجيا معيّنة لإنشاء حاوية باسم Docker.
في Cloud Editor، أنشِئ ملفًا جديدًا باسم Dockerfile
. هذا الملف هو مخطط أساسي لإنشاء صورتك. فهي تخبر Docker ببيئة التشغيل ورمز المصدر لديك وكيفية تثبيت اعتمادياتك وإنشاء تطبيقك وتشغيل التعليمة البرمجية.
# Use an official lightweight Python image.
FROM python:3.9-slim
# Copy local code to the container image.
WORKDIR /app
COPY main.py .
COPY requirements.txt .
# Install dependencies into this container so there's no need to
# install anything at container run time.
RUN pip install -r requirements.txt
# Service must listen to $PORT environment variable.
# This default value facilitates local development.
ENV PORT 8080
# Run the web service on container startup. Here you use the gunicorn
# server, with one worker process and 8 threads. For environments
# with multiple CPU cores, increase the number of workers to match
# the number of cores available.
CMD exec gunicorn --bind 0.0.0.0:$PORT --workers 1 --threads 8 --timeout 0 main:app
في Cloud Terminal، يمكنك إنشاء صورة الحاوية باستخدام Cloud Build، وذلك من خلال تنفيذ الأمر التالي:
gcloud builds submit --tag $TAG
بعد الدفع إلى قاعدة بيانات المسجّلين، ستظهر لك رسالة SUCCESS
تتضمّن اسم الصورة. ومن المفترض أن تبدو هذه الرسالة على النحو التالي: gcr.io/<project-id>/hello
. تم تخزين الصورة الآن في Google Container Registry ويمكن إعادة استخدامها متى وأينما شئت.
يمكنك إدراج جميع صور الحاوية المرتبطة بمشروعك الحالي باستخدام الأمر التالي:
gcloud container images list
يمكنك الآن تشغيل التطبيق واختباره محليًا من Cloud Shell، باستخدام أوامر docker
التالية:
docker run -p $PORT:$PORT -e PORT=$PORT $TAG
يطلب الخيار -p $PORT:$PORT
من Docker ربط المنفذ الخارجي $PORT
(الذي تمّ ضبطه على الرقم 8080 أعلاه) في البيئة المضيفة برقم المنفذ نفسه داخل الحاوية قيد التشغيل. وهذا يجعل الحياة أسهل لأنّ الرمز البرمجي للخادم الذي تكتبه ورقم المنفذ الخارجي الذي تتصل به عند اختبار تطبيقك سيكونا هما نفسهما (8080)، ولكن يمكنك بسهولة استخدام الخيار -p لتعيين أيّ منفذ خارجي عشوائي على المضيف إلى أيّ منفذ داخلي مطلوب داخل الحاوية.
يطلب الخيار -e PORT=$PORT
من Docker إتاحة متغيّر بيئة $PORT
(المضبوط على 8080 أعلاه) لتطبيقك الذي يتم تشغيله داخل الحاوية.
أصبحت الآن جاهزًا لاختبار تطبيقك من خلال توجيه متصفح الويب إلى رمز Python الذي يتم تشغيله داخل الحاوية. في نافذة Cloud Shell، انقر على "معاينة الويب" وحدد "معاينة على المنفذ 8080"، كما فعلت في الخطوة السابقة.
من المفترض أن تبدو النتيجة مألوفة، من المفترض أن يظهر النص الذي تم إنشاؤه أمام خلفية ذات ألوان عشوائية، تمامًا كما فعلت عند تشغيل التطبيق مباشرةً في الوحدة الطرفية في Cloud Shell. أعِد تحميل الصفحة عدة مرات لترى أنّ لون الخلفية العشوائي يتغيّر في كل مرة تزور فيها التطبيق.
تهانينا! لقد شغَّلت الآن إصدارًا محوَّلاً من تطبيقك. في القسم التالي، بدون لمس سطر من الرمز، ستحوِّل صورة الحاوية إلى تطبيق ويب عالي الجودة للإنتاج.
5- إلى السحابة الإلكترونية...
الآن وبعد أن أنشأت تطبيقك في حاويات، عليك مشاركة هذه المزايا الرائعة مع بقية العالم، لذا حان الوقت لنشره على السحابة الإلكترونية. ولكنك ترغب حقًا في القيام بأكثر من مجرد مشاركته. يجب التأكّد من أنّه:
- يعمل بشكل موثوق - فأنت تتخطى الأخطاء تلقائيًا في حالة تعطُّل جهاز كمبيوتر يعمل بتطبيقك
- يتطور تلقائيًا - سيواكب تطبيقك مستويات هائلة من الزيارات، ويقلل تلقائيًا من بصمته عند عدم استخدامه.
- إلى خفض التكاليف، من خلال عدم تحصيل رسوم منك مقابل الموارد التي لا تستخدمها، بل يتم تحصيل رسوم منك فقط مقابل الموارد المستهلكة أثناء الاستجابة للزيارات
- يمكن الوصول إليها عبر اسم مجال خاص - يمكنك الوصول إلى حل بنقرة واحدة لتعيين اسم مجال خاص لخدمتك
- وقت استجابة ممتاز - عمليات التشغيل على البارد سريعة الاستجابة بشكل معقول ولكن يمكنك تحسين ذلك من خلال تحديد تهيئة الحد الأدنى للمثيل
- يتوافق مع التشفير التام بين الأطراف باستخدام أمان الويب العادي من خلال طبقة المقابس الآمنة (SSL)/بروتوكول أمان طبقة النقل (TLS)، فعند نشر إحدى الخدمات، تحصل على تشفير الويب العادي، والشهادات المطلوبة المقابلة، مجانًا وتلقائيًا.
من خلال نشر تطبيقك على Google Cloud Run، يمكنك الحصول على كل ما سبق والمزيد.
نشر تطبيقك في Cloud Run
لنبدأ أولاً بتعديل تطبيقك حتى تتمكن من التفريق بين النسخة الجديدة والقديمة. ويمكنك إجراء ذلك من خلال تعديل الملف main.py
بحيث تتغير الرسالة التلقائية من "مرحبًا بالعالم!" إلى "مرحبًا بك من Cloud Run!" بمعنى آخر، غيِّر هذا السطر في main.py
من هذا السطر:
def say_hello(name="world"):
إلى هذا:
def say_hello(name="from Cloud Run"):
يتميّز Cloud Run بأنّه إقليمي، ما يعني أنّ البنية الأساسية التي تدير خدمات Cloud Run تقع في منطقة محدّدة وتديرها Google لتكون متاحة بشكلٍ متكرّر في جميع المناطق ضمن تلك المنطقة. في قسم "خطوات الإعداد" أعلاه، فقد قمت بتحديد منطقة تلقائية من خلال متغير بيئة REGION
.
أعِد إنشاء صورة الحاوية وانشر تطبيقك المحوَّل إلى السحابة الإلكترونية باستخدام الأمر التالي:
gcloud builds submit --tag $TAG gcloud run deploy "$APP" \ --image "$TAG" \ --platform "managed" \ --region "$REGION" \ --allow-unauthenticated
- يمكنك أيضًا تحديد منطقة تلقائية باستخدام
gcloud config set run/region $REGION
. - ويؤدي الخيار
--allow-unauthenticated
إلى جعل الخدمة متاحة للجميع. لتجنُّب الطلبات التي لم تتم مصادقتها، استخدِم--no-allow-unauthenticated
بدلاً من ذلك.
الصورة المحددة هنا هي صورة Docker التي أنشأتها في الخطوة الأخيرة. بفضل خدمة Cloud Build، يمكن لخدمة Cloud Run العثور على الصورة ونشرها نيابةً عنك.
انتظِر بضع لحظات حتى تكتمل عملية النشر. عند نجاح العملية، يعرض سطر الأوامر عنوان URL للخدمة:
Deploying container to Cloud Run service [hello] in project [PROJECT_ID... ✓ Deploying new service... Done. ✓ Creating Revision... Revision deployment finished. Waiting for health check... ✓ Routing traffic... ✓ Setting IAM Policy... Done. Service [hello] revision [hello-...] has been deployed and is serving 100 percent of traffic. Service URL: https://hello-....a.run.app
يمكنك أيضًا استرداد عنوان URL للخدمة باستخدام الأمر التالي:
gcloud run services describe hello \ --platform managed \ --region $REGION \ --format "value(status.url)"
يُفترض أن يظهر هذا شيئًا مثل:
https://hello-....a.run.app
هذا الرابط هو عنوان URL مخصَّص لخدمة "تشغيل السحابة الإلكترونية" مع أمان بروتوكول أمان طبقة النقل (TLS). هذا الرابط دائم (طالما لم يتم إيقاف الخدمة) وقابل للاستخدام في أي مكان على الإنترنت. ولا يستخدم آلية الخادم الوكيل لـ Cloud Shell المذكورة سابقًا، والتي كانت تعتمد على جهاز افتراضي عابر.
انقر على Service URL
المميّز لفتح علامة تبويب في متصفّح الويب للوصول إلى تطبيقك قيد التشغيل. من المفترض أن تعرض النتيجة رسالة "مرحبًا من Cloud Run!" رسالة أمام خلفية ذات ألوان عشوائي.
تهانينا! يتم تشغيل تطبيقك الآن على السحابة الإلكترونية من Google. وبدون الحاجة إلى التفكير في الأمر، سيكون تطبيقك متاحًا للجميع، ومزودًا بتشفير TLS (HTTPS)، بالإضافة إلى إمكانية التوسيع التلقائي لمستويات زيارات مذهلة.
لكن أعتقد أن هذه العملية يمكن أن تكون أكثر سهولة...
6- إنشاء الحاوية تلقائيًا
هذا رائع جدًا، ولكن ماذا لو لم أكن أرغب في التفكير في ملفات Dockerfiles والحاويات. ماذا لو أردتُ، مثل معظم المطوِّرين، التركيز على كتابة رمز تطبيقي وترك قلق الآخرين بشأن احتوائه على حاويات. أنت محظوظ لأنّ Cloud Run يوفّر معيارًا مفتوحًا المصدر يسمى Buildpacks، وهو مستخدَم لهذا السبب تحديدًا وهو: برمجة عملية تصنيع حاوية من مجموعة من ملفات المصدر.
يُرجى العلم أنّ هناك بعض الحالات التي قد يفضّل فيها المطوّر استخدام ملف Dockerfile صريح، على سبيل المثال إذا كان يريد الحصول على درجة عالية من التخصيص في كيفية إنشاء الحاوية. في الحالات الشائعة مثل هذا التمرين، تعمل حِزم الإنشاء بشكل جيد وتتجنّب الحاجة إلى صياغة Dockerfile
يدويًا. لنبدأ في تعديل الرمز البرمجي لاستخدام حِزم التطبيقات.
لنبدأ أولاً بتعديل تطبيقك حتى تتمكن من التفريق بين النسخة الجديدة والقديمة. ويمكنك إجراء ذلك من خلال تعديل ملف main.py
بحيث تتغير الرسالة التلقائية من "مرحبًا من Cloud Run!" إلى "مرحبًا بك من Cloud Run with Buildpacks!". بمعنى آخر، غيِّر هذا السطر في main.py
من هذا السطر:
def say_hello(name="from Cloud Run"):
إلى هذا:
def say_hello(name="from Cloud Run with Buildpacks"):
الآن، يمكننا الاستفادة من حِزم التطبيقات بإنشاء ملف جديد باسم "Procfile
". تابع وأنشئ هذا الملف في Cloud Editor وأدرج هذا السطر من النص:
web: python3 main.py
يؤدي ذلك إلى إعلام نظام الإصدارات القديمة بكيفية تشغيل تطبيقك في الحاوية التي يتم إنشاؤها تلقائيًا. باستخدام هذه التعليمات، لن تحتاج حتى إلى ملف Dockerfile بعد الآن. للتحقق من ذلك، احذف ملف Dockerfile وشغِّل الأمر التالي في الوحدة الطرفية في Cloud Shell:
gcloud beta run deploy "$APP" \ --source . \ --platform "managed" \ --region "$REGION" \ --allow-unauthenticated
هذا مشابه للأمر الذي نفّذته لنشر تطبيقك في الخطوة الأخيرة، ولكنّك استبدلت الخيار "--image
" في هذه المرة بالخيار "--source .
". يؤدي ذلك إلى إعلام الأمر gcloud
بأنّك تريد أن يستخدم الإصدار حزم التطبيقات لإنشاء صورة الحاوية استنادًا إلى الملفات المصدر التي يعثر عليها في الدليل الحالي (اختصارًا dot
في --source .
للدليل الحالي). بما أنّ الخدمة تعتني بصورة الحاوية بشكل ضمني، لن تحتاج إلى تحديد صورة في الأمر gcloud
هذا.
مرّة أخرى، يمكنك التحقّق من نجاح عملية النشر هذه من خلال النقر على Service URL
المميّزة لفتح علامة تبويب متصفّح ويب على التطبيق قيد التشغيل والتأكّد من أنّ الخدمة تعرض الرسالة "مرحبًا من Cloud Run with Buildpacks!" أمام خلفية ملونة بشكل عشوائي.
عند استخدام حِزم الإصدار لتصنيع Dockerfile
، تمكّنت من تقليل الخطوات الثلاث السهلة إلى اثنتَين:
- أنشئ تطبيقًا في بيئة التطوير الخاصة بك.
- انشر الرمز نفسه على السحابة الإلكترونية باستخدام أمر واحد.
7. هل يجب استخدام سطر الأوامر؟
لا مثل كل خدمة Google Cloud تقريبًا، هناك ثلاث طرق للتفاعل مع Cloud Run:
- أداة سطر أوامر gcloud، التي اطّلعت عليها للتو.
- واجهة مستخدم ويب غنية، عبر Cloud Console، تدعم نمطًا سلسًا يعتمد على النقاط والتفاعل مع النقرات.
- من الناحية الآلية، تم استخدام مكتبات عملاء Google المتوفرة للعديد من اللغات الرائجة، بما في ذلك Java وC# وPython وGo وJavascript وRuby وC/C++ وغيرها.
لننشر مثيلاً إضافيًا لتطبيق تشغيل السحابة الإلكترونية باستخدام واجهة مستخدم وحدة التحكم. انتقِل إلى الصفحة المقصودة لخدمة Cloud Run عبر القائمة في أعلى يمين الصفحة:
من المفترض بعد ذلك أن يظهر لك ملخص لـ "خدمات تشغيل السحابة الإلكترونية"، مثل هذا:
انقروا على "إنشاء خدمة" رابط لبدء عملية النشر:
أدخِل عبارة "مرحبًا مرة أخرى". كاسم للخدمة، فاستعن بمنصة النشر الافتراضية والمنطقة، وانقر على "التالي".
أدخل عنوان URL هذا لصورة الحاوية: gcr.io/cloudrun/hello
، وهو حاوية صنعتها Google لأغراض الاختبار، وانقر على "الإعدادات المتقدمة" للاطّلاع على بعض إعدادات الضبط العديدة المتاحة لك. يمكنك تخصيص بعض النقاط أيضًا:
- رقم المنفذ ونقطة دخول الحاوية (والتي ستلغي نقطة الدخول المحددة عند إنشاء الحاوية)
- الأجهزة: الذاكرة وعدد وحدات المعالجة المركزية (CPU)
- التحجيم: الحد الأدنى والأقصى للمثيلات
- متغيرات البيئة
- غير ذلك: إعداد مهلة الطلب، والحد الأقصى لعدد الطلبات لكل حاوية، HTTP/2
انقر على "التالي" لتقدم مربع الحوار. يسمح لك مربّع الحوار التالي بتحديد كيفية تشغيل الخدمة. بالنسبة إلى "الدخول"، اختَر "السماح بجميع الزيارات"، وبالنسبة إلى "المصادقة"، اختَر "السماح بالزيارات التي لم تتم مصادقتها".
هذه هي الإعدادات الأكثر حرية، حيث إنها تسمح لأي شخص بالوصول إلى تطبيق Cloud Run من أي مكان على الإنترنت العام، بدون تحديد بيانات اعتماد المصادقة. قد تحتاج إلى ضبط إعدادات أكثر تقييدًا لتطبيقك، ولكن دعنا نجعل الأمر بسيطًا في تمرين التعلم هذا.
انقر الآن على زر Create
لإنشاء خدمة Cloud Run. بعد بضع ثوانٍ، من المفترض أن تظهر الخدمة الجديدة في قائمة ملخص خدمات Cloud Run. يعرض سطر الملخّص أحدث عملية نشر (التاريخ/الوقت والمستخدمين) إلى جانب بعض إعدادات الضبط الرئيسية. انقر على رابط اسم الخدمة للتوغّل في تفاصيل خدمتك الجديدة.
لإثبات ملكية الخدمة، انقر على عنوان URL المعروض بالقرب من أعلى صفحة الملخّص كما هو موضّح في المثال أدناه:
ينبغي أن تظهر لك على النحو التالي:
الآن بعد أن نشرت خدمة جديدة في Cloud Run، اختَر علامة التبويب REVISIONS
للاطّلاع على بعض الطرق لإدارة عمليات نشر متعدّدة.
لنشر نُسخ جديدة من وحدة التحكم مباشرةً، يمكنك النقر على الزر EDIT & DEPLOY NEW REVISION
، كما هو موضح في مثال لقطة الشاشة أدناه:
انقر على هذا الزر الآن لإنشاء نسخة سابقة جديدة. بالقرب من عنوان URL للحاوية، انقر على الزر SELECT
كما هو موضّح أدناه:
في مربع الحوار الذي ينبثق، ابحث عن تطبيق الويب البسيط الذي نشرته من Cloud Build باستخدام Buildpacks في وقت سابق، ثمّ انقر على "اختيار". تأكَّد من اختيار صورة الحاوية أسفل
gcr.io/<project>/cloud-run-source-deploy
المجلد، على النحو التالي:
بعد اختياره، انتقِل إلى الأسفل وانقر على الزر DEPLOY
. تم نشر نسخة جديدة من تطبيقك الآن. لإثبات الملكية، يمكنك إعادة الانتقال إلى عنوان URL للخدمة مرة أخرى والتأكّد من ظهور الرسالة الملوّنة "مرحبًا من Cloud Run with Buildpacks!" تطبيق الويب.
كما ترى، توفر علامة تبويب "النُسخ السابقة" ملخصًا لكل نسخة سابقة نشرتها، ومن المفترض أن تظهر لك الآن مراجعتان لهذه الخدمة. يمكنك تحديد نسخة سابقة معينة من خلال النقر على زر الاختيار على يمين اسم النسخة السابقة، والذي سيعرض ملخصًا لتفاصيل النسخة السابقة على الجانب الأيسر من الشاشة. بتحديد هذه الأزرار، يمكنك رؤية أن النسختين مشتقتين من صورتي حاويات مختلفتين.
يتيح لك الزر MANAGE TRAFFIC
تعديل توزيع الطلبات الواردة التي تم إرسالها إلى مراجعة معيّنة. تتيح هذه القدرة على ضبط مقدار الزيارات الذي يتم إرساله إلى مراجعة معينة تفعيل العديد من حالات الاستخدام القيّمة:
- كناري يختبر إصدارًا جديدًا من تطبيقك بجزء صغير من الزيارات الواردة
- إعادة الزيارات من إصدار به مشكلة إلى نسخة سابقة
- اختبار A/B
يمكنك العثور على زر "MANAGE TRAFFIC
" هنا:
قم بتهيئة تقسيم عدد الزيارات 50/50 بين عمليتي المراجعة عن طريق تحديد تقسيم عدد الزيارات 50/50 على النحو التالي:
انقر الآن على الزر "حفظ" وتحقَّق من التقسيم 50/50 من خلال الانتقال إلى عنوان URL الخاص بالخدمة مرارًا وتكرارًا والتأكّد من أنّ نصف طلباتك يتم في المتوسط من خلال النسخة الحالية ("مرحبًا من Cloud Run with Buildpacks!") والنصف الآخر من خلال النسخة السابقة ("إنه قيد التشغيل!").
تتيح علامات التبويب الأخرى في صفحة "تفاصيل الخدمة" مراقبة الأداء وعدد الزيارات والسجلات، والتي توفّر إحصاءات قيّمة حول مدى صعوبة عمل الخدمة. يمكنك أيضًا تحسين الوصول إلى خدمتك من خلال "الأذونات" . خصِّص بضع دقائق لاستكشاف علامات التبويب في هذه الصفحة للتعرّف على الإمكانات المتاحة هنا.
الواجهة الآلية
كما أشرنا سابقًا، يمكنك أيضًا إنشاء خدمات تشغيل السحابة الإلكترونية ونشرها وإدارتها آليًا. بالنسبة إلى المهام اليدوية، يعد هذا الخيار أكثر تقدمًا من سطر الأوامر أو وحدة تحكم الويب، ولكنه بالتأكيد الطريقة التي يجب اتباعها لأتمتة خدمات تشغيل السحابة الإلكترونية. يتوفّر لك خيار استخدام مكتبات برامج Google بعدة لغات برمجة شائعة.
8. اختبار تطبيقك
في هذه الخطوة الأخيرة، ستُجري اختبار حِمل اصطناعي لاختبار تطبيقك لقياس مدى الإجهاد ومشاهدة مدى تغيّره مع ارتفاع الطلب. ستستخدم أداة تسمى Hey، وهي مثبَّتة مسبقًا في Cloud Shell وتمنحنا إمكانية إجراء اختبارات التحميل وعرض النتائج.
إجراء الاختبار
في Cloud Shell Terminal، شغِّل الأمر التالي لإجراء اختبار تحميل:
hey -q 1000 -c 200 -z 30s https://hello-...run.app
يتم تفسير وسيطات الأمر على النحو التالي:
-q 1000
: محاولة تحميل التحميل بحوالي 1,000 طلب في الثانية-c 200
- تخصيص 200 عامل متوازي-z 30s
: إجراء اختبار التحميل لمدة 30 ثانية- تأكَّد من استخدام عنوان URL للخدمة كوسيطة أخيرة في سطر الأوامر هذا.
من المفترض أن تبدو نتائج الاختبار على النحو التالي:
Summary:
Total: 30.2767 secs
Slowest: 3.3633 secs
Fastest: 0.1071 secs
Average: 0.1828 secs
Requests/sec: 1087.2387
Total data: 3028456 bytes
Size/request: 92 bytes
Response time histogram:
0.107 [1] |
0.433 [31346] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
0.758 [1472] |■■
1.084 [82] |
1.410 [4] |
...
Latency distribution:
...
50% in 0.1528 secs
75% in 0.1949 secs
90% in 0.2442 secs
95% in 0.4052 secs
99% in 0.7062 secs
Details (average, fastest, slowest):
...
req write: 0.0000 secs, 0.0000 secs, 0.0232 secs
resp wait: 0.1824 secs, 0.1070 secs, 3.2953 secs
resp read: 0.0000 secs, 0.0000 secs, 0.0010 secs
Status code distribution:
[200] 32918 responses
يوضح لنا هذا الملخص العديد من العناصر المهمة:
- وتم إرسال 32918 طلبًا بسرعة ألف/ثانية تقريبًا لمدة 30 ثانية.
- لم تكن هناك أخطاء (200 استجابة HTTP فقط).
- كان متوسط وقت الاستجابة 180 ملي ثانية.
- كان الحد الأدنى لوقت الاستجابة 107 ملي ثانية، ولكن كانت أسوأ الحالات هي 3.3 ثانية.
- وقت استجابة الشريحة المئوية التسعين كان 244 ملي ثانية.
إذا راجعت علامة التبويب METRICS
على وحدة تحكّم Cloud Run، يمكنك الاطّلاع على جانب الخادم من قصة الأداء:
9. التنظيف
على الرغم من أنه لا يتم تحصيل رسوم عند استخدام الخدمة عندما لا تكون الخدمة قيد الاستخدام، قد يستمر تحصيل رسوم منك مقابل تخزين صورة الحاوية التي تم إنشاؤها.
يمكنك حذف مشروع Google Cloud Platform لتجنُّب تحمُّل الرسوم، ما سيؤدي إلى إيقاف الفوترة لجميع الموارد المستخدَمة ضمن هذا المشروع، أو حذف صورة الحاوية باستخدام هذا الأمر:
gcloud container images delete $TAG
لحذف خدمات تشغيل السحابة الإلكترونية، استخدم هذه الأوامر:
gcloud run services delete hello --platform managed --region $REGION --quiet gcloud run services delete hello-again --platform managed --region $REGION --quiet
10. لقد فعلتها!
لقد نجحت في إنشاء ونشر تطبيق Cloud Run للإنتاج. طوال العملية، تعرفت على الحاويات وكيفية بناء حاويتك الخاصة. لقد تعرفت على مدى سهولة نشر تطبيقك من خلال Cloud Run، وذلك باستخدام كل من أداة سطر الأوامر gcloud
وCloud Console. لقد تعرفت الآن على كيفية مشاركة إبداعاتك الرائعة مع العالم.
أودّ أن أطرح عليك سؤالاً مهمًا:
بعد تشغيل التطبيق في بيئة المطوِّر، كم عدد أسطر الرمز البرمجي التي اضطررت إلى تعديلها لنشره على السحابة الإلكترونية، مع جميع سمات مستوى الإنتاج التي يوفّرها تشغيل Cloud Run؟
الإجابة بالطبع هي صفر. :)
الدروس التطبيقية حول الترميز المطلوب الاطّلاع عليها...
- إنشاء روبوت Slack باستخدام Node.js على نظام التشغيل Cloud
- تشغيل Cloud Run باستخدام الأحداث من Eventarc
- مرحبًا بك في Cloud Run for Anthos Codelab
- نشر حاوية وتشغيلها باستخدام Cloud Run على Node.js
- الدروس التطبيقية الأخرى حول الترميز في Cloud Run
استكشاف الميزات الرائعة الأخرى...
- النشر المستمر من Git باستخدام Cloud Build
- استخدام الأسرار من "المدير السري"
- لمحة عن أحداث البث الثنائية الاتجاه لبروتوكول HTTP/2 وgRPC في Cloud Run
- المثيلات الدنيا لتشغيل السحابة الإلكترونية: تقليل عمليات التشغيل على البارد بدون خادم
- خدمة الزيارات من مناطق متعدّدة
المستندات المرجعية...
11. الحث على اتخاذ إجراء
إذا استمتعت بهذا الدرس التطبيقي ومن المرجح أن تقضي وقتًا أطول في التدريب على Google Cloud، ننصحك بالانضمام إلى Google Cloud Innovants اليوم.
خدمة Google Cloud Innovions مجانية وتشمل ما يلي:
- لقاءات مباشرة ونقاشات وجلسات تفصيلية حول وضع خرائط الطريق للتعرّف على آخر الأخبار مباشرةً من موظفي Google
- آخر أخبار Google Cloud مباشرةً في بريدك الوارد
- شارة رقمية وخلفية اجتماع الفيديو
- 500 وحدة دراسية من المختبرات والتعلُّم في "منصة تعزيز المهارات"
انقر هنا للتسجيل.