كيفية جدولة مهمة Cloud Run ضمن نطاق عناصر التحكّم في خدمة VPC

1. مقدمة

نظرة عامة

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

تبدو البنية على النحو التالي:

مخطّط يوضّح خدمة Cloud Scheduler التي تشغّل خدمة Cloud Run تنفّذ مهمة Cloud Run

ما ستتعلمه

  • كيفية تشغيل مهمة Cloud Run وفقًا لجدول زمني داخل محيط VPC SC
  • كيفية إنشاء خدمة Cloud Run تؤدي إلى تشغيل مهمة Cloud Run باستخدام مكتبات برامج Cloud Run
  • كيفية ضبط Cloud Scheduler لاستدعاء خدمة Cloud Run وفقًا لجدول زمني

2. قبل البدء

في البداية، تأكَّد من اتّباع الخطوات اللازمة لإعداد Cloud Run من أجل عناصر التحكّم في خدمة سحابة VPC.

بعد ذلك، اضبط متغيّرات البيئة التي سيتم استخدامها في هذا الدرس التطبيقي.

PROJECT_ID=<YOUR_PROJECT_ID>
REGION=<YOUR_REGION>
AR_REPO=sample-job-repo
CLOUD_RUN_SERVICE=job-runner-service
CLOUD_RUN_JOB=sample-job
CLOUD_SCHEDULER=job-scheduler
SERVICE_ACCOUNT="cloud-run-invoker-sa"
SERVICE_ACCOUNT_ADDRESS=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com
NETWORK=default
SUBNET=default

3- إنشاء مهمة Cloud Run

يستخدم هذا الدرس التطبيقي حول الترميز حاوية نموذجية لمهام Cloud Run.

أولاً، أنشئ مستودع Artifact Registry لحاوية مهمة Cloud Run.

gcloud artifacts repositories create $AR_REPO --repository-format=docker --location=$REGION --description="codelab for Cloud Run jobs on schedule within VPC SC"

بعد ذلك، انسخ نموذج حاوية مهام Cloud Run إلى Artifact Registry ضِمن مشروعك الذي تم ضبطه باستخدام VPC SC. يمكنك استخدام أداة gcrane لإجراء ذلك من خلال اتّباع تعليمات التثبيت هذه. يمكنك الاطّلاع على مزيد من المعلومات حول gcrane في مستندات نسخ الصور بين المستودعات.

gcrane cp us-docker.pkg.dev/cloudrun/container/job:latest $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$CLOUD_RUN_JOB:latest

ثانيًا، يمكنك نشر مهمة Cloud Run المتوافقة مع عناصر التحكّم في خدمة سحابة VPC.

gcloud run jobs create $CLOUD_RUN_JOB --region $REGION \
 --image $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$CLOUD_RUN_JOB:latest \
 --network=$NETWORK \
 --subnet=$SUBNET \
 --vpc-egress=all-traffic

لمزيد من المعلومات حول إنشاء المهام، يُرجى اتّباع الخطوات الواردة هنا في مستندات مهام Cloud Run.

4. إنشاء حساب خدمة

سيتم استخدام حساب الخدمة هذا من قِبل Cloud Run لاستدعاء مهمة Cloud Run.

أولاً، أنشئ حساب الخدمة من خلال تنفيذ الأمر التالي:

gcloud iam service-accounts create $SERVICE_ACCOUNT \
  --display-name="Cloud Run to run a Cloud Run job"

ثانيًا، امنح حساب الخدمة دور Cloud Run Invoker ودور Cloud Run Viewer.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role=roles/run.invoker

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role=roles/run.viewer

5- إنشاء خدمة Cloud Run

في هذه الخطوة، ستنشئ خدمة Cloud Run تعمل كخادم وكيل.

mkdir job-runner-service && cd $_

أنشئ ملفًا باسم main.py يتضمّن الرمز التالي.

import os
from flask import Flask
app = Flask(__name__)

# pip install google-cloud-run
from google.cloud import run_v2

@app.route('/')
def hello():

    client = run_v2.JobsClient()

    # UPDATE TO YOUR JOB NAME, REGION, AND PROJECT ID
    job_name = 'projects/YOUR_PROJECT_ID/locations/YOUR_JOB_REGION/jobs/YOUR_JOB_NAME' 

    print("Triggering job...")
    request = run_v2.RunJobRequest(name=job_name)
    operation = client.run_job(request=request)
    response = operation.result()

    print(response)
    return "Done!"

if __name__ == '__main__':
    app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))

أنشئ ملفًا باسم requirements.txt يتضمّن الرمز البرمجي التالي.

google-cloud-run
flask

أخيرًا، أنشئ Dockerfile.

FROM python:3.9-slim-buster
# for logging purposes
ENV PYTHONUNBUFFERED=True

WORKDIR /app

COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt

COPY . .

CMD ["python3", "main.py"]

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

docker build -t $CLOUD_RUN_SERVICE .

docker tag $CLOUD_RUN_SERVICE $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$CLOUD_RUN_SERVICE

docker push $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$CLOUD_RUN_SERVICE

الآن، يمكنك نشر خدمة Cloud Run المتوافقة مع عناصر التحكّم في خدمة سحابة VPC.

gcloud run deploy $CLOUD_RUN_SERVICE --region $REGION \
 --image $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$CLOUD_RUN_SERVICE \
 --service-account $SERVICE_ACCOUNT_ADDRESS \
 --network=$NETWORK \
 --subnet=$SUBNET \
 --vpc-egress=all-traffic \
 --no-allow-unauthenticated \
 --ingress internal

احفظ عنوان URL لنقطة نهاية الخدمة من خلال تنفيذ الأمر التالي:

SERVICE_URL=$(gcloud run services describe $CLOUD_RUN_SERVICE --region $REGION --format 'value(status.url)')

6. إنشاء مهمة Cloud Schedule لتشغيل الخدمة

# create the Cloud Scheduler job
gcloud scheduler jobs create http $CLOUD_SCHEDULER \
  --location=$REGION \
  --schedule="0 0 1 * *" \
  --uri=$SERVICE_URL \
  --http-method=GET \
  --oidc-service-account-email=$SERVICE_ACCOUNT_ADDRESS

بعد إنشاء مهمة Cloud Scheduler، يمكنك تنفيذ الأمر التالي لتشغيل مهمة Cloud Scheduler على الفور لأغراض الاختبار:

gcloud scheduler jobs run $CLOUD_SCHEDULER --location=$REGION

ملاحظة:

قد تحتاج إلى الانتظار بضع دقائق حتى تكتمل عملية تنفيذ المهمة. يمكنك تتبُّع حالتها في صفحة Cloud Run Scheduler.

تأكَّد من أنّ مهمة Cloud Run تم تنفيذها بنجاح من خلال تنفيذ الأوامر التالية:

EXECUTION_NAME=$(gcloud run jobs describe $CLOUD_RUN_JOB --region $REGION --format 'value(status.latestCreatedExecution.name)')

gcloud run jobs executions describe $EXECUTION_NAME --region $REGION

من المفترض أن يظهر لك شيء مشابه لما يلي:

✔ Execution sample-job-w6hrj in region us-central1
1 task completed successfully
Elapsed time: 28 seconds

7. تهانينا!

تهانينا على إكمال هذا الدرس العملي.

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

  • كيفية تشغيل مهمة Cloud Run وفقًا لجدول زمني داخل محيط VPC SC
  • كيفية إنشاء خدمة Cloud Run تؤدي إلى تشغيل مهمة Cloud Run باستخدام مكتبات برامج Cloud Run
  • كيفية ضبط Cloud Scheduler لاستدعاء خدمة Cloud Run وفقًا لجدول زمني

8. تَنظيم

لتجنُّب الرسوم غير المقصودة (على سبيل المثال، إذا تم استدعاء خدمات Cloud Run مرات أكثر من عدد مرات الاستدعاء المخصّصة لك شهريًا في الطبقة المجانية)، يمكنك إما حذف خدمات GCP أو حذف المشروع الذي أنشأته في الخطوة 2.

لحذف خدمة Cloud Run ومهمة Cloud Run، انتقِل إلى Cloud Run Cloud Console على https://console.cloud.google.com/run واحذف الخدمة.

إذا اخترت حذف المشروع بأكمله، يمكنك الانتقال إلى https://console.cloud.google.com/cloud-resource-manager، واختيار المشروع الذي أنشأته في الخطوة 2، ثم النقر على "حذف". إذا حذفت المشروع، عليك تغيير المشاريع في Cloud SDK. يمكنك الاطّلاع على قائمة بجميع المشاريع المتاحة من خلال تنفيذ gcloud projects list.