بدء استخدام مهام Cloud Run

1. مقدمة

1965fab24c502bd5.png

نظرة عامة

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

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

في مهام تشغيل السحابة الإلكترونية، يمكنك تشغيل نُسخ متعددة من الحاوية بالتوازي من خلال تحديد عدد من المهام. وتمثل كل مهمة نسخة قيد التشغيل من الحاوية. يعد استخدام مهام متعددة مفيدًا إذا كانت كل مهمة يمكنها معالجة مجموعة فرعية من بياناتك بشكل مستقل. على سبيل المثال، يمكن معالجة 10,000 سجلّ من Cloud SQL أو 10,000 ملف من Cloud Storage بشكل أسرع من خلال 10 مهام تعالج 1,000 سجلّ أو ملف، كلٌّ منها بالتوازي.

تتألف عملية استخدام مهام Cloud Run من خطوتَين:

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

في هذا الدرس التطبيقي، ستستكشف أولاً تطبيق Node.js لالتقاط لقطات شاشة لصفحات الويب وتخزينها في Cloud Storage. ويمكنك بعد ذلك إنشاء صورة حاوية للتطبيق، وتشغيلها في مهام Cloud Run، وتعديل المهمة لمعالجة المزيد من صفحات الويب، وتنفيذ المهمة وفقًا لجدول زمني باستخدام Cloud Scheduler.

ما ستتعرَّف عليه

  • كيفية استخدام تطبيق لالتقاط لقطات شاشة لصفحات الويب
  • كيفية إنشاء صورة حاوية للتطبيق.
  • كيفية إنشاء مهمة تشغيل السحابة الإلكترونية للتطبيق
  • كيفية تشغيل التطبيق كمهمة تشغيل السحابة الإلكترونية
  • كيفية تعديل المهمة
  • كيفية جدولة المهمة باستخدام Cloud Scheduler.

2. الإعداد والمتطلبات

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

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

295004821bab6a87.png

37d264871000675d.png

96d86d3d5655cdbe.png

  • اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة أحرف لا تستخدمها Google APIs. ويمكنك تعديلها في أي وقت.
  • يكون رقم تعريف المشروع فريدًا في جميع مشاريع Google Cloud وغير قابل للتغيير (لا يمكن تغييره بعد تحديده). تنشئ Cloud Console سلسلة فريدة تلقائيًا. فعادةً لا تهتم بما هو. في معظم الدروس التطبيقية حول الترميز، يجب الإشارة إلى رقم تعريف المشروع (الذي يتم تحديده عادةً على أنّه PROJECT_ID). وإذا لم يعجبك رقم التعريف الذي تم إنشاؤه، يمكنك إنشاء رقم تعريف عشوائي آخر. ويمكنك بدلاً من ذلك تجربة طلبك الخاص ومعرفة ما إذا كان متاحًا. ولا يمكن تغييره بعد هذه الخطوة ويبقى طوال مدة المشروع.
  • لمعلوماتك، هناك قيمة ثالثة، وهي رقم المشروع، الذي تستخدمه بعض واجهات برمجة التطبيقات. اطّلِع على مزيد من المعلومات حول هذه القيم الثلاث في المستندات.
  1. بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام الموارد/واجهات برمجة التطبيقات في Cloud. لن يؤدي إكمال هذا الدرس التطبيقي حول الترميز إلى فرض أي تكاليف، إن وُجدت. لإيقاف تشغيل الموارد لتجنب تحمُّل الفواتير إلى ما هو أبعد من هذا البرنامج التعليمي، يمكنك حذف الموارد التي أنشأتها أو حذف المشروع. يكون مستخدمو Google Cloud الجدد مؤهَّلون للانضمام إلى برنامج فترة تجريبية مجانية بقيمة 300 دولار أمريكي.

بدء Cloud Shell

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

من Google Cloud Console، انقر على رمز Cloud Shell في شريط الأدوات العلوي الأيسر:

84688aa223b1c3a2.png

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

320e18fedb7fbe0.png

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

إعداد gcloud

في Cloud Shell، اضبط رقم تعريف مشروعك والمنطقة التي تريد نشر مهمة Cloud Run فيها. حفظها كمتغيّرات PROJECT_ID وREGION في المستقبل، ستتمكّن من اختيار منطقة من أحد مواقع التشغيل في السحابة الإلكترونية.

PROJECT_ID=[YOUR-PROJECT-ID]
REGION=us-central1
gcloud config set core/project $PROJECT_ID

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

تفعيل جميع الخدمات اللازمة:

gcloud services enable \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com \
  run.googleapis.com

3- الحصول على الرمز‏

يمكنك أولاً استكشاف تطبيق Node.js لالتقاط لقطات شاشة لصفحات الويب وتخزينها في Cloud Storage. ويمكنك لاحقًا إنشاء صورة حاوية للتطبيق وتشغيلها كمهمة على Cloud Run.

من Cloud Shell، شغِّل الأمر التالي لاستنساخ رمز التطبيق من هذا المستودع:

git clone https://github.com/GoogleCloudPlatform/jobs-demos.git

انتقل إلى الدليل الذي يحتوي على التطبيق:

cd jobs-demos/screenshot

من المفترض أن يظهر لك تنسيق الملف هذا:

screenshot
 |
 ├── Dockerfile
 ├── README.md
 ├── screenshot.js
 ├── package.json

في ما يلي وصف موجز لكل ملف:

  • يحتوي screenshot.js على رمز Node.js للتطبيق.
  • يحدد package.json اعتماديات المكتبة.
  • تحدّد السمة Dockerfile صورة الحاوية.

4. استكشاف الرمز البرمجي

لاستكشاف الرمز، استخدِم محرِّر النصوص المدمج من خلال النقر على الزر Open Editor في أعلى نافذة Cloud Shell.

15a2cdc9b7f6dfc6.png

في ما يلي شرح موجز لكل ملف.

screenshot.js

يضيف screenshot.js أولاً Puppeteer وCloud Storage كعناصر تابعة. Puppeteer هو مكتبة Node.js تستخدمها لالتقاط لقطات شاشة لصفحات الويب:

const puppeteer = require('puppeteer');
const {Storage} = require('@google-cloud/storage');

هناك دالة initBrowser لإعداد الدالة Puppeteer وtakeScreenshot لالتقاط لقطات شاشة لعنوان URL معيّن:

async function initBrowser() {
  console.log('Initializing browser');
  return await puppeteer.launch();
}

async function takeScreenshot(browser, url) {
  const page = await browser.newPage();

  console.log(`Navigating to ${url}`);
  await page.goto(url);

  console.log(`Taking a screenshot of ${url}`);
  return await page.screenshot({
    fullPage: true
  });
}

بعد ذلك، هناك دالة للحصول على حزمة Cloud Storage أو إنشائها ووظيفة أخرى لتحميل لقطة شاشة لصفحة ويب إلى الحزمة:

async function createStorageBucketIfMissing(storage, bucketName) {
  console.log(`Checking for Cloud Storage bucket '${bucketName}' and creating if not found`);
  const bucket = storage.bucket(bucketName);
  const [exists] = await bucket.exists();
  if (exists) {
    // Bucket exists, nothing to do here
    return bucket;
  }

  // Create bucket
  const [createdBucket] = await storage.createBucket(bucketName);
  console.log(`Created Cloud Storage bucket '${createdBucket.name}'`);
  return createdBucket;
}

async function uploadImage(bucket, taskIndex, imageBuffer) {
  // Create filename using the current time and task index
  const date = new Date();
  date.setMinutes(date.getMinutes() - date.getTimezoneOffset());
  const filename = `${date.toISOString()}-task${taskIndex}.png`;

  console.log(`Uploading screenshot as '${filename}'`)
  await bucket.file(filename).save(imageBuffer);
}

أخيرًا، الدالة main هي نقطة الدخول:

async function main(urls) {
  console.log(`Passed in urls: ${urls}`);

  const taskIndex = process.env.CLOUD_RUN_TASK_INDEX || 0;
  const url = urls[taskIndex];
  if (!url) {
    throw new Error(`No url found for task ${taskIndex}. Ensure at least ${parseInt(taskIndex, 10) + 1} url(s) have been specified as command args.`);
  }
  const bucketName = process.env.BUCKET_NAME;
  if (!bucketName) {
    throw new Error('No bucket name specified. Set the BUCKET_NAME env var to specify which Cloud Storage bucket the screenshot will be uploaded to.');
  }

  const browser = await initBrowser();
  const imageBuffer = await takeScreenshot(browser, url).catch(async err => {
    // Make sure to close the browser if we hit an error.
    await browser.close();
    throw err;
  });
  await browser.close();

  console.log('Initializing Cloud Storage client')
  const storage = new Storage();
  const bucket = await createStorageBucketIfMissing(storage, bucketName);
  await uploadImage(bucket, taskIndex, imageBuffer);

  console.log('Upload complete!');
}

main(process.argv.slice(2)).catch(err => {
  console.error(JSON.stringify({severity: 'ERROR', message: err.message}));
  process.exit(1);
});

يُرجى مراعاة ما يلي بشأن طريقة main:

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

package.json

يحدّد ملف package.json التطبيق ويحدّد اعتماديات Cloud Storage وPuppeteer:

{
  "name": "screenshot",
  "version": "1.0.0",
  "description": "Create a job to capture screenshots",
  "main": "screenshot.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "Google LLC",
  "license": "Apache-2.0",
  "dependencies": {
    "@google-cloud/storage": "^5.18.2",
    "puppeteer": "^13.5.1"
  }
}

ملف Dockerfile

يحدد Dockerfile صورة الحاوية للتطبيق الذي يتضمن كافة المكتبات والتبعيات المطلوبة:

FROM ghcr.io/puppeteer/puppeteer:16.1.0
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
ENTRYPOINT ["node", "screenshot.js"]

5- نشر وظيفة

قبل إنشاء وظيفة، عليك إنشاء حساب خدمة تستخدمه لتشغيل المهمة.

gcloud iam service-accounts create screenshot-sa --display-name="Screenshot app service account"

امنح الدور "storage.admin" لحساب الخدمة حتى يمكن استخدامه لإنشاء حِزم وعناصر.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --role roles/storage.admin \
  --member serviceAccount:screenshot-sa@$PROJECT_ID.iam.gserviceaccount.com

أصبحت جاهزًا الآن لنشر مهمة تشغيل السحابة الإلكترونية تتضمّن الإعدادات المطلوبة لتشغيل المهمة.

gcloud beta run jobs deploy screenshot \
  --source=. \
  --args="https://example.com" \
  --args="https://cloud.google.com" \
  --tasks=2 \
  --task-timeout=5m \
  --region=$REGION \
  --set-env-vars=BUCKET_NAME=screenshot-$PROJECT_ID \
  --service-account=screenshot-sa@$PROJECT_ID.iam.gserviceaccount.com

يستخدم هذا النشر المستند إلى المصدر وينشئ مهمة تشغيل السحابة الإلكترونية بدون تنفيذها.

لاحظ كيفية تمرير صفحات الويب كوسيطات. يتم تمرير اسم الحزمة لحفظ لقطات الشاشة كمتغيّر بيئة.

يمكنك تشغيل نُسخ متعددة من حاويتك بالتوازي عن طريق تحديد عدد من المهام لتشغيلها باستخدام علامة --tasks. وتمثل كل مهمة نسخة قيد التشغيل من الحاوية. يعد استخدام مهام متعددة مفيدًا إذا كانت كل مهمة يمكنها معالجة مجموعة فرعية من بياناتك بشكل مستقل. لتسهيل ذلك، تكون كل مهمة على علم بفهرسها، الذي يتم تخزينه في متغيّر البيئة CLOUD_RUN_TASK_INDEX. التعليمة البرمجية الخاصة بك مسئولة عن تحديد المهمة التي تعالج أي مجموعة فرعية من البيانات. لاحظ --tasks=2 في هذا النموذج. وهذا من شأنه التأكّد من تشغيل حاويتين لعنوانَي URL اللذين نريد معالجةهما.

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

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

6- تشغيل وظيفة

قبل تشغيل الوظيفة، قم بإدراج الوظيفة للتأكد من أنها قد تم إنشاؤها:

gcloud run jobs list

✔
JOB: screenshot
REGION: us-central
LAST RUN AT:
CREATED: 2022-02-22 12:20:50 UTC

يمكنك تشغيل المهمة باستخدام الأمر التالي:

gcloud run jobs execute screenshot --region=$REGION

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

gcloud run jobs executions list --job screenshot --region=$REGION

...
JOB: screenshot
EXECUTION: screenshot-znkmm
REGION: $REGION
RUNNING: 1
COMPLETE: 1 / 2
CREATED: 2022-02-22 12:40:42 UTC

وصف عملية التنفيذ. من المفترض أن تظهر لك علامة الاختيار الخضراء ورسالة tasks completed successfully:

gcloud run jobs executions describe screenshot-znkmm --region=$REGION

✔ Execution screenshot-znkmm in region $REGION
2 tasks completed successfully


Image:           $REGION-docker.pkg.dev/$PROJECT_ID/containers/screenshot at 311b20d9...
Tasks:           2
Args:            https://example.com https://cloud.google.com
Memory:          1Gi
CPU:             1000m
Task Timeout:    3600s
Parallelism:     2
Service account: 11111111-compute@developer.gserviceaccount.com
Env vars:
  BUCKET_NAME    screenshot-$PROJECT_ID

يمكنك أيضًا الاطّلاع على صفحة مهام تشغيل السحابة الإلكترونية في Cloud Console للاطّلاع على الحالة:

1afde14d65f0d9ce.png

في حال التحقّق من حزمة Cloud Storage، من المفترض أن يظهر لك ملفا لقطات الشاشة اللذين تم إنشاؤهما:

7c4d355f6f65106.png

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

لإيقاف تنفيذ مهمتك، عليك حذف العملية باتّباع الخطوات التالية:

gcloud run jobs executions delete screenshot-znkmm --region=$REGION

7. تعديل وظيفة

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

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

عدِّل المهمة وغيِّر الصفحات التي يلتقط التطبيق لقطات شاشة لها في علامة --args. ويمكنك أيضًا تعديل علامة --tasks لتعكس عدد الصفحات.

gcloud run jobs update screenshot \
  --args="https://www.pinterest.com" \
  --args="https://www.apartmenttherapy.com" \
  --args="https://www.google.com" \
  --region=$REGION \
  --tasks=3

إعادة تنفيذ المهمة تمر هذه المرة في علامة --wait لانتظار انتهاء عمليات التنفيذ:

gcloud run jobs execute screenshot --region=$REGION --wait

بعد بضع ثوانٍ، من المفترض أن تظهر لك 3 لقطات شاشة أخرى إلى الحزمة:

ed0cbe0b5a5f9144.png

8. جدولة مهمة

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

أولاً، تأكَّد من تفعيل Cloud Scheduler API:

gcloud services enable cloudscheduler.googleapis.com

انتقِل إلى صفحة تفاصيل مهام Cloud Run وانقر على القسم Triggers:

3ae456368905472f.png

انقر على زرّ "Add Scheduler Trigger":

48cbba777f75e1eb.png

يتم فتح لوحة على يسار الصفحة. يمكنك إنشاء مهمة أداة جدولة لتشغيلها كل يوم الساعة 9:00 باستخدام هذه الإعدادات واختيار Continue:

81fd098be0db216.png

في الصفحة التالية، اختَر حساب خدمة Compute Engine التلقائي واختَر Create:

fe479501dfb91f9f.png

من المفترض أن يظهر لك الآن مشغِّل جديد لأداة جدولة الجلسات في السحابة الإلكترونية:

5a7bc6d96b970b92.png

انقر على View Details للانتقال إلى صفحة Cloud Scheduler.

يمكنك الانتظار حتى الساعة 9 صباحًا حتى يتم تشغيل أداة الجدولة أو يمكنك تشغيل أداة جدولة المهام في السحابة الإلكترونية يدويًا من خلال اختيار Force Run:

959525f2c8041a6a.png

بعد بضع ثوانٍ، من المفترض أن ترى تنفيذ مهمة Cloud Scheduler بنجاح:

d64e03fc84d61145.png

من المفترض أن تظهر لك أيضًا 3 لقطات شاشة أخرى تمت إضافتها بواسطة المكالمة من أداة Cloud Scheduler:

56398a0e827de8b0.png

9. تهانينا

تهانينا، لقد أنهيت الدرس التطبيقي حول الترميز.

تنظيف البيانات (اختياري)

لتجنب تكبد أي رسوم، من الجيد تنظيف الموارد.

إذا لم تكن بحاجة إلى المشروع، يمكنك ببساطة حذفه من خلال اتّباع الخطوات التالية:

gcloud projects delete $PROJECT_ID

إذا كنت بحاجة إلى المشروع، يمكنك حذف الموارد بشكل فردي.

احذف رمز المصدر:

rm -rf ~/jobs-demos/

احذف مستودع Artifact Registry:

gcloud artifacts repositories delete containers --location=$REGION

حذف حساب الخدمة:

gcloud iam service-accounts delete screenshot-sa@$PROJECT_ID.iam.gserviceaccount.com

حذف مهمة تشغيل السحابة الإلكترونية:

gcloud run jobs delete screenshot --region=$REGION

حذف مهمة أداة جدولة المهام في السحابة الإلكترونية:

gcloud scheduler jobs delete screenshot-scheduler-trigger --location=$REGION

حذف حزمة Cloud Storage:

gcloud storage rm --recursive gs://screenshot-$PROJECT_ID

المواضيع التي تناولناها

  • كيفية استخدام تطبيق لالتقاط لقطات شاشة لصفحات الويب
  • كيفية إنشاء صورة حاوية للتطبيق.
  • كيفية إنشاء مهمة تشغيل السحابة الإلكترونية للتطبيق
  • كيفية تشغيل التطبيق كمهمة تشغيل السحابة الإلكترونية
  • كيفية تعديل المهمة
  • كيفية جدولة المهمة باستخدام Cloud Scheduler.