הפעלת משימות לפי לוח זמנים

בדף הזה מוסבר איך להריץ משימות של Cloud Run לפי לוח זמנים באמצעות crontab.

התפקידים הנדרשים

כדי לקבל את ההרשאות שנדרשות לפעולות שמתוארות בדף הזה, צריך לבקש מהאדמין להקצות לכם אחד מתפקידי ה-IAM הבאים בעבודת Cloud Run:

  • כדי להריץ משימות באמצעות Google Cloud CLI: Cloud Run Invoker ‏ (roles/run.invoker) במשימה ב-Cloud Run.
  • כדי להריץ משימות באמצעות מסוף Cloud de Confiance , כדי לשנות את ההגדרות של המשימות או כדי לבטל את ההרצה של המשימות: Cloud Run Developer (roles/run.developer) במשימה ב-Cloud Run.

רשימת ההרשאות והתפקידים ב-IAM שמשויכים ל-Cloud Run מופיעה במאמרים תפקידי IAM ב-Cloud Run והרשאות IAM ב-Cloud Run. אם עבודת Cloud Run שלכם מתקשרת עםCloud de Confiance ממשקי API, כמו ספריות לקוח ב-Cloud, כדאי לעיין במדריך להגדרת זהות שירות. מידע נוסף על מתן תפקידים זמין במאמרים הרשאות פריסה וניהול גישה.

מעניקים לחשבון השירות גישה לפרויקט

אם לא יצרתם חשבון שירות בשביל העבודה שלכם ב-Cloud Run, אתם צריכים ליצור חשבון שירות. לדוגמה:

gcloud iam service-accounts create SERVICE_ACCOUNT_NAME

מחליפים את SERVICE_ACCOUNT_NAME בשם של חשבון השירות, לדוגמה, job-scheduler.

כדי לקבל את ההרשאות שחשבון השירות צריך כדי להריץ משימות, צריך לבקש מהאדמין להקצות לחשבון השירות את התפקיד Jobs Executor (roles/run.jobsExecutor) בפרויקט. לדוגמה:

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=serviceAccount:job-scheduler@PROJECT_ID.s3ns.iam.gserviceaccount.com \
    --role roles/run.jobsExecutor

מחליפים את PROJECT_ID במזהה הפרויקט.

לפני שמתחילים

אם עדיין לא יצרתם עבודה ב-Cloud Run, אתם צריכים ליצור עבודה.

הגדרת משימת Cloud Run לביצוע לפי לוח זמנים

כדי להריץ משימת Cloud Run לפי לוח זמנים:

  1. יוצרים ספרייה חדשה בשם cloud-run-jobs-sched ועוברים אליה:

    mkdir cloud-run-jobs-sched
    cd cloud-run-jobs-sched
  2. יוצרים קובץ Dockerfile ומדביקים בו את השורות הבאות:

    FROM gcr.io/google.com/cloudsdktool/google-cloud-cli:536.0.1
    
    RUN apt-get update -y && \
    apt-get install -y python3-dev python3-pip python3-venv && \
    apt-get install -y cron
    
    ENV APP_HOME /app
    WORKDIR $APP_HOME
    COPY . ./
    
    ENV VIRTUAL_ENV=/opt/venv
    RUN python3 -m venv $VIRTUAL_ENV
    ENV PATH="$VIRTUAL_ENV/bin:$PATH"
    
    RUN pip install --no-cache-dir -r requirements.txt
    
    # Set up the cron schedule.
    RUN crontab /app/cron
    
    CMD /app/entrypoint.sh
  3. יוצרים קובץ entrypoint.sh ומדביקים בו את השורות הבאות:

    gcloud config set project $PROJECT
    gcloud config set run/region $REGION
    
    cron
    
    gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app
  4. יוצרים קובץ main.py ומדביקים בו את קוד Python הבא:

    import os
    
    from flask import Flask
    
    app = Flask(__name__)
    
    @app.route("/")
    def hello_world():
        return "Hello World!"
    
    if __name__ == "__main__":
        app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))
  5. יוצרים קובץ requirements.txt ומדביקים בו את התלות הבאה:

    Flask==3.0.3
    gunicorn==23.0.0
    Werkzeug==3.0.3
  6. יוצרים קובץ cron בספרייה ומוסיפים תזמון cron להרצת העבודה. לדוגמה:

    0 2 * * * gcloud run jobs execute --async test-job > /proc/1/fd/1 2>&1

    הפקודה הזו מריצה משימה בשם test-job כל יום בשעה 2:00. כל השגיאות שיתרחשו במהלך הפעלת המשימה יוצגו ביומנים של השירות.

    כדי ליצור כמה לוחות זמנים לכמה משימות, מעדכנים את הקובץ cron עם כל המשימות שרוצים להריץ, ועם לוח הזמנים שמשויך לכל אחת מהן. לדוגמה:

    ${cron_schedule} gcloud run jobs execute --async ${job_1} > /proc/1/fd/1 2>&1
    ${cron_schedule} gcloud run jobs execute --async ${job_2} > /proc/1/fd/1 2>&1
    ...
  7. פריסת שירות מתזמן המשימות:

    gcloud run deploy JOB_NAME \
        --source . \
        --region REGION \
        --set-env-vars PROJECT=PROJECT_ID,REGION=REGION \
        --service-account SERVICE_ACCOUNT \
        --no-allow-unauthenticated \
        --min-instances=1 \
        --no-cpu-throttling

    מחליפים את מה שכתוב בשדות הבאים:

    • JOB-NAME: השם של המשימה ב-Cloud Run.
    • PROJECT_ID: מזהה הפרויקט.
    • REGION: האזור של משימת Cloud Run, לדוגמה, europe-west1.

המאמרים הבאים

אחרי שתשתמשו בתכונה הזו, תוכלו לבצע את הפעולות הבאות: