راه اندازی Cloud Run Jobs با Cloud Scheduler

۱. مرور کلی

در این آزمایش، شما یک کار Cloud Run ایجاد کرده و یک کار Cloud Scheduler راه‌اندازی خواهید کرد. شما با استفاده از اسکریپت راه‌اندازی، سرویس منوی Cymbal Eats را مستقر خواهید کرد. شما یک کار Cloud Run ایجاد خواهید کرد که فراخوانی‌های API را به سرویس منوی Cymbal Eats انجام می‌دهد. شما این کار را با استفاده از Google Cloud CLI اجرا کرده و یک برنامه زمانی برای این کار تنظیم خواهید کرد. شما با بررسی گزارش‌ها و برقراری فراخوانی‌های API به سرویس منو، اجرای آن را تأیید خواهید کرد تا تأیید شود که موارد منو حذف شده‌اند.

مشاغل Cloud Run چیست؟

وظیفه Cloud Run یک کانتینر را اجرا می‌کند که به درخواست‌های وب پاسخ نمی‌دهد، بلکه وظایف عملیاتی یا پردازش داده‌ها را انجام می‌دهد. کانتینر وظیفه را اجرا کرده و پس از اتمام، خارج می‌شود.

شغل خدمات نظافتی

وظیفه سرویس پاکسازی، آیتم‌های منو را در وضعیت «ناموفق» بازیابی کرده و آنها را حذف می‌کند. هنگامی که آیتم‌های منوی جدید ایجاد می‌شوند، تصاویر با استفاده از Vision API تجزیه و تحلیل می‌شوند تا تشخیص دهند که آیا یک آیتم غذایی هستند یا خیر. برای تصاویری که این اعتبارسنجی را با شکست مواجه می‌کنند، وضعیت آیتم‌های منو به «ناموفق» به‌روزرسانی شده و متعاقباً توسط وظیفه پاکسازی حذف می‌شوند.

d74200f0bd14d350.png

آنچه یاد خواهید گرفت

در این آزمایشگاه، شما یاد خواهید گرفت که چگونه موارد زیر را انجام دهید:

  • ایجاد مشاغل Cloud Run
  • اجرای وظایف Cloud Run
  • ایجاد مشاغل زمان‌بندی ابری
  • تأیید اجرای کارها

پیش‌نیازها

  • این آزمایشگاه فرض را بر آشنایی با محیط‌های Cloud Console و Shell می‌گذارد.
  • تجربه قبلی در زمینه Cloud Run و Cloud Scheduler مفید است اما الزامی نیست.

۲. تنظیمات و الزامات

راه‌اندازی پروژه ابری

  1. وارد کنسول گوگل کلود شوید و یک پروژه جدید ایجاد کنید یا از یک پروژه موجود دوباره استفاده کنید. اگر از قبل حساب جیمیل یا گوگل ورک اسپیس ندارید، باید یکی ایجاد کنید .

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • نام پروژه ، نام نمایشی برای شرکت‌کنندگان این پروژه است. این یک رشته کاراکتری است که توسط APIهای گوگل استفاده نمی‌شود. می‌توانید آن را در هر زمانی به‌روزرسانی کنید.
  • شناسه پروژه در تمام پروژه‌های گوگل کلود منحصر به فرد است و تغییرناپذیر است (پس از تنظیم، قابل تغییر نیست). کنسول کلود به طور خودکار یک رشته منحصر به فرد تولید می‌کند؛ معمولاً برای شما مهم نیست که چیست. در اکثر آزمایشگاه‌های کد، باید به شناسه پروژه ارجاع دهید (که معمولاً با عنوان PROJECT_ID شناخته می‌شود). اگر شناسه تولید شده را دوست ندارید، می‌توانید یک شناسه تصادفی دیگر ایجاد کنید. به عنوان یک جایگزین، می‌توانید شناسه خودتان را امتحان کنید و ببینید که آیا در دسترس است یا خیر. پس از این مرحله قابل تغییر نیست و در طول پروژه باقی خواهد ماند.
  • برای اطلاع شما، یک مقدار سوم هم وجود دارد، شماره پروژه که برخی از APIها از آن استفاده می‌کنند. برای کسب اطلاعات بیشتر در مورد هر سه این مقادیر، به مستندات مراجعه کنید.
  1. در مرحله بعد، برای استفاده از منابع/API های ابری، باید پرداخت صورتحساب را در کنسول ابری فعال کنید . اجرای این آزمایشگاه کد، اگر اصلاً هزینه‌ای نداشته باشد، هزینه زیادی نخواهد داشت. برای خاموش کردن منابع به طوری که پس از این آموزش متحمل پرداخت صورتحساب نشوید، می‌توانید منابعی را که ایجاد کرده‌اید یا کل پروژه را حذف کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان ۳۰۰ دلاری هستند.

تنظیمات محیط

با کلیک روی آیکون سمت راست نوار جستجو، Cloud Shell را فعال کنید.

eb0157a992f16fa3.png

از Cloud Shell، دستور زیر را برای کپی کردن کد برنامه از این مخزن اجرا کنید و به دایرکتوری حاوی سرویس منو بروید:

git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/menu-service

سرویس منو را با استفاده از اسکریپت راه‌اندازی در Cloud Run مستقر کنید. سرویس منو یک میکروسرویس مبتنی بر جاوا است که با چارچوب Quarkus و با استفاده از پایگاه داده Cloud SQL Postgres برای backend خود ساخته شده است. سرویس منو یک وابستگی زمان اجرا برای کار Cloud Run است که در مراحل بعدی ایجاد خواهید کرد.

./setup.sh

استقرار حدود 10 دقیقه طول خواهد کشید تا تمام اجزای مورد نیاز ایجاد شوند.

پس از اجرای دستور بالا، مراحل بعدی را ادامه دهید.

۳. کد کار Cloud Run را بررسی کنید

با کلیک روی نماد به علاوه، یک برگه جدید در Cloud Shell باز کنید.

45f480cd1b9a995.png

به دایرکتوری حاوی سرویس پاکسازی بروید و فایل‌هایی که این کار را انجام می‌دهند را بررسی کنید:

cd ~/cymbal-eats/cleanup-service

سرویس پاکسازی (cleanup-service) در این دایرکتوری حاوی یک Dockerfile است که تصویر کانتینر (container image) را برای کار سرویس پاکسازی (cleanup service) به همراه وابستگی‌های مورد نیاز (httpie، jq) تعریف می‌کند.

داکرفایل

FROM ubuntu:latest 
RUN apt-get update && apt-get install -y httpie jq && apt-get clean
COPY script.sh /
RUN chmod +x /script.sh
CMD ["/script.sh"]
ENTRYPOINT ["/bin/bash"]

اسکریپت پاکسازی واقعی، که در زیر فهرست شده است، شامل دستوراتی برای دریافت لیستی از آیتم‌های منو در وضعیت ناموفق و حذف آنها با انجام فراخوانی‌های API به سرویس منو است.

اسکریپت.sh

echo "FAILED_ITEM_AGE=$FAILED_ITEM_AGE"
echo "MENU_SERVICE_URL=$MENU_SERVICE_URL"
# Failed items older than FAILED_ITEM_AGE in minutes
for id in $(http GET $MENU_SERVICE_URL/menu/failed | jq '[.[] | select(.updateDateTime < ((now - 60 * (env.FAILED_ITEM_AGE | tonumber) )| strftime("%Y-%m-%dT%H:%M:%S.%f")))]'| jq '.[].id'); do
  echo "Deleting Menu Item : $MENU_SERVICE_URL/menu/$id"
  http GET $MENU_SERVICE_URL/menu/$id
  http DELETE $MENU_SERVICE_URL/menu/$id
done

# Processing items older than FAILED_ITEM_AGE in minutes
for id in $(http GET $MENU_SERVICE_URL/menu/processing | jq '[.[] | select(.updateDateTime < ((now - 60 * (env.FAILED_ITEM_AGE | tonumber))| strftime("%Y-%m-%dT%H:%M:%S.%f")))]'| jq '.[].id'); do
  echo "Deleting Menu Item : $MENU_SERVICE_URL/menu/$id"
  http GET $MENU_SERVICE_URL/menu/$id
  http DELETE $MENU_SERVICE_URL/menu/$id
done

به نکات زیر در مورد اسکریپت توجه کنید:

  • متغیرهای محیطی FAILED_ITEM_AGE و MENU_SERVICE_URL در طول استقرار تنظیم شده و توسط Cloud Run job ارسال می‌شوند.
  • FAILED_ITEM_AGE - تعداد دقایق قبل از حذف آیتم ناموفق.
  • MENU_SERVICE_URL - آدرس سرویس منوی Cymbal Eats.

۴. ایجاد شغل Cloud Run

در مرحله بعد، یک تصویر کانتینر ایجاد کرده و آن را در رجیستری Artifact منتشر خواهید کرد.

این تصویر کانتینر برای ایجاد یک کار Cloud Run استفاده خواهد شد.

فعال کردن API های سرویس:

gcloud services enable \
    run.googleapis.com \
    artifactregistry.googleapis.com \
    cloudscheduler.googleapis.com \
    --quiet

تنظیم متغیرهای محیطی:

export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export PROJECT_NAME=$(gcloud projects describe $PROJECT_ID --format='value(name)')
export REGION=us-east1
export MENU_SERVICE_NAME=menu-service

یک مخزن جدید Artifact Registry برای ذخیره تصاویر docker برای کار پاکسازی ایجاد کنید:

gcloud artifacts repositories create cymbal-eats --repository-format=docker --location=$REGION

با استفاده از Cloud Build، ایمیج کانتینر را بسازید و با یک دستور آن را به Artifact Registry منتقل کنید:

gcloud builds submit -t $REGION-docker.pkg.dev/$PROJECT_NAME/cymbal-eats/cleanup-service:latest

خروجی مثال:

DURATION: 35S
SOURCE: gs://cymbal-eats-14906-569_cloudbuild/source/1657126400.933586-dc3e91ec85934a55bb6d2f7012611365.tgz
IMAGES: us-east1-docker.pkg.dev/cymbal-eats-14906-569/cymbal-eats/cleanup-service (+1 more)
STATUS: SUCCESS

پس از انتشار، به Artifact Registry بروید و تصویر منتشر شده را بررسی کنید:

fb95ae38baa7c543.png

به تب دوم Cloud Shell برگردید. دستور زیر را برای توصیف سرویس منو اجرا کنید و URL را در متغیر محیطی ذخیره کنید. این متغیر محیطی برای پیکربندی کار Cloud Run استفاده خواهد شد.

MENU_SERVICE_URL=$(gcloud run services describe $MENU_SERVICE_NAME \
 --region=$REGION \
 --format=json | jq \
 --raw-output ".status.url")

یک کار Cloud Run برای پاک کردن موارد منوی ناموفق که قدیمی‌تر از ۱ دقیقه هستند ایجاد کنید [تنظیم شده توسط FAILED_ITEM_AGE ].

gcloud beta run jobs create cleanup-service \
  --image=$REGION-docker.pkg.dev/$PROJECT_NAME/cymbal-eats/cleanup-service:latest \
  --set-env-vars MENU_SERVICE_URL=$MENU_SERVICE_URL \
  --set-env-vars FAILED_ITEM_AGE=1 \
  --region $REGION

خروجی مثال:

Creating Cloud Run job [cleanup-service] in project [cymbal-eats] region [us-east1]
OK Creating job... Done.
Done.
Job [cleanup-service] has successfully been created.

به بخش Cloud Run JOBS در کنسول بروید و کار ایجاد شده را بررسی کنید.

روی کار کلیک کنید و تب‌های موجود را بررسی کنید: تاریخچه (HISTORY)، گزارش‌ها (LOGS)، پیکربندی (CONFIGURATION) و YAML.

b12c8e312de3b66.png

با بررسی بخش CONFIGURATION مربوط به job در کنسول، تأیید کنید که متغیرهای محیطی تنظیم شده‌اند:

724c2919d05349c8.png

(اختیاری) اگر می‌خواهید متغیرهای Failed Item Age یا Menu Service URL را تغییر دهید، پس از ایجاد Cloud Run job، می‌توانید از دستور update استفاده کنید:

gcloud beta run jobs update cleanup-service \
  --image=$REGION-docker.pkg.dev/$PROJECT_NAME/cymbal-eats/cleanup-service:latest \
  --set-env-vars MENU_SERVICE_URL=$MENU_SERVICE_URL \
  --set-env-vars FAILED_ITEM_AGE=1 \
  --region $REGION

برای اعتبارسنجی کار، کار Cloud Run را با اجرای دستور زیر اجرا کنید:

gcloud beta run jobs execute cleanup-service --region=$REGION

خروجی مثال:

OK Creating execution... Done.                                   
  OK Provisioning resources...
Done.
Execution [cleanup-service-rlxs4] has successfully started running.

View details about this execution by running:
gcloud beta run jobs executions describe cleanup-service-rlxs4
 

برای بررسی خروجی کار، به برگه LOGS بروید. باید «سن مورد ناموفق» و «نشانی اینترنتی سرویس منو» را در گزارش‌ها مشاهده کنید.

518cb00036a2561f.png

۵. تنظیم برنامه برای اجرای ابری

Cloud Scheduler یک زمانبند cron job کاملاً مدیریت‌شده در سطح سازمانی است. این ابزار به شما امکان می‌دهد تقریباً هر کاری، از جمله کارهای دسته‌ای، داده‌های بزرگ، عملیات زیرساخت ابری و موارد دیگر را زمان‌بندی کنید.

یکی از بهترین اقدامات امنیتی هنگام کار با یک کار زمان‌بندی ابری، اجرای هر کار با اعتبارنامه‌های جداگانه است. در این مرحله، یک حساب کاربری سرویس برای استفاده توسط کار زمان‌بندی پاکسازی ایجاد کنید.

export SCHEDULER_SERVICE_ACCOUNT=cleanup-scheduler-job-sa

gcloud iam service-accounts create ${SCHEDULER_SERVICE_ACCOUNT}

وظیفه‌ی Cloud Scheduler برای برقراری تماس با Cloud Run Jobs به مجوز نیاز دارد.

نقش Cloud Run Invoker را به حساب سرویسی که در کار Cloud Scheduler استفاده می‌شود، اعطا کنید:

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
  --member="serviceAccount:${SCHEDULER_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com" \
  --role="roles/run.invoker"

در مرحله بعد، برنامه‌ای برای اجرای سرویس پاکسازی تنظیم خواهید کرد.

چندین نوع هدف توسط Cloud Scheduler پشتیبانی می‌شوند.

  • اچ‌تی‌پی
  • میخانه/ساب
  • موتور برنامه HTTP

شما یک کار زمان‌بندی با استفاده از نوع هدف HTTP ایجاد خواهید کرد.

برای اهداف نمایشی، آن را طوری برنامه‌ریزی می‌کنید که هر ۵ دقیقه یکبار اجرا شود.

gcloud scheduler jobs create http cleanup-schedule \
    --location $REGION \
    --schedule="*/5 * * * *" \
    --uri="https://$REGION-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/$PROJECT_ID/jobs/cleanup-service:run" \
    --http-method POST \
    --oauth-service-account-email ${SCHEDULER_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com

پارامتر uri که برای فراخوانی Cloud Run Job استفاده می‌شود را بررسی کنید:

  • REGION و PROJECT_ID - شناسه منطقه و پروژه Cloud Run که در آن سرویس پاکسازی مستقر شده است
  • cleanup-service - نام وظیفه Cloud Run

برای بررسی کار زمان‌بندی ایجاد شده، به Cloud Scheduler در کنسول بروید:

3bc9120df7fc6ed.png

گزینه‌های موجود در منوی «اقدامات» را بررسی کنید.

7945908025dd2f2b.png

۶. اجرای آزمایشی کار در فضای ابری

با استفاده از نقاط پایانی سرویس منو، موارد موجود در منو و وضعیت آنها را بررسی کنید:

curl ${MENU_SERVICE_URL}/menu | jq

خروجی:

در وضعیت Ready ۳ گزینه منو مشاهده خواهید کرد.

تغییر وضعیت گزینه منوی شماره ۱ به Failed :

curl -X PUT "${MENU_SERVICE_URL}/menu/1" \
  -H 'Content-Type: application/json' \
  -d '{"status": "Failed"}' | jq

۱ دقیقه صبر کنید. برای حذف آیتم منو، باید ۱ دقیقه از تاریخ آن گذشته باشد، همانطور که توسط پارامتر FAILED_ITEM_AGE تنظیم شده است.

می‌توانید منتظر اجرای زمان‌بندی‌شده‌ی بعدی باشید یا اجرای کار را از طریق کنسول اجباری کنید.

روش‌های مختلفی برای شروع یک کار وجود دارد، از طریق رابط کاربری یا از طریق خط فرمان.

برای این مثال، دستور را در Cloud Shell (گزینه شماره ۳) اجرا کنید تا کار آغاز شود.

  1. از Cloud Scheduler با انتخاب گزینه «اجبار به اجرای کار» از منوی «اقدامات».

6c8cbeae6165ba4a.png

  1. با کلیک روی دکمه "EXECUTE" از Cloud Run Job را اجرا کنید .

۲۲۹c۲۲۲۸۸۸۸۲b۵c۳.png

  1. از طریق Cloud Shell با اجرای دستور زیر:
gcloud beta run jobs execute cleanup-service --region=$REGION

به بخش Cloud Run JOBS بروید، تب LOGS را باز کنید و تأیید کنید که مورد منو حذف شده است.

50829ae27b135b2d.png

برای یافتن لاگ‌ها، لاگ‌ها را با کلمه کلیدی "deleting" فیلتر کنید.

d94fb9e444b1c1b8.png

از نقاط پایانی سرویس منو برای بررسی آیتم‌های منوی موجود از طریق نقطه پایانی REST استفاده کنید.

curl ${MENU_SERVICE_URL}/menu | jq

خروجی:

در وضعیت Ready دو گزینه منو مشاهده خواهید کرد.

۷. تبریک می‌گویم!

تبریک می‌گویم، شما codelab را تمام کردید!

آنچه ما پوشش داده‌ایم:

  • نحوه ایجاد مشاغل Cloud Run
  • نحوه اجرای کارهای Cloud Run
  • نحوه ایجاد مشاغل زمانبند ابری
  • نحوه تأیید اجرای کارها

قدم بعدی چیست؟

سایر آزمایشگاه‌های کد Cymbal Eats را کاوش کنید:

تمیز کردن

برای جلوگیری از تحمیل هزینه به حساب گوگل کلود خود برای منابع استفاده شده در این آموزش، یا پروژه‌ای که شامل منابع است را حذف کنید، یا پروژه را نگه دارید و منابع تکی را حذف کنید.

حذف پروژه

ساده‌ترین راه برای حذف هزینه‌ها، حذف پروژه‌ای است که برای آموزش ایجاد کرده‌اید.