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

1. بررسی اجمالی

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

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

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

کار خدمات پاکسازی

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

d74200f0bd14d350.png

آنچه خواهید آموخت

در این آزمایشگاه با نحوه انجام کارهای زیر آشنا می شوید:

  • مشاغل Cloud Run را ایجاد کنید
  • کارهای Cloud Run را اجرا کنید
  • ایجاد مشاغل Cloud Scheduler
  • بررسی اجرای مشاغل

پیش نیازها

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

2. راه اندازی و الزامات

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

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

راه اندازی محیط

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

eb0157a992f16fa3.png

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

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

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

./setup.sh

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

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

3. کد شغلی Cloud Run را کاوش کنید

با کلیک بر روی نماد مثبت، یک تب جدید در Cloud Shell باز کنید.

45f480cd1b9a995.png

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

cd ~/cymbal-eats/cleanup-service

سرویس پاکسازی در این فهرست حاوی یک Dockerfile است که تصویر کانتینر را برای کار سرویس پاکسازی با وابستگی‌های مورد نیاز (httpie, jq) تعریف می‌کند.

Dockerfile

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 با سرویس Menu است.

script.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 ارسال می‌شوند.
  • FAILED_ITEM_AGE - تعداد دقیقه قبل از مورد ناموفق حذف خواهد شد.
  • MENU_SERVICE_URL - نشانی اینترنتی سرویس منوی Cymbal Eats.

4. Cloud Run Job ایجاد کنید

در مرحله بعد یک تصویر ظرف می سازید و آن را در رجیستری 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 جدید برای ذخیره تصاویر داکر برای کار پاکسازی ایجاد کنید:

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

تصویر کانتینر را با استفاده از Cloud Build بسازید و با یک دستور آن را به رجیستری Artifact فشار دهید:

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 بروید و تصویر منتشر شده را بررسی کنید:

fb95ae38baa7c543.png

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

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

یک کار Cloud Run ایجاد کنید تا موارد منوی ناموفق قدیمی‌تر از 1 دقیقه را پاک کنید [تنظیم شده توسط 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 کار در کنسول، بررسی کنید که متغیرهای محیطی تنظیم شده اند:

724c2919d05349c8.png

(اختیاری) اگر می خواهید متغیرهای آدرس اینترنتی Failed Item Age یا Menu Service را تغییر دهید، پس از ایجاد کار Cloud Run، می توانید از دستور 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

5. یک برنامه برای Cloud Run Job تنظیم کنید

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

یکی از بهترین روش های امنیتی هنگام کار با یک کار Cloud Scheduler این است که هر کار را با اعتبار جداگانه اجرا کنید. در این مرحله یک حساب سرویس برای استفاده توسط کار زمانبندی پاکسازی ایجاد کنید.

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

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

برای اهداف نمایشی، برنامه ریزی می کنید که هر 5 دقیقه اجرا شود.

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 - منطقه اجرای ابر و شناسه پروژه که در آن کار سرویس پاکسازی مستقر است
  • cleanup-service - نام Cloud Run Job

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

3bc9120df7fc6ed.png

گزینه های موجود را در منوی Actions مرور کنید.

7945908025dd2f2b.png

6. Cloud Run Job را تست کنید

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

curl ${MENU_SERVICE_URL}/menu | jq

خروجی:

3 مورد منو را در وضعیت Ready خواهید دید.

تغییر وضعیت آیتم منو شماره 1 به Failed :

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

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

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

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

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

  1. از Cloud Scheduler با انتخاب "Force a job run" از منوی Actions.

6c8cbeae6165ba4a.png

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

229c22288882b5c3.png

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

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

50829ae27b135b2d.png

سیاهههای مربوط به "حذف" کلمه کلیدی را برای یافتن سیاههها فیلتر کنید.

d94fb9e444b1c1b8.png

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

curl ${MENU_SERVICE_URL}/menu | jq

خروجی:

2 آیتم منو را در وضعیت Ready خواهید دید.

7. تبریک می گویم!

تبریک می گویم، شما نرم افزار کد را تمام کردید!

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

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

بعدش چیه:

سایر کدهای Cymbal Eats را کاوش کنید:

تمیز کردن

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

حذف پروژه

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