نشر موقع إلكتروني باستخدام Cloud Run

1. قبل البدء

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

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

في هذا الدرس التطبيقي حول الترميز، ستبدأ بصورة Docker تم إنشاؤها من خلال Cloud Build، والتي يمكنك تشغيلها في Cloud Shell. بعد ذلك، يمكنك نشر هذه الصورة على Cloud Run باستخدام أمر في Cloud Shell.

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

أهداف الدورة التعليمية

  • كيفية إنشاء صورة Docker باستخدام Cloud Build وتحميلها إلى gcr.io
  • كيفية نشر صور Docker على Cloud Run
  • كيفية إدارة عمليات نشر Cloud Run
  • كيفية إعداد نقطة نهاية لتطبيق على Cloud Run

ما ستنشئه

  • موقع إلكتروني ثابت يعمل داخل حاوية Docker
  • إصدار من هذه الحاوية متوفّر في Container Registry
  • عملية نشر Cloud Run لموقعك الإلكتروني الثابت

المتطلبات

  • حساب Google لديه إذن وصول إداري لإنشاء مشاريع أو مشروع لديه دور مالك المشروع

2. إعداد البيئة

إعداد البيئة بوتيرة ذاتية

إذا لم يكن لديك حساب على Google، عليك إنشاء حساب. بعد ذلك، سجِّل الدخول إلى Google Cloud Console وانقر على المشروع > إنشاء مشروع.

53dad2cefdae71da.png

faab21976aabeb4c.png

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

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

تفعيل Cloud Run API

انقر على قائمة التنقّل ☰ > واجهات برمجة التطبيقات والخدمات > لوحة البيانات > تفعيل واجهات برمجة التطبيقات والخدمات. .

5dbb2e6e27a55fcf.png

ابحث عن "Cloud Run API"، ثم انقر على Cloud Run API > تفعيل.

f1fd486174a744cf.png

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

يمكن لمستخدمي Google Cloud الجدد الاستفادة من فترة تجريبية مجانية بقيمة 300 دولار أمريكي.

Cloud Shell

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

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

  1. لتفعيل Cloud Shell من Cloud Console، ما عليك سوى النقر على تفعيل Cloud Shell fEbHefbRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7zSwz7p6ItNgx4tXqQjag7BfWPcZN5kP-X3Q (يستغرق توفير البيئة والاتصال بها بضع لحظات فقط).

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01A

Screen Shot 2017-06-14 at 10.13.43 PM.png

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

gcloud auth list

ناتج الأمر

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

ناتج الأمر

[core]
project = <PROJECT_ID>

إذا لم يتم ضبط المشروع لسبب ما، ما عليك سوى تنفيذ الأمر التالي:

gcloud config set project <PROJECT_ID>

هل تبحث عن PROJECT_ID؟ يمكنك الاطّلاع على المعرّف الذي استخدمته في خطوات الإعداد أو البحث عنه في لوحة بيانات Cloud Console:

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqABYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

يضبط Cloud Shell أيضًا بعض متغيرات البيئة تلقائيًا، ما قد يكون مفيدًا عند تنفيذ الأوامر المستقبلية.

echo $GOOGLE_CLOUD_PROJECT

ناتج الأمر

<PROJECT_ID>
  1. أخيرًا، اضبط المنطقة التلقائية وإعدادات المشروع.
gcloud config set compute/zone us-central1-f

يمكنك اختيار مجموعة متنوعة من المناطق المختلفة. لمزيد من المعلومات، يُرجى الاطّلاع على الأقاليم والمناطق.

3- إنشاء نسخة طبق الأصل من مستودع المصدر

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

نفِّذ الأوامر التالية لاستنساخ المستودع إلى مثيل Cloud Shell والانتقال إلى الدليل المناسب. ستثبّت أيضًا تبعيات Node.js لتتمكّن من اختبار تطبيقك قبل نشره.

cd ~
git clone https://github.com/googlecodelabs/monolith-to-microservices.git
cd ~/monolith-to-microservices
./setup.sh

سيؤدي ذلك إلى استنساخ المستودع وتغيير الدليل وتثبيت التبعيات اللازمة لتشغيل تطبيقك محليًا. وقد يستغرق تشغيل النص البرمجي بضع دقائق.

عليك بذل العناية الواجبة واختبار تطبيقك. شغِّل الأمر التالي لبدء تشغيل خادم الويب:

cd ~/monolith-to-microservices/monolith
npm start

إخراج:

Monolith listening on port 8080!

يمكنك معاينة تطبيقك من خلال النقر على معاينة الويب acc630712255c604.png واختيار معاينة على المنفذ 8080.

5869738f0e9ec386.png

سيؤدي ذلك إلى فتح نافذة جديدة يمكنك فيها رؤية متجرك على Fancy وهو يعمل.

9ed25c3f0cbe62fa.png

يمكنك إغلاق هذه النافذة بعد الاطّلاع على الموقع الإلكتروني. لإيقاف عملية خادم الويب، اضغط على CONTROL+C (Command+C على جهاز Macintosh) في نافذة الوحدة الطرفية.

4. إنشاء حاوية Docker باستخدام Cloud Build

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

في العادة، عليك اتّخاذ خطوتين، وهما إنشاء حاوية Docker ونقلها إلى سجل لتخزين الصورة التي يمكن لـ GKE استردادها منه. ومع ذلك، يمكنك تسهيل الأمر باستخدام Cloud Build لإنشاء حاوية Docker ووضع الصورة في Container Registry باستخدام أمر واحد. للاطّلاع على العملية اليدوية لإنشاء Dockerfile ونشره، يُرجى الاطّلاع على البدء السريع في Container Registry.

تضغط Cloud Build الملفات من الدليل وتنقلها إلى حزمة Cloud Storage. بعد ذلك، تأخذ عملية التصميم جميع الملفات من الحزمة وتستخدم ملف Dockerfile المتوفّر في الدليل نفسه لتشغيل عملية إنشاء Docker. بما أنّك حدّدت العلامة --tag مع المضيف gcr.io لصورة Docker، سيتم إرسال صورة Docker الناتجة إلى Container Registry.

أولاً، عليك التأكّد من تفعيل Cloud Build API. نفِّذ الأمر التالي لتفعيله:

gcloud services enable cloudbuild.googleapis.com

بعد تفعيل واجهة برمجة التطبيقات، نفِّذ الأمر التالي في Cloud Shell لبدء عملية الإنشاء:

gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 .

تستغرق هذه العملية بضع دقائق، ولكن بعد اكتمالها، ستظهر في الوحدة الطرفية نتيجة مشابهة لما يلي:

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ID                                    CREATE_TIME                DURATION  SOURCE                                                                                  IMAGES                              STATUS
1ae295d9-63cb-482c-959b-bc52e9644d53  2019-08-29T01:56:35+00:00  33S       gs://<PROJECT_ID>_cloudbuild/source/1567043793.94-abfd382011724422bf49af1558b894aa.tgz  gcr.io/<PROJECT_ID>/monolith:1.0.0  SUCCESS

لعرض سجلّ الإنشاء أو مشاهدة العملية في الوقت الفعلي، يمكنك الانتقال إلى Cloud Console، ثم النقر على قائمة التنقّل ☰ > Cloud Build > السجلّ. ستظهر لك قائمة بجميع الإصدارات السابقة، ولكن من المفترض أن يظهر الإصدار الذي أنشأته فقط.

4c753ede203255f6.png

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

6e88ed1643dfe629.png

5- نشر الحاوية على Cloud Run

بعد إنشاء حاوية لموقعك الإلكتروني ونقلها إلى Container Registry، حان وقت نشرها على Cloud Run.

هناك طريقتان للنشر على Cloud Run:

  • ‫Cloud Run (مُدارة بالكامل) هو نموذج خدمة تأجير المنصات (PaaS) الذي تتم فيه إدارة دورة حياة الحاوية بأكملها. سنستخدم هذا الأسلوب في هذا الدرس التطبيقي.
  • ‫Cloud Run for Anthos هي خدمة Cloud Run مع طبقة تحكّم إضافية، ما يتيح لك نقل المجموعات ووحدات Pod من GKE. لمزيد من المعلومات، يُرجى الاطّلاع على إعداد Cloud Run for Anthos على Google Cloud.

ستكون أمثلة سطر الأوامر في Cloud Shell باستخدام متغيرات البيئة التي أعددتها سابقًا.

سطر الأوامر

نفِّذ الأمر التالي لنشر تطبيقك:

gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed 

سيُطلب منك تحديد المنطقة التي تريد عرض الإعلانات فيها. اختَر المنطقة الأقرب إليك، ثم اقبل اسم الخدمة التلقائي المقترَح (monolith).

d52d9419c5166674.png

لأغراض الاختبار، اسمح بطلبات غير مصادَق عليها إلى التطبيق. أدخِل y عند ظهور الطلب.

3a57b32f133dad61.png

التحقّق من عملية النشر

للتحقّق من إنشاء عملية النشر بنجاح، شغِّل الأمر التالي. قد يستغرق Pod status بعض الوقت حتى يصبح Running:

gcloud run services list

اختَر [1] Cloud Run (إدارة كاملة).

إخراج:

SERVICE   REGION    URL  LAST DEPLOYED BY          LAST DEPLOYED AT
✔  monolith  us-east1 <your url>  <your email>  2019-09-16T21:07:38.267Z

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

افتح عنوان URL المقدَّم في قائمة الخدمات في متصفّح الويب، وسيظهر لك الموقع الإلكتروني نفسه الذي عاينته محليًا.

6. إنشاء مراجعة جديدة بتزامن أقل

الآن، أعِد نشر تطبيقك، ولكن عدِّل إحدى المَعلمات هذه المرة.

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

أعِد نشر صورة الحاوية نفسها بقيمة تزامن تبلغ 1 (لأغراض الاختبار فقط) واطّلِع على النتيجة.

gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed --concurrency 1

أجِب عن الأسئلة اللاحقة بالطريقة نفسها التي أجبت بها عن السؤال الأول. بعد نجاح الأمر، راجِع Cloud Console للاطّلاع على النتيجة.

من لوحة بيانات Cloud Run، انقر على خدمة monolith للاطّلاع على التفاصيل.

7d1eed2e4728a4f2.png

انقر على علامة التبويب التعديلات. من المفترض أن ترى نسختَين معدَّلتَين تم إنشاؤهما. انقر على monolith-00002 وراجِع التفاصيل. يجب أن تلاحظ انخفاض قيمة التزامن إلى 1.

217185c0eccc87dd.png]

4ad481b8bcd0343d.png

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

الآن، استعِدّ التزامن الأصلي بدون إعادة النشر. يمكنك ضبط قيمة الاستخدام المتزامن على القيمة التلقائية البالغة 80 أو 0، ما سيؤدي إلى إزالة أي قيود على الاستخدام المتزامن وضبطها على الحد الأقصى التلقائي (الذي يبلغ 80 في وقت كتابة هذا المقال).

نفِّذ الأمر التالي في Cloud Shell لتعديل المراجعة الحالية:

gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed --concurrency 80

لاحظ أنّه تم إنشاء مراجعة أخرى، وأنّه تمت إعادة توجيه عدد الزيارات، وأنّ التزامن عاد إلى 80.

7. إجراء تغييرات على الموقع الإلكتروني

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

يبدو أنّ أحد المطوّرين قد أجرى التغييرات باستخدام اسم الملف index.js.new. يمكنك ببساطة نسخ هذا الملف إلى index.js، ومن المفترض أن تظهر التغييرات. اتّبِع التعليمات لإجراء التغييرات المناسبة.

نفِّذ الأوامر التالية، وانسخ الملف المعدَّل إلى اسم الملف الصحيح، واطبع محتواه للتحقّق من التغييرات:

cd ~/monolith-to-microservices/react-app/src/pages/Home
mv index.js.new index.js
cat ~/monolith-to-microservices/react-app/src/pages/Home/index.js

يجب أن تبدو التعليمة البرمجية الناتجة على النحو التالي:

/*
Copyright 2019 Google LLC

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    https://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

import React from "react";
import { makeStyles } from "@material-ui/core/styles";
import Paper from "@material-ui/core/Paper";
import Typography from "@material-ui/core/Typography";
const useStyles = makeStyles(theme => ({
  root: {
    flexGrow: 1
  },
  paper: {
    width: "800px",
    margin: "0 auto",
    padding: theme.spacing(3, 2)
  }
}));
export default function Home() {
  const classes = useStyles();
  return (
    <div className={classes.root}>
      <Paper className={classes.paper}>
        <Typography variant="h5">
          Fancy Fashion &amp; Style Online
        </Typography>
        <br />
        <Typography variant="body1">
          Tired of mainstream fashion ideas, popular trends and societal norms?
          This line of lifestyle products will help you catch up with the Fancy trend and express your personal style.
          Start shopping Fancy items now!
        </Typography>
      </Paper>
    </div>
  );
}

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

cd ~/monolith-to-microservices/react-app
npm run build:monolith

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

نفِّذ الأمر التالي لتفعيل إصدار جديد من Cloud Build يتضمّن إصدارًا معدَّلاً من الصورة هو 2.0.0:

cd ~/monolith-to-microservices/monolith

#Feel free to test your application
npm start

gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 .

في القسم التالي، ستستخدم هذه الصورة لتعديل تطبيقك بدون أي وقت تعطل.

8. تعديل الموقع الإلكتروني بدون توقّف

اكتملت التغييرات، وفريق التسويق راضٍ عن التعديلات التي أجريتها. حان الوقت لتعديل الموقع الإلكتروني بدون مقاطعة المستخدمين.

يتعامل Cloud Run مع كل عملية نشر على أنّها إصدار جديد، وسيتم إتاحة هذا الإصدار على الإنترنت ثم إعادة توجيه الزيارات إليه.

اتّبِع مجموعات التعليمات التالية لتعديل موقعك الإلكتروني.

سطر الأوامر

من سطر الأوامر، يمكنك إعادة نشر الخدمة لتعديل الصورة إلى إصدار جديد باستخدام الأمر التالي:

gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 --platform managed

التحقّق من عملية النشر

تحقَّق من صحة تعديل عملية النشر من خلال تنفيذ الأمر التالي:

gcloud run services describe monolith --platform managed 

تظهر النتيجة على النحو التالي:

apiVersion: serving.knative.dev/v1alpha1
kind: Service
metadata:
  annotations:
    client.knative.dev/user-image: gcr.io/my-cloudrun-codelab/monolith:2.0.0
...

سيظهر لك أنّ خدمتك تستخدم الآن أحدث إصدار من صورتك التي تم نشرها في مراجعة جديدة.

للتحقّق من التغييرات، انتقِل إلى عنوان URL الخارجي لخدمة Cloud Run مرة أخرى ولاحظ أنّه تم تعديل عنوان تطبيقك.

نفِّذ الأمر التالي لإدراج الخدمات وعرض عنوان IP إذا نسيته:

gcloud run services list

من المفترض أن يعرض موقعك الإلكتروني الآن النص الذي أضفته إلى مكوّن الصفحة الرئيسية.

451ca252acae6928.png

9- تَنظيم

حذف صور Container Registry

# Delete the container image for version 1.0.0 of our monolith
gcloud container images delete gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --quiet

# Delete the container image for version 2.0.0 of our monolith
gcloud container images delete gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 --quiet

حذف عناصر Cloud Build من Cloud Storage

# The following command will take all source archives from all builds and delete them from cloud storage

# Run this command to print all sources:
# gcloud builds list | awk 'NR > 1 {print $4}' 

gcloud builds list | awk 'NR > 1 {print $4}' | while read line; do gsutil rm $line; done

حذف خدمة Cloud Run

gcloud run services delete monolith --platform managed

10. تهانينا

لقد نشرت موقعك الإلكتروني وعدّلت حجمه وعدّلته باستخدام Cloud Run.

مزيد من المعلومات