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

1. مقدمة

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

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

4d018476b4a73b47.png

لا أعرف ما إذا كنت توافقني الرأي، ولكنّ هذه كلها أمور لا أريد أن أقلق بشأنها. ما أريد التفكير فيه حقًا هو منطق تطبيقي:

6dfd143d20e5548b.png

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

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

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

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

المهام التي ستنفذها...

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

ما ستتعلمه...

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

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

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

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

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 على التوالي. جرِّب التبديل بين هذين الوضعين الآن.

بعد ذلك، أنشئ مجلدًا لتخزين عملك في هذا المختبر، وذلك من خلال اختيار File->New Folder، ثم أدخِل hello، وانقر على OK. سيتم إنشاء جميع الملفات التي تنشئها في هذا الدرس التطبيقي وكل العمل الذي تقوم به في Cloud Shell في هذا المجلد.

الآن، أنشئ ملف requirements.txt. يُعلم هذا الملف لغة Python بالمكتبات التي يعتمد عليها تطبيقك. بالنسبة إلى تطبيق الويب البسيط هذا، ستستخدم وحدة Python شائعة لإنشاء خوادم الويب تُسمى Flask وإطار عمل لخادم الويب يُسمى gunicorn. في نافذة "محرّر السحابة الإلكترونية"، انقر على قائمة "ملف" (File) > "ملف جديد" (New File) لإنشاء ملف جديد. عندما يُطلب منك إدخال اسم الملف الجديد، أدخِل requirements.txt واضغط على الزر OK. تأكَّد من أنّ الملف الجديد ينتهي به المطاف في مجلد مشروع hello.

أدخِل الأسطر التالية في الملف الجديد لتحديد أنّ تطبيقك يعتمد على حزمة Flask من Python وخادم الويب gunicorn.

Flask
gunicorn

لست بحاجة إلى حفظ هذا الملف بشكل صريح لأنّ "محرّر السحابة الإلكترونية" سيحفظ التغييرات تلقائيًا.

الإصدار 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

ارجع إلى "محرّر السحابة الإلكترونية" (من خلال الزر 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)

ارجع إلى "الوحدة الطرفية" (Terminal) (عبر الزر Open Terminal) وأدخِل control-C (اضغط مع الاستمرار على مفتاح Control أثناء الضغط على "C") لإيقاف التطبيق الذي يتم تشغيله ثم أعِد تشغيله من خلال إدخال:

python3 main.py

انقر مرة أخرى على الزر web preview، ثم على عنصر القائمة Preview on Port 8080 لفتح علامة تبويب متصفّح الويب لتطبيقك قيد التشغيل. من المفترض أن تظهر لك الرسالة "Hello world!‎" مرة أخرى، ولكن استبدِل الآن نص عنوان URL الذي يلي الشرطة المائلة بأي سلسلة من اختيارك (مثل /your-name) وتأكَّد من ظهور ما يلي:

93b87996f88fa370.png

الإصدار 3: الألوان العشوائية

الآن، أضِف إمكانية استخدام ألوان خلفية عشوائية من خلال الرجوع إلى "محرّر السحابة الإلكترونية" (عبر الزر 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)

ارجع إلى "الوحدة الطرفية" (Terminal) (عبر الزر Open Terminal) وأدخِل control-C (اضغط مع الاستمرار على مفتاح Control أثناء الضغط على "C") لإيقاف التطبيق الذي يتم تشغيله ثم أعِد تشغيله من خلال إدخال:

python3 main.py

انقر مرة أخرى على الزر web preview، ثم على عنصر القائمة Preview on Port 8080 لفتح علامة تبويب متصفّح ويب لتطبيقك قيد التشغيل. من المفترض أن يظهر النص الذي تم إنشاؤه، مع أي لاحقة محددة أو السلسلة التلقائية "Hello world!"، أمام خلفية ملونة بشكل عشوائي، كما يلي:

baf8d028f15ea7f4.png

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

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

4. تضمين تطبيقك في حاوية

17cc234ec3325a8a.png

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

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

في الخطوة السابقة، وعند تشغيل تطبيقك في بيئة المطوّر، كان عليك تنفيذ pip3 install -r requirements.txt والتأكّد من أنّ ملف requirements.txt يحتوي على جميع المكتبات التابعة والإصدارات المقابلة. باستخدام الحاويات، يمكنك تثبيت هذه المتطلبات عند إنشاء صورة الحاوية، وبالتالي لا داعي لأن يقلق مستخدم الحاوية بشأن تثبيت أي شيء.

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

تساعد الحاويات في جعل تطبيقاتك:

  • قابلة للتكرار: الحاويات مستقلة وكاملة
  • قابلة للنقل: الحاويات هي وحدات أساسية متعددة الصناعات، ما يتيح إمكانية نقل التطبيقات بين موفّري الخدمات السحابية والبيئات المختلفة

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

لنبدأ بإنشاء حاوية. ستستخدم تكنولوجيا معيّنة لإنشاء حاوية تُعرف باسم Docker.

في "محرّر السحابة الإلكترونية"، أنشئ ملفًا جديدًا باسم 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 بحيث تتغير الرسالة التلقائية من "Hello world!‎" إلى "Hello from Cloud Run!‎". بعبارة أخرى، غيِّر هذا السطر في main.py من هذا:

def say_hello(name="world"):

إلى ما يلي:

def say_hello(name="from Cloud Run"):

‫Cloud Run هي خدمة إقليمية، ما يعني أنّ البنية الأساسية التي تشغّل خدمات Cloud Run تقع في منطقة معيّنة وتديرها Google لتكون متاحة بشكل متكرّر في جميع المناطق داخل تلك المنطقة. في قسم "بدء الإعداد" أعلاه، حدّدت منطقة تلقائية من خلال متغير البيئة REGION.

أعِد إنشاء صورة الحاوية وانشر تطبيقك المحفوظ في حاوية على Cloud Run باستخدام الأمر التالي:

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 التي خزّنت الصورة الناتجة في Google Container Registry، يمكن لخدمة 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 Run. هذا الرابط دائم (ما دمت لم توقف خدمتك) ويمكن استخدامه في أي مكان على الإنترنت. لا تستخدم هذه الطريقة آلية الخادم الوكيل في Cloud Shell المذكورة سابقًا، والتي كانت تعتمد على جهاز افتراضي مؤقت.

انقر على Service URL المميّز لفتح علامة تبويب متصفّح ويب إلى تطبيقك قيد التشغيل. من المفترض أن تعرض النتيجة الرسالة "Hello from Cloud Run!" (مرحبًا من Cloud Run!) أمام خلفية ملوّنة بشكل عشوائي.

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

ولكن أعتقد أنّ هذه العملية يمكن أن تكون أسهل...

6. إنشاء الحاوية تلقائيًا

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

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

لنبدأ بتعديل تطبيقك حتى تتمكّن من التمييز بين المراجعة الجديدة والقديمة. يمكنك إجراء ذلك عن طريق تعديل الملف main.py بحيث تتغير الرسالة التلقائية من "Hello from Cloud Run!‎" إلى "Hello from Cloud Run with Buildpacks!‎". بعبارة أخرى، غيِّر هذا السطر في main.py من هذا:

def say_hello(name="from Cloud Run"):

إلى ما يلي:

def say_hello(name="from Cloud Run with Buildpacks"):

لنستفِد الآن من حِزم الإنشاء من خلال إنشاء ملف جديد باسم Procfile. أنشئ هذا الملف في "محرّر السحابة الإلكترونية" وأدرِج سطر النص التالي:

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 المميّز لفتح علامة تبويب متصفّح في متصفّح الويب إلى تطبيقك قيد التشغيل، وتأكَّد من أنّ خدمتك تعرض الرسالة "Hello from Cloud Run with Buildpacks!‎" (مرحبًا من Cloud Run باستخدام Buildpacks) أمام خلفية ملوّنة بشكل عشوائي.

لاحظ أنّه باستخدام حِزم الإنشاء لتصنيع Dockerfile، تكون قد قلّلت الخطوات الثلاث السهلة إلى خطوتين:

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

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

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

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

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

e2b4983b38c81796.png

يجب أن يظهر لك بعد ذلك ملخّص لخدمات Cloud Run، على النحو التالي:

b335e7bf0a3af845.png

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

51f61a8ddc7a4c0b.png

أدخِل "hello-again" كاسم الخدمة، واقبل منصة النشر والمنطقة التلقائيتَين، ثم انقر على "التالي".

8a17baa45336c4c9.png

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

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

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

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

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

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

519d3c22ae028287.png

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

8c37d4f115d9ded4.png

انقر الآن على الزر "حفظ" (SAVE) وتحقّق من التقسيم بنسبة 50/50 من خلال الانتقال إلى عنوان URL الخاص بخدمتك بشكل متكرر والتأكّد من أنّ نصف طلباتك يتم عرضها من خلال المراجعة الحالية ("Hello from Cloud Run with Buildpacks!") وأنّ النصف الآخر يتم عرضه من خلال المراجعة السابقة ("It's running!").

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

واجهة برمجة التطبيقات الآلية

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

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

198ada162d1f0bf1.png

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

إجراء الاختبار

في "وحدة Cloud Shell الطرفية"، شغِّل الأمر التالي لإجراء اختبار تحميل:

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

يخبرنا هذا الملخّص بعدة معلومات مهمة:

  • تم إرسال 32,918 طلبًا بمعدّل 1,000 طلب في الثانية لمدة 30 ثانية تقريبًا.
  • لم يتم رصد أي أخطاء (فقط استجابات HTTP 200).
  • كان متوسط وقت الاستجابة 180 ملي ثانية.
  • كان الحد الأدنى لوقت الاستجابة 107 ملي ثانية، وكان أسوأ وقت استجابة 3.3 ثانية
  • كانت نسبة %90 من وقت الاستجابة 244 ملي ثانية.

إذا اطّلعت على علامة التبويب METRICS في وحدة تحكّم Cloud Run، يمكنك الاطّلاع على جانب الخادم من قصة الأداء:

e635c6831c468dd3.png

9- تنظيف

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

يمكنك إما حذف مشروع Google Cloud Platform لتجنُّب تحمّل رسوم، ما سيؤدي إلى إيقاف الفوترة لجميع الموارد المستخدَمة في هذا المشروع، أو يمكنك ببساطة حذف صورة الحاوية باستخدام الأمر التالي:

gcloud container images delete $TAG

لحذف خدمات Cloud Run، استخدِم الأوامر التالية:

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 Innovators اليوم.

شعار شارة العضو العام في برنامج Innovators

برنامج Google Cloud Innovators مجاني ويتضمّن ما يلي:

  • مناقشات مباشرة وجلسات "اسألني أي سؤال" وجلسات حول خارطة الطريق لمعرفة آخر الأخبار مباشرةً من موظفي Google
  • آخر الأخبار حول Google Cloud مباشرةً في بريدك الوارد
  • شارة رقمية وخلفية لاجتماع الفيديو
  • 500 رصيد من التدريبات العملية والدروس على Skills Boost

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