تطوير البرامج بثلاث خطوات سهلة باستخدام تشغيل السحابة الإلكترونية

1. مقدمة

ما سبب صعوبة إدارة التطبيقات؟

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

4d018476b4a73b47.png

لا أعرف شيئًا عنك، لكن هذه هي كل الأشياء التي لا أريد أن أقلق بشأنها! ما أريد التفكير به حقًا هو منطق طلبي:

6dfd143d20e5548b.png

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

بالإضافة إلى التحديات الإدارية المذكورة أعلاه، عليك أيضًا التعامل مع:

  • التبعيات: يجب أن تتطابق البيئة التي يعمل فيها تطبيقك بشكل دقيق مع البيئة التي تم اختباره فيها، كلما أمكن ذلك. ويمكن أن يشمل ذلك أبعادًا عديدة، منها نظام التشغيل ومكتبات الدعم ومترجم اللغة أو برنامج التجميع وتكوين الأجهزة والعديد من العوامل الأخرى.
  • التوزيع: إنّ الانتقال من تجسيد محلي لتطبيق إلى آخر تتم مشاركته على نطاق واسع على الإنترنت يتطلب غالبًا تغيير بيئة وقت التشغيل والقفزة الكمّية في مستوى التعقيد ومنحنى تعلّم شديد.

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

الإجراءات التي ستنفّذها

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

المعلومات التي ستطّلع عليها:

  • كيفية إنشاء تطبيق بسيط لخادم الويب في Python
  • كيفية حزم تطبيقك في حاوية Docker يتم تشغيلها من أي مكان
  • طريقة نشر تطبيقك على السحابة الإلكترونية ليتمكّن أي مستخدم من تجربة تصميمك الجديد
  • كيفية تبسيط الخطوات المذكورة أعلاه بشكل أكبر باستخدام حِزم Buildpacks
  • كيفية استخدام أداة سطر الأوامر في Google Cloud وواجهة مستخدم الويب في Cloud Console

المتطلبات...

  • متصفح الويب
  • حساب Google

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

2. إكمال الإعداد

5110b5081a1e1c49.png

يتناول هذا القسم كل الإجراءات المطلوبة للبدء في هذا التمرين.

إعداد بيئة ذاتية

  1. سجِّل الدخول إلى Cloud Console وأنشِئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. (إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.)

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

يُرجى تذكُّر رقم تعريف المشروع، وهو اسم فريد في جميع مشاريع Google Cloud (سبق أن تم استخدام الاسم أعلاه ولن يكون مناسبًا لك). ستتم الإشارة إليها لاحقًا في هذا الدرس التطبيقي حول الترميز باسم PROJECT_ID.

  1. بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام موارد Google Cloud.

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

بدء Cloud Shell

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

704a7b7491bd157.png

تفعيل Cloud Shell

  1. من Cloud Console، انقر على تفعيل Cloud Shell 4292cbf4971c9786.png.

bce75f34b2c53987.png

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

70f315d7b402b476.png

من المفترَض أن تستغرق عملية توفير المتطلبات اللازمة والاتصال بخدمة Cloud Shell بضع دقائق فقط.

fbe3a0674c982259.png

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

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

  1. شغِّل الأمر التالي في 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`
  1. شغّل الأمر التالي في 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- إنشاء تطبيق ويب بسيط

eef530b56b8e93a3.png

يمكنك البدء بالنقر على الزر Open Editor أعلى لوحة Cloud Shell. تبدو هكذا:

9b81c8a37a6bcdd8.png

ستجد بعد ذلك في بيئة IDE مشابهة لـ Visual Studio Code، حيث يمكنك إنشاء مشاريع وتعديل رمز المصدر وتشغيل برامجك وما إلى ذلك. إذا كانت شاشتك ضيقة جدًا، فيمكنك توسيع أو تقليص الخط الفاصل بين وحدة التحكم ونافذة التعديل/الطرفية عن طريق سحب الشريط الأفقي بين هاتين المنطقتين، كما هو موضح هنا:

8dea35450851af53.png

يمكنك التبديل بين المحرر والمحطة الطرفية من خلال النقر على الزرين 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 على النحو التالي:

fe45e0192080efd6.png

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

b1f06501509aefb9.png

الإصدار 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) وتأكد من ظهور شيء مثل هذا:

93b87996f88fa370.png

الإصدار 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 لفتح علامة تبويب في متصفّح الويب للوصول إلى التطبيق قيد التشغيل. من المفترض أن يظهر لك النص الذي تم إنشاؤه، مع أي لاحقة محددة أو الإعداد التلقائي "مرحبًا بالعالم!" سلسلة، معروضة أمام خلفية ذات ألوان عشوائية، على النحو التالي:

baf8d028f15ea7f4.png

أعِد تحميل الصفحة عدة مرات لترى أنّ لون الخلفية العشوائي يتغيّر في كل مرة تزور فيها التطبيق.

وبهذا، نكون قد اكتمل تطبيقك - تهانينا! في الخطوة التالية، ستتعرّف على كيفية تجميع تطبيقك في حاوية، والغرض من إجراء ذلك.

4. تعبئة تطبيقك في حاويات

17cc234ec3325a8a.png

ما هي الحاوية؟

تتيح لنا الحاويات بشكل عام، و 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- إلى السحابة الإلكترونية...

1b0665d94750ded6.gif

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

  • يعمل بشكل موثوق - فأنت تتخطى الأخطاء تلقائيًا في حالة تعطُّل جهاز كمبيوتر يعمل بتطبيقك
  • يتطور تلقائيًا - سيواكب تطبيقك مستويات هائلة من الزيارات، ويقلل تلقائيًا من بصمته عند عدم استخدامه.
  • إلى خفض التكاليف، من خلال عدم تحصيل رسوم منك مقابل الموارد التي لا تستخدمها، بل يتم تحصيل رسوم منك فقط مقابل الموارد المستهلكة أثناء الاستجابة للزيارات
  • يمكن الوصول إليها عبر اسم مجال خاص - يمكنك الوصول إلى حل بنقرة واحدة لتعيين اسم مجال خاص لخدمتك
  • وقت استجابة ممتاز - عمليات التشغيل على البارد سريعة الاستجابة بشكل معقول ولكن يمكنك تحسين ذلك من خلال تحديد تهيئة الحد الأدنى للمثيل
  • يتوافق مع التشفير التام بين الأطراف باستخدام أمان الويب العادي من خلال طبقة المقابس الآمنة (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، تمكّنت من تقليل الخطوات الثلاث السهلة إلى اثنتَين:

  1. أنشئ تطبيقًا في بيئة التطوير الخاصة بك.
  2. انشر الرمز نفسه على السحابة الإلكترونية باستخدام أمر واحد.

7. هل يجب استخدام سطر الأوامر؟

لا مثل كل خدمة Google Cloud تقريبًا، هناك ثلاث طرق للتفاعل مع Cloud Run:

  • أداة سطر أوامر gcloud، التي اطّلعت عليها للتو.
  • واجهة مستخدم ويب غنية، عبر Cloud Console، تدعم نمطًا سلسًا يعتمد على النقاط والتفاعل مع النقرات.
  • من الناحية الآلية، تم استخدام مكتبات عملاء Google المتوفرة للعديد من اللغات الرائجة، بما في ذلك Java وC# وPython وGo وJavascript وRuby وC/C++ وغيرها.

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

e2b4983b38c81796.png

من المفترض بعد ذلك أن يظهر لك ملخص لـ "خدمات تشغيل السحابة الإلكترونية"، مثل هذا:

b335e7bf0a3af845.png

انقروا على "إنشاء خدمة" رابط لبدء عملية النشر:

51f61a8ddc7a4c0b.png

أدخِل عبارة "مرحبًا مرة أخرى". كاسم للخدمة، فاستعن بمنصة النشر الافتراضية والمنطقة، وانقر على "التالي".

8a17baa45336c4c9.png

أدخل عنوان URL هذا لصورة الحاوية: gcr.io/cloudrun/hello، وهو حاوية صنعتها Google لأغراض الاختبار، وانقر على "الإعدادات المتقدمة" للاطّلاع على بعض إعدادات الضبط العديدة المتاحة لك. يمكنك تخصيص بعض النقاط أيضًا:

  • رقم المنفذ ونقطة دخول الحاوية (والتي ستلغي نقطة الدخول المحددة عند إنشاء الحاوية)
  • الأجهزة: الذاكرة وعدد وحدات المعالجة المركزية (CPU)
  • التحجيم: الحد الأدنى والأقصى للمثيلات
  • متغيرات البيئة
  • غير ذلك: إعداد مهلة الطلب، والحد الأقصى لعدد الطلبات لكل حاوية، HTTP/2

انقر على "التالي" لتقدم مربع الحوار. يسمح لك مربّع الحوار التالي بتحديد كيفية تشغيل الخدمة. بالنسبة إلى "الدخول"، اختَر "السماح بجميع الزيارات"، وبالنسبة إلى "المصادقة"، اختَر "السماح بالزيارات التي لم تتم مصادقتها".

e78281d1cff3418.png

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

انقر الآن على زر Create لإنشاء خدمة Cloud Run. بعد بضع ثوانٍ، من المفترض أن تظهر الخدمة الجديدة في قائمة ملخص خدمات Cloud Run. يعرض سطر الملخّص أحدث عملية نشر (التاريخ/الوقت والمستخدمين) إلى جانب بعض إعدادات الضبط الرئيسية. انقر على رابط اسم الخدمة للتوغّل في تفاصيل خدمتك الجديدة.

لإثبات ملكية الخدمة، انقر على عنوان URL المعروض بالقرب من أعلى صفحة الملخّص كما هو موضّح في المثال أدناه:

6c35cf0636dddc51.png

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

3ba6ab4fe0da1f84.png

الآن بعد أن نشرت خدمة جديدة في Cloud Run، اختَر علامة التبويب REVISIONS للاطّلاع على بعض الطرق لإدارة عمليات نشر متعدّدة.

2351ee7ec4a356f0.png

لنشر نُسخ جديدة من وحدة التحكم مباشرةً، يمكنك النقر على الزر EDIT & DEPLOY NEW REVISION، كما هو موضح في مثال لقطة الشاشة أدناه:

a599fa88d00d6776.png

انقر على هذا الزر الآن لإنشاء نسخة سابقة جديدة. بالقرب من عنوان URL للحاوية، انقر على الزر SELECT كما هو موضّح أدناه:

5fd1b1f8e1f11d40.png

في مربع الحوار الذي ينبثق، ابحث عن تطبيق الويب البسيط الذي نشرته من Cloud Build باستخدام Buildpacks في وقت سابق، ثمّ انقر على "اختيار". تأكَّد من اختيار صورة الحاوية أسفل

gcr.io/<project>/cloud-run-source-deploy

المجلد، على النحو التالي:

8a756c6157face3a.png

بعد اختياره، انتقِل إلى الأسفل وانقر على الزر DEPLOY. تم نشر نسخة جديدة من تطبيقك الآن. لإثبات الملكية، يمكنك إعادة الانتقال إلى عنوان URL للخدمة مرة أخرى والتأكّد من ظهور الرسالة الملوّنة "مرحبًا من Cloud Run with Buildpacks!" تطبيق الويب.

كما ترى، توفر علامة تبويب "النُسخ السابقة" ملخصًا لكل نسخة سابقة نشرتها، ومن المفترض أن تظهر لك الآن مراجعتان لهذه الخدمة. يمكنك تحديد نسخة سابقة معينة من خلال النقر على زر الاختيار على يمين اسم النسخة السابقة، والذي سيعرض ملخصًا لتفاصيل النسخة السابقة على الجانب الأيسر من الشاشة. بتحديد هذه الأزرار، يمكنك رؤية أن النسختين مشتقتين من صورتي حاويات مختلفتين.

يتيح لك الزر MANAGE TRAFFIC تعديل توزيع الطلبات الواردة التي تم إرسالها إلى مراجعة معيّنة. تتيح هذه القدرة على ضبط مقدار الزيارات الذي يتم إرساله إلى مراجعة معينة تفعيل العديد من حالات الاستخدام القيّمة:

  • كناري يختبر إصدارًا جديدًا من تطبيقك بجزء صغير من الزيارات الواردة
  • إعادة الزيارات من إصدار به مشكلة إلى نسخة سابقة
  • اختبار A/B

يمكنك العثور على زر "MANAGE TRAFFIC" هنا:

519d3c22ae028287.png

قم بتهيئة تقسيم عدد الزيارات 50/50 بين عمليتي المراجعة عن طريق تحديد تقسيم عدد الزيارات 50/50 على النحو التالي:

8c37d4f115d9ded4.png

انقر الآن على الزر "حفظ" وتحقَّق من التقسيم 50/50 من خلال الانتقال إلى عنوان URL الخاص بالخدمة مرارًا وتكرارًا والتأكّد من أنّ نصف طلباتك يتم في المتوسط من خلال النسخة الحالية ("مرحبًا من Cloud Run with Buildpacks!") والنصف الآخر من خلال النسخة السابقة ("إنه قيد التشغيل!").

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

الواجهة الآلية

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

8. اختبار تطبيقك

198ada162d1f0bf1.png

في هذه الخطوة الأخيرة، ستُجري اختبار حِمل اصطناعي لاختبار تطبيقك لقياس مدى الإجهاد ومشاهدة مدى تغيّره مع ارتفاع الطلب. ستستخدم أداة تسمى 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، يمكنك الاطّلاع على جانب الخادم من قصة الأداء:

e635c6831c468dd3.png

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. لقد فعلتها!

9a31f4fdbbf1ddcb.png

لقد نجحت في إنشاء ونشر تطبيق Cloud Run للإنتاج. طوال العملية، تعرفت على الحاويات وكيفية بناء حاويتك الخاصة. لقد تعرفت على مدى سهولة نشر تطبيقك من خلال Cloud Run، وذلك باستخدام كل من أداة سطر الأوامر gcloud وCloud Console. لقد تعرفت الآن على كيفية مشاركة إبداعاتك الرائعة مع العالم.

أودّ أن أطرح عليك سؤالاً مهمًا:

بعد تشغيل التطبيق في بيئة المطوِّر، كم عدد أسطر الرمز البرمجي التي اضطررت إلى تعديلها لنشره على السحابة الإلكترونية، مع جميع سمات مستوى الإنتاج التي يوفّرها تشغيل Cloud Run؟

الإجابة بالطبع هي صفر. :)

الدروس التطبيقية حول الترميز المطلوب الاطّلاع عليها...

استكشاف الميزات الرائعة الأخرى...

المستندات المرجعية...

11. الحث على اتخاذ إجراء

شعار Google Cloud

إذا استمتعت بهذا الدرس التطبيقي ومن المرجح أن تقضي وقتًا أطول في التدريب على Google Cloud، ننصحك بالانضمام إلى Google Cloud Innovants اليوم.

شعار شارة العضو العام المُبدعين

خدمة Google Cloud Innovions مجانية وتشمل ما يلي:

  • لقاءات مباشرة ونقاشات وجلسات تفصيلية حول وضع خرائط الطريق للتعرّف على آخر الأخبار مباشرةً من موظفي Google
  • آخر أخبار Google Cloud مباشرةً في بريدك الوارد
  • شارة رقمية وخلفية اجتماع الفيديو
  • 500 وحدة دراسية من المختبرات والتعلُّم في "منصة تعزيز المهارات"

انقر هنا للتسجيل.