איך לתזמן משימה ב-Cloud Run בתוך מתחם VPC Service Controls

איך לתזמן משימה ב-Cloud Run בתוך מתחם VPC Service Controls

מידע על Codelab זה

subjectהעדכון האחרון: ינו׳ 18, 2025
account_circleנכתב על ידי גוגלר

1.‏ מבוא

סקירה כללית

אם הפרויקט ב-GCP נמצא בתוך גבולות של VPC SC, תצטרכו לבצע פעולות נוספות כדי להגדיר משימות מתוזמנות. מכיוון ש-Cloud Scheduler לא יכול להפעיל משימות ישירות בתוך תחומי VPC SC, תצטרכו להעביר את הבקשה דרך רכיב אחר. מומלץ להשתמש בשירות Cloud Run בתור שרת ה-proxy הזה.

הארכיטקטורה נראית כך:

תרשים של Cloud Scheduler שמפעיל שירות Cloud Run שמריץ משימה ב-Cloud Run

מה תלמדו

  • איך מריצים משימה ב-Cloud Run לפי לוח זמנים בתוך מתחם VPC SC
  • איך יוצרים שירות Cloud Run שמפעיל משימה ב-Cloud Run באמצעות ספריות הלקוח של Cloud Run
  • איך מגדירים את Cloud Scheduler להפעלת שירות Cloud Run לפי לוח זמנים

2.‏ לפני שמתחילים

קודם כול, חשוב לוודא שביצעתם את השלבים להגדרת Cloud Run ל-VPC Service Controls.

בשלב הבא מגדירים משתני סביבה שישמשו לאורך כל סדנת הקוד.

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 Service Controls.

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 שישמש כשרתי proxy.

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 Service Controls.

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 Scheduler כדי להפעיל את השירות

# 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.‏ מעולה!

כל הכבוד על השלמת ה-Codelab!

מה עסקנו בו

  • איך מריצים משימה ב-Cloud Run לפי לוח זמנים בתוך מתחם VPC SC
  • איך יוצרים שירות Cloud Run שמפעיל משימה ב-Cloud Run באמצעות ספריות הלקוח של Cloud Run
  • איך מגדירים את Cloud Scheduler להפעלת שירות Cloud Run לפי לוח זמנים

8.‏ הסרת המשאבים

כדי להימנע מחיובים לא מכוונים (לדוגמה, אם שירותי Cloud Run מופעלים בטעות יותר פעמים מההקצאה החודשית שלכם להפעלות של Cloud Run בתוכנית ללא תשלום), אתם יכולים למחוק את שירותי GCP או למחוק את הפרויקט שיצרתם בשלב 2.

כדי למחוק את שירות Cloud Run ואת המשימה ב-Cloud Run, נכנסים למסוף Cloud של Cloud Run בכתובת https://console.cloud.google.com/run ומוחקים את השירות.

אם בוחרים למחוק את הפרויקט כולו, אפשר לעבור אל https://console.cloud.google.com/cloud-resource-manager, לבחור את הפרויקט שיצרתם בשלב 2 ולבחור באפשרות Delete (מחיקה). אם תמחקו את הפרויקט, תצטרכו לשנות את הפרויקטים ב-Cloud SDK. כדי להציג את רשימת כל הפרויקטים הזמינים, מריצים את הפקודה gcloud projects list.