הפעלת משימת Cloud Run באמצעות Workflows

בעזרת Workflows תוכלו להריץ משימות של Cloud Run כחלק מתהליך עבודה כדי לבצע עיבוד נתונים מורכב יותר או לתזמן מערכת של משימות קיימות.

במדריך הזה נסביר איך להשתמש ב-Workflows כדי להריץ משימה ב-Cloud Run שמעבדת נתונים שמועברים למשימה כמשתני סביבה, בתגובה לאירוע מ-Cloud Storage.

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

מטרות

במדריך הזה תלמדו:

  1. יוצרים משימה ב-Cloud Run שמעבדת קובצי נתונים בקטגוריה של Cloud Storage.
  2. פורסים תהליך עבודה שמבצע את הפעולות הבאות:
    1. מקבלת אירוע של Cloud Storage כארגומנט.
    2. בודקת אם הקטגוריה של Cloud Storage שצוינה באירוע היא אותה קטגוריה שמשמשת את המשימה של Cloud Run.
    3. אם כן, המערכת משתמשת במחבר Cloud Run Admin API כדי להפעיל את משימת Cloud Run.
  3. יוצרים טריגר Eventarc שמפעיל את תהליך העבודה בתגובה לאירועים שמשפיעים על הקטגוריה של Cloud Storage.
  4. מפעילים את תהליך העבודה על ידי עדכון של קובץ נתוני קלט בקטגוריה של Cloud Storage.

עלויות

במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:

כדי ליצור הערכת עלויות בהתאם לשימוש החזוי, אתם יכולים להשתמש במחשבון התמחור.

משתמשים חדשים של Google Cloud ? יכול להיות שאתם זכאים לתקופת ניסיון בחינם.

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

יכול להיות שהגבלות אבטחה שהוגדרו בארגון שלכם ימנעו מכם להשלים את השלבים הבאים. מידע לפתרון בעיות זמין במאמר פיתוח אפליקציות בסביבה Google Cloud מוגבלת.

המסוף

  1. נכנסים לחשבון Google Cloud . אנחנו ממליצים למשתמשים חדשים ב- Google Cloud ליצור חשבון כדי שיוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Artifact Registry, Cloud Build, Cloud Run, Cloud Storage, Eventarc, and Workflows APIs, if any are not already enabled.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the APIs

  5. Create a service account:

    1. Ensure that you have the Create Service Accounts IAM role (roles/iam.serviceAccountCreator) and the Project IAM Admin role (roles/resourcemanager.projectIamAdmin). Learn how to grant roles.
    2. In the Google Cloud console, go to the Create service account page.

      Go to Create service account
    3. Select your project.
    4. In the Service account name field, enter a name. The Google Cloud console fills in the Service account ID field based on this name.

      In the Service account description field, enter a description. For example, Service account for quickstart.

    5. Click Create and continue.
    6. Grant the following roles to the service account: Cloud Run Admin, Eventarc Event Receiver, Logs Writer, Workflows Invoker.

      To grant a role, find the Select a role list, then select the role.

      To grant additional roles, click Add another role and add each additional role.

    7. Click Continue.
    8. Click Done to finish creating the service account.

  6. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  7. Verify that billing is enabled for your Google Cloud project.

  8. Enable the Artifact Registry, Cloud Build, Cloud Run, Cloud Storage, Eventarc, and Workflows APIs, if any are not already enabled.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the APIs

  9. Create a service account:

    1. Ensure that you have the Create Service Accounts IAM role (roles/iam.serviceAccountCreator) and the Project IAM Admin role (roles/resourcemanager.projectIamAdmin). Learn how to grant roles.
    2. In the Google Cloud console, go to the Create service account page.

      Go to Create service account
    3. Select your project.
    4. In the Service account name field, enter a name. The Google Cloud console fills in the Service account ID field based on this name.

      In the Service account description field, enter a description. For example, Service account for quickstart.

    5. Click Create and continue.
    6. Grant the following roles to the service account: Cloud Run Admin, Eventarc Event Receiver, Logs Writer, Workflows Invoker.

      To grant a role, find the Select a role list, then select the role.

      To grant additional roles, click Add another role and add each additional role.

    7. Click Continue.
    8. Click Done to finish creating the service account.

  10. לפני שיוצרים טריגר לאירועים ישירים מ-Cloud Storage, צריך להעניק לסוכן השירות של Cloud Storage את התפקיד Pub/Sub Publisher ‏ (roles/pubsub.publisher):
    1. נכנסים לדף IAM במסוף Google Cloud .

      כניסה לדף IAM

    2. מסמנים את התיבה Include Google-provided role grants.
    3. בעמודה Principal, מחפשים את Cloud Storage Service Agent עם הטופס service-PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com, ולוחצים על Edit principal בשורה המתאימה.
    4. לוחצים על הוספת תפקיד או על הוספת תפקיד נוסף.
    5. ברשימה Select a role, מסננים לפי Pub/Sub Publisher ובוחרים את התפקיד.
    6. לוחצים על Save.
  11. אם הפעלתם את סוכן השירות של Cloud Pub/Sub ב-8 באפריל 2021 או לפני כן, כדי לתמוך בבקשות push מאומתות של Pub/Sub, צריך להקצות לסוכן השירות את התפקיד 'יצירת אסימונים בחשבון שירות' (roles/iam.serviceAccountTokenCreator). אחרת, התפקיד הזה מוקצה כברירת מחדל:
    1. נכנסים לדף IAM במסוף Google Cloud .

      כניסה לדף IAM

    2. מסמנים את התיבה Include Google-provided role grants.
    3. בעמודה Name, מחפשים את Cloud Pub/Sub Service Account ולוחצים על Edit principal בשורה המתאימה.
    4. לוחצים על הוספת תפקיד או על הוספת תפקיד נוסף.
    5. ברשימה Select a role, מסננים לפי Service Account Token Creator ובוחרים את התפקיד.
    6. לוחצים על Save.
  12. מפעילים את Cloud Shell במסוף Google Cloud .

    הפעלת Cloud Shell

    בחלק התחתון של Google Cloud המסוף יתחיל סשן של Cloud Shell ותופיע הודעה של שורת הפקודה. Cloud Shell היא סביבת מעטפת שבה ה-CLI של Google Cloud מותקן ומוגדרים ערכים לפרויקט הקיים. הסשן יופעל תוך כמה שניות.

  13. ב-Cloud Shell יש תמיכה בפקודות /dev/urandom במדריך הזה, שיוצרות מספרים פסאודו-אקראיים.

gcloud

  1. כדי להשתמש בטרמינל אונליין שכבר מוגדר בו ה-CLI של gcloud, צריך להפעיל את Cloud Shell:

    בחלק התחתון של הדף הזה מתחיל סשן של Cloud Shell ומופיעה הודעה של שורת הפקודה. הסשן יופעל תוך כמה שניות.

    ‫Cloud Shell תומך בפקודות /dev/urandom שמופיעות במדריך הזה ויוצרות מספרים פסאודו-אקראיים.

  2. יוצרים או בוחרים Google Cloud פרויקט.
    • יוצרים Google Cloud פרויקט:

      gcloud projects create PROJECT_ID
    • בוחרים את הפרויקט שיצרתם: Google Cloud

      gcloud config set project PROJECT_ID
  3. מוודאים שהחיוב מופעל בפרויקט Google Cloud .
  4. מפעילים את ממשקי ה-API של Artifact Registry,‏ Cloud Build,‏ Cloud Run,‏ Cloud Storage,‏ Eventarc ו-Workflows:
    gcloud services enable artifactregistry.googleapis.com \
        cloudbuild.googleapis.com \
        eventarc.googleapis.com \
        run.googleapis.com \
        storage.googleapis.com \
        workflows.googleapis.com
  5. יוצרים חשבון שירות כדי שהתהליך העסקי יוכל להשתמש בו לאימות מול Google Cloud שירותים אחרים, ומקצים לו את התפקידים המתאימים.
    1. יוצרים את חשבון השירות:
      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME

      מחליפים את הערך SERVICE_ACCOUNT_NAME בשם שרוצים לתת לחשבון השירות.

    2. נותנים תפקידים לחשבון השירות בניהול המשתמשים שיצרתם בשלב הקודם. מריצים את הפקודה הבאה לכל אחד מהתפקידים הבאים ב-IAM, או משתמשים בדגל --role כמה פעמים בפקודה אחת:
      • ‫roles/eventarc.eventReceiver: כדי לקבל אירועים
      • ‫roles/logging.logWriter: כדי לכתוב יומנים
      • ‫roles/run.admin: כדי להריץ את המשימה ב-Cloud Run
      • ‫roles/workflows.invoker: כדי להפעיל תהליכי עבודה
      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member=serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \
          --role=ROLE

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

      • ‫PROJECT_ID: מזהה הפרויקט שבו יצרתם את חשבון השירות
      • ‫ROLE: התפקיד שרוצים להקצות לחשבון השירות שמנוהל על ידי המשתמש
  6. לפני שיוצרים טריגר לאירועים ישירים מ-Cloud Storage, צריך להקצות את התפקיד Pub/Sub Publisher (roles/pubsub.publisher) לסוכן השירות של Cloud Storage:

    SERVICE_ACCOUNT="$(gcloud storage service-agent --project=PROJECT_ID)"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="serviceAccount:${SERVICE_ACCOUNT}" \
        --role='roles/pubsub.publisher'
  7. אם הפעלתם את סוכן השירות של Cloud Pub/Sub ב-8 באפריל 2021 או לפני כן, כדי לתמוך בבקשות דחיפה מאומתות של Pub/Sub, צריך להקצות לסוכן השירות את התפקיד "יצירת אסימונים בחשבון שירות" (roles/iam.serviceAccountTokenCreator). אחרת, התפקיד הזה מוקצה כברירת מחדל:
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
        --role=roles/iam.serviceAccountTokenCreator
  8. מחליפים את PROJECT_NUMBER במספר הפרויקט ב- Google Cloud. אפשר לראות את מספר הפרויקט בדף Welcome במסוף Google Cloud או על ידי הרצת הפקודה הבאה:

    gcloud projects describe PROJECT_ID --format='value(projectNumber)'

Terraform

  1. כדי להשתמש בטרמינל אונליין שכבר מוגדר בו ה-CLI של gcloud, צריך להפעיל את Cloud Shell:

    בחלק התחתון של הדף הזה מתחיל סשן של Cloud Shell ומופיעה הודעה של שורת הפקודה. הסשן יופעל תוך כמה שניות.

    ‫Cloud Shell תומך בפקודות /dev/urandom שמופיעות במדריך הזה ויוצרות מספרים פסאודו-אקראיים.

  2. יוצרים או בוחרים Google Cloud פרויקט.
    • יוצרים Google Cloud פרויקט:

      gcloud projects create PROJECT_ID
    • בוחרים את הפרויקט שיצרתם: Google Cloud

      gcloud config set project PROJECT_ID
  3. מוודאים שהחיוב מופעל בפרויקט Google Cloud .
  4. מפעילים את ממשקי ה-API של Artifact Registry,‏ Cloud Build,‏ Cloud Run,‏ Cloud Storage,‏ Eventarc ו-Workflows:
    gcloud services enable artifactregistry.googleapis.com \
        cloudbuild.googleapis.com \
        eventarc.googleapis.com \
        run.googleapis.com \
        storage.googleapis.com \
        workflows.googleapis.com
  5. יוצרים חשבון שירות לתהליך העבודה כדי להשתמש בו לאימות מול שירותי Google Cloud אחרים, ומקצים לו את התפקידים המתאימים. בנוסף, כדי לתמוך באירועים ישירים מ-Cloud Storage, צריך להקצות לסוכן השירות של Cloud Storage את התפקיד מפרסם ב-Pub/Sub (roles/pubsub.publisher).

    משנים את הקובץ main.tf כמו בדוגמה הבאה. מידע נוסף זמין במאמרי העזרה בנושא ספק Google ל-Terraform.

    כדי ללמוד איך להחיל הגדרות ב-Terraform או להסיר אותן, ראו פקודות בסיסיות ב-Terraform.

    שימו לב: בתהליך עבודה טיפוסי של Terraform, מיישמים את התוכנית כולה בבת אחת. עם זאת, לצורך המדריך הזה, אפשר לטרגט משאב ספציפי. לדוגמה:

    terraform apply -target="google_service_account.workflows"

    # Used to retrieve project information later
    data "google_project" "project" {}
    
    # Create a dedicated service account
    resource "google_service_account" "workflows" {
      account_id   = "workflows-run-job-sa"
      display_name = "Workflows Cloud Run Job Service Account"
    }
    
    # Grant permission to receive Eventarc events
    resource "google_project_iam_member" "eventreceiver" {
      project = data.google_project.project.id
      role    = "roles/eventarc.eventReceiver"
      member  = "serviceAccount:${google_service_account.workflows.email}"
    }
    
    # Grant permission to write logs
    resource "google_project_iam_member" "logwriter" {
      project = data.google_project.project.id
      role    = "roles/logging.logWriter"
      member  = "serviceAccount:${google_service_account.workflows.email}"
    }
    
    # Grant permission to execute Cloud Run jobs
    resource "google_project_iam_member" "runadmin" {
      project = data.google_project.project.id
      role    = "roles/run.admin"
      member  = "serviceAccount:${google_service_account.workflows.email}"
    }
    
    # Grant permission to invoke workflows
    resource "google_project_iam_member" "workflowsinvoker" {
      project = data.google_project.project.id
      role    = "roles/workflows.invoker"
      member  = "serviceAccount:${google_service_account.workflows.email}"
    }
    
    # Grant the Cloud Storage service agent permission to publish Pub/Sub topics
    data "google_storage_project_service_account" "gcs_account" {}
    resource "google_project_iam_member" "pubsubpublisher" {
      project = data.google_project.project.id
      role    = "roles/pubsub.publisher"
      member  = "serviceAccount:${data.google_storage_project_service_account.gcs_account.email_address}"
    }
    
  6. אם הפעלתם את סוכן השירות של Cloud Pub/Sub ב-8 באפריל 2021 או לפני כן, כדי לתמוך בבקשות push מאומתות של Pub/Sub, צריך להקצות לסוכן השירות את התפקיד 'יצירת אסימונים בחשבון שירות' (roles/iam.serviceAccountTokenCreator). אחרת, התפקיד הזה מוענק כברירת מחדל:
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
        --role=roles/iam.serviceAccountTokenCreator
  7. מחליפים את PROJECT_NUMBER במספר הפרויקט ב- Google Cloud. אפשר לראות את מספר הפרויקט בדף Welcome במסוף Google Cloud , או להריץ את הפקודה הבאה:

    gcloud projects describe PROJECT_ID --format='value(projectNumber)'

יצירת משימה ב-Cloud Run

במדריך הזה נעשה שימוש בעבודת Cloud Run לדוגמה מ-GitHub. המשימה קוראת נתונים מקובץ קלט ב-Cloud Storage, ומבצעת עיבוד שרירותי לכל שורה בקובץ.

  1. כדי לקבל את הקוד לדוגמה, משכפלים את מאגר האפליקציות לדוגמה למכונה המקומית:

    git clone https://github.com/GoogleCloudPlatform/jobs-demos.git

    אפשרות נוספת היא להוריד את הדוגמה כקובץ ZIP ולחלץ אותה.

  2. עוברים לספרייה שמכילה את הקוד לדוגמה:

    cd jobs-demos/parallel-processing
  3. יוצרים קטגוריה של Cloud Storage לאחסון קובץ קלט שאפשר לכתוב בו ולהפעיל אירוע:

    המסוף

    1. במסוף Google Cloud , נכנסים לדף Buckets של Cloud Storage.

      כניסה לדף Buckets

    2. לוחצים על הוספה יצירה.
    3. בדף Create a bucket (יצירת קטגוריה), מזינים שם לקטגוריה:
      input-PROJECT_ID
      מחליפים את PROJECT_ID במזהה הפרויקט ב- Google Cloud .
    4. משאירים את שאר ערכי ברירת המחדל.
    5. לוחצים על יצירה.

    gcloud

    מריצים את הפקודה gcloud storage buckets create:

    gcloud storage buckets create gs://input-PROJECT_ID

    אם הבקשה מבוצעת בהצלחה, הפקודה תחזיר את ההודעה הבאה:

    Creating gs://input-PROJECT_ID/...

    Terraform

    כדי ליצור קטגוריה של Cloud Storage, משתמשים במשאב google_storage_bucket ומשנים את הקובץ main.tf כמו בדוגמה הבאה.

    כדי ללמוד איך להחיל הגדרות ב-Terraform או להסיר אותן, ראו פקודות בסיסיות ב-Terraform.

    הערה: בתהליך עבודה טיפוסי של Terraform, מחילים את התוכנית כולה בבת אחת. אבל לצורך המדריך הזה, אפשר לטרגט משאב ספציפי. לדוגמה:

    terraform apply -target="random_id.bucket_name_suffix"
    וגם
    terraform apply -target="google_storage_bucket.default"

    # Cloud Storage bucket names must be globally unique
    resource "random_id" "bucket_name_suffix" {
      byte_length = 4
    }
    
    # Create a Cloud Storage bucket
    resource "google_storage_bucket" "default" {
      name                        = "input-${data.google_project.project.name}-${random_id.bucket_name_suffix.hex}"
      location                    = "us-central1"
      storage_class               = "STANDARD"
      force_destroy               = false
      uniform_bucket_level_access = true
    }
  4. יוצרים מאגר רגיל ב-Artifact Registry שבו אפשר לאחסן את קובץ האימג' של הקונטיינר:

    המסוף

    1. נכנסים לדף Repositories ב-Artifact Registry במסוף Google Cloud :

      כניסה לדף Repositories

    2. לוחצים על Create repository (יצירת מאגר).

    3. מזינים שם למאגר, לדוגמה, my-repo. השמות של המאגרים צריכים להיות ייחודיים לכל מיקום מאגר בפרויקט.

    4. שומרים על פורמט ברירת המחדל, שהוא Docker.

    5. משאירים את מצב ברירת המחדל, שאמור להיות Standard.

    6. באזור, בוחרים באפשרות us-central1 (Iowa).

    7. משאירים את כל שאר הגדרות ברירת המחדל.

    8. לוחצים על יצירה.

    gcloud

    מריצים את הפקודה:

    gcloud artifacts repositories create REPOSITORY \
        --repository-format=docker \
        --location=us-central1

    מחליפים את REPOSITORY בשם ייחודי למאגר, לדוגמה, my-repo. לכל מיקום מאגר בפרויקט, שמות המאגרים צריכים להיות ייחודיים.

    Terraform

    כדי ליצור מאגר ב-Artifact Registry, משתמשים במשאב google_artifact_registry_repository ומשנים את קובץ main.tf כמו בדוגמה הבאה.

    שימו לב: בתהליך עבודה טיפוסי של Terraform, מיישמים את התוכנית כולה בבת אחת. עם זאת, לצורך המדריך הזה, אפשר לטרגט משאב ספציפי. לדוגמה:

    terraform apply -target="google_artifact_registry_repository.default"

    # Create an Artifact Registry repository
    resource "google_artifact_registry_repository" "default" {
      location      = "us-central1"
      repository_id = "my-repo"
      format        = "docker"
    }
  5. מריצים build של קובץ האימג' של הקונטיינר באמצעות Google Cloud buildpack שמוגדר כברירת מחדל:

    export SERVICE_NAME=parallel-job
    gcloud builds submit \
        --pack image=us-central1-docker.pkg.dev/PROJECT_ID/REPOSITORY/${SERVICE_NAME}

    מחליפים את REPOSITORY בשם המאגר שלכם ב-Artifact Registry.

    תהליך הבנייה יכול להימשך כמה דקות.

  6. יוצרים משימה ב-Cloud Run שפורסת את קובץ האימג' של הקונטיינר:

    המסוף

    1. נכנסים לדף Cloud Run במסוף Google Cloud :

      כניסה ל-Cloud Run

    2. לוחצים על Create job (יצירת משימה) כדי להציג את הטופס Create job (יצירת משימה).

      1. בטופס, בוחרים באפשרות us-central1-docker.pkg.dev/PROJECT_ID/REPOSITORY/parallel-job:latest בתור כתובת ה-URL של קובץ האימג' של הקונטיינר ב-Artifact Registry.
      2. אופציונלי: בשדה שם המשימה, מזינים parallel-job.
      3. אופציונלי: בוחרים באזור us-central1 (Iowa).
      4. כדי להזין את מספר המשימות שרוצים להריץ בעבודה, מזינים 10. כדי שהעבודה תצליח, כל המשימות צריכות להצליח. כברירת מחדל, המשימות מבוצעות במקביל.
    3. מרחיבים את הקטע Container, Variables & Secrets, Connections, Security ומשאירים את כל ערכי ברירת המחדל, חוץ מההגדרות הבאות:

      1. לוחצים על הכרטיסייה General.

        1. בפקודת מאגר התגים, מזינים python.
        2. בארגומנט של מאגר התגים, מזינים process.py.
      2. לוחצים על הכרטיסייה Variables & Secrets.

        1. לוחצים על הוספת משתנה ומזינים INPUT_BUCKET בשדה השם ו-input-PROJECT_ID בשדה הערך.
        2. לוחצים על הוספת משתנה ומזינים INPUT_FILE בשדה השם ו-input_file.txt בשדה הערך.
    4. כדי ליצור את העבודה, לוחצים על Create.

    gcloud

    1. מגדירים את אזור ברירת המחדל של Cloud Run:

      gcloud config set run/region us-central1
    2. יוצרים את משימת Cloud Run:

      gcloud run jobs create parallel-job \
          --image us-central1-docker.pkg.dev/PROJECT_ID/REPOSITORY/parallel-job:latest \
          --command python \
          --args process.py \
          --tasks 10 \
          --set-env-vars=INPUT_BUCKET=input-PROJECT_ID,INPUT_FILE=input_file.txt

      שימו לב: אם לא מציינים תג תמונה, ‏ Artifact Registry מחפש את התמונה עם התג latest שמוגדר כברירת מחדל.

      הרשימה המלאה של האפשרויות שזמינות כשיוצרים משימה מופיעה במסמכי התיעוד של שורת הפקודה gcloud run jobs create.

      אחרי שהמשימה נוצרת, אמורה להופיע הודעה שהיא נוצרה בהצלחה.

    Terraform

    כדי ליצור עבודת Cloud Run, משתמשים במשאב google_cloud_run_v2_job ומשנים את קובץ main.tf כמו בדוגמה הבאה.

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

    terraform apply -target="google_cloud_run_v2_job.default"

    # Create a Cloud Run job
    resource "google_cloud_run_v2_job" "default" {
      name     = "parallel-job"
      location = "us-central1"
    
      template {
        task_count = 10
        template {
          containers {
            image   = "us-central1-docker.pkg.dev/${data.google_project.project.name}/${google_artifact_registry_repository.default.repository_id}/parallel-job:latest"
            command = ["python"]
            args    = ["process.py"]
            env {
              name  = "INPUT_BUCKET"
              value = google_storage_bucket.default.name
            }
            env {
              name  = "INPUT_FILE"
              value = "input_file.txt"
            }
          }
        }
      }
    }

פריסת תהליך עבודה שמפעיל את המשימה ב-Cloud Run

מגדירים ופורסים תהליך עבודה שמריץ את המשימה ב-Cloud Run שיצרתם. הגדרת תהליך עבודה מורכבת מסדרה של שלבים שמתוארים באמצעות תחביר Workflows.

המסוף

  1. נכנסים לדף Workflows במסוף Google Cloud :

    כניסה לדף Workflows

  2. לוחצים על Create.

  3. מזינים שם לתהליך העבודה החדש, למשל cloud-run-job-workflow.

  4. בוחרים את האזור us-central1 (Iowa).

  5. בשדה Service account, בוחרים את חשבון השירות שיצרתם קודם.

    חשבון השירות משמש כזהות של תהליך העבודה. צריך לוודא שכבר הקציתם לחשבון השירות את התפקיד אדמין Cloud Run כדי שתהליך העבודה יוכל להריץ את המשימה של Cloud Run.

  6. לוחצים על הבא.

  7. בעורך תהליך העבודה, מזינים את ההגדרה הבאה לתהליך העבודה:

    main:
        params: [event]
        steps:
            - init:
                assign:
                    - project_id: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
                    - event_bucket: ${event.data.bucket}
                    - event_file: ${event.data.name}
                    - target_bucket: ${"input-" + project_id}
                    - job_name: parallel-job
                    - job_location: us-central1
            - check_input_file:
                switch:
                    - condition: ${event_bucket == target_bucket}
                      next: run_job
                    - condition: true
                      next: end
            - run_job:
                call: googleapis.run.v1.namespaces.jobs.run
                args:
                    name: ${"namespaces/" + project_id + "/jobs/" + job_name}
                    location: ${job_location}
                    body:
                        overrides:
                            containerOverrides:
                                env:
                                    - name: INPUT_BUCKET
                                      value: ${event_bucket}
                                    - name: INPUT_FILE
                                      value: ${event_file}
                result: job_execution
            - finish:
                return: ${job_execution}
  8. לוחצים על פריסה.

gcloud

  1. יוצרים קובץ קוד מקור לתהליך העבודה:

    touch cloud-run-job-workflow.yaml
  2. מעתיקים את הגדרת תהליך העבודה הבאה לקובץ קוד המקור:

    main:
        params: [event]
        steps:
            - init:
                assign:
                    - project_id: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
                    - event_bucket: ${event.data.bucket}
                    - event_file: ${event.data.name}
                    - target_bucket: ${"input-" + project_id}
                    - job_name: parallel-job
                    - job_location: us-central1
            - check_input_file:
                switch:
                    - condition: ${event_bucket == target_bucket}
                      next: run_job
                    - condition: true
                      next: end
            - run_job:
                call: googleapis.run.v1.namespaces.jobs.run
                args:
                    name: ${"namespaces/" + project_id + "/jobs/" + job_name}
                    location: ${job_location}
                    body:
                        overrides:
                            containerOverrides:
                                env:
                                    - name: INPUT_BUCKET
                                      value: ${event_bucket}
                                    - name: INPUT_FILE
                                      value: ${event_file}
                result: job_execution
            - finish:
                return: ${job_execution}
  3. מריצים את הפקודה הבאה כדי לפרוס את תהליך העבודה:

    gcloud workflows deploy cloud-run-job-workflow \
        --location=us-central1 \
        --source=cloud-run-job-workflow.yaml \
        --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com

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

    • ‫SERVICE_ACCOUNT_NAME: השם של חשבון השירות שיצרתם קודם
    • ‫PROJECT_ID: מזהה הפרויקט ב-Google Cloud

    חשבון השירות משמש כזהות של תהליך העבודה. צריך לוודא שכבר הקציתם את התפקיד roles/run.admin לחשבון השירות, כדי שתהליך העבודה יוכל להריץ את משימת Cloud Run.

Terraform

כדי ליצור תהליך עבודה, משתמשים במשאב google_workflows_workflow ומשנים את קובץ main.tf כמו בדוגמה הבאה.

כדי ללמוד איך להחיל הגדרות ב-Terraform או להסיר אותן, ראו פקודות בסיסיות ב-Terraform.

שימו לב: בתהליך עבודה טיפוסי של Terraform, מחילים את כל התוכנית בבת אחת. אבל לצורך המדריך הזה, אפשר לטרגט משאב ספציפי. לדוגמה:

terraform apply -target="google_workflows_workflow.default"

# Create a workflow
resource "google_workflows_workflow" "default" {
  name        = "cloud-run-job-workflow"
  region      = "us-central1"
  description = "Workflow that routes a Cloud Storage event and executes a Cloud Run job"

  deletion_protection = false # set to "true" in production

  # Note that $$ is needed for Terraform
  source_contents = <<EOF
  main:
      params: [event]
      steps:
          - init:
              assign:
                  - project_id: $${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
                  - event_bucket: $${event.data.bucket}
                  - event_file: $${event.data.name}
                  - target_bucket: "${google_storage_bucket.default.name}"
                  - job_name: parallel-job
                  - job_location: us-central1
          - check_input_file:
              switch:
                  - condition: $${event_bucket == target_bucket}
                    next: run_job
                  - condition: true
                    next: end
          - run_job:
              call: googleapis.run.v1.namespaces.jobs.run
              args:
                  name: $${"namespaces/" + project_id + "/jobs/" + job_name}
                  location: $${job_location}
                  body:
                      overrides:
                          containerOverrides:
                              env:
                                  - name: INPUT_BUCKET
                                    value: $${event_bucket}
                                  - name: INPUT_FILE
                                    value: $${event_file}
              result: job_execution
          - finish:
              return: $${job_execution}
  EOF
}

תהליך העבודה כולל את הפעולות הבאות:

  1. שלב init – מקבל אירוע של Cloud Storage כארגומנט ואז מגדיר את המשתנים הנדרשים.

  2. שלב check_input_file – המערכת בודקת אם קטגוריית Cloud Storage שצוינה באירוע היא הקטגוריה שבה נעשה שימוש במשימת Cloud Run.

    • אם כן, תהליך העבודה ממשיך לשלב run_job.
    • אם לא, תהליך העבודה מסתיים והעיבוד נפסק.
  3. השלב run_job – משתמש ב-method ‏googleapis.run.v1.namespaces.jobs.run של המחבר של Cloud Run Admin API כדי להריץ את המשימה. השמות של הקטגוריה ב-Cloud Storage ושל קובץ הנתונים מועברים כמשתנים חלופיים מתהליך העבודה למשימה.

  4. שלב finish – מחזיר מידע על ביצוע המשימה כתוצאה מתהליך העבודה.

יצירת טריגר Eventarc לתהליך העבודה

כדי להפעיל אוטומטית את תהליך העבודה, וכתוצאה מכך את משימת Cloud Run, בכל פעם שקובץ נתוני הקלט מתעדכן, צריך ליצור טריגר Eventarc שמגיב לאירועי Cloud Storage בקטגוריה שמכילה את קובץ נתוני הקלט.

המסוף

  1. נכנסים לדף Workflows במסוף Google Cloud :

    כניסה לדף Workflows

  2. לוחצים על השם של תהליך העבודה, למשל cloud-run-job-workflow.

  3. בדף פרטי תהליך העבודה, לוחצים על עריכה.

  4. בדף Edit workflow (עריכת תהליך העבודה), בקטע Triggers (טריגרים), לוחצים על Add new trigger > Eventarc (הוספת טריגר חדש > Eventarc).

    החלונית Eventarc trigger נפתחת.

  5. בשדה Trigger name, מזינים שם לטריגר, למשל cloud-run-job-workflow-trigger.

  6. ברשימה ספק האירועים, בוחרים באפשרות Cloud Storage.

  7. ברשימת האירועים, בוחרים באפשרות google.cloud.storage.object.v1.finalized.

  8. בשדה Bucket, בוחרים את הקטגוריה שמכילה את קובץ נתוני הקלט. שם הקטגוריה הוא בפורמט input-PROJECT_ID.

  9. בשדה Service account, בוחרים את חשבון השירות שיצרתם קודם.

    חשבון השירות משמש כזהות של הטריגר. כבר הקציתם לחשבון השירות את התפקידים הבאים:

    • מקבל אירועים ב-Eventarc: כדי לקבל אירועים
    • מפעיל תהליכי עבודה: כדי להפעיל תהליכי עבודה
  10. לוחצים על Save trigger.

    הטריגר של Eventarc מופיע עכשיו בקטע Triggers (טריגרים) בדף Edit workflow (עריכת תהליך העבודה).

  11. לוחצים על הבא.

  12. לוחצים על פריסה.

gcloud

כדי ליצור טריגר של Eventarc, מריצים את הפקודה הבאה:

gcloud eventarc triggers create cloud-run-job-workflow-trigger \
    --location=us \
    --destination-workflow=cloud-run-job-workflow  \
    --destination-workflow-location=us-central1 \
    --event-filters="type=google.cloud.storage.object.v1.finalized" \
    --event-filters="bucket=input-PROJECT_ID" \
    --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com

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

  • ‫PROJECT_ID: מזהה הפרויקט ב- Google Cloud
  • ‫SERVICE_ACCOUNT_NAME: השם של חשבון השירות שיצרתם קודם.

חשבון השירות משמש כזהות של הטריגר. כבר הייתם אמורים להקצות לחשבון השירות את התפקידים הבאים:

  • ‫roles/eventarc.eventReceiver: לקבלת אירועים
  • ‫roles/workflows.invoker: כדי להפעיל תהליכי עבודה

Terraform

כדי ליצור טריגר, משתמשים במשאב google_eventarc_trigger ומשנים את הקובץ main.tf כמו בדוגמה הבאה.

כדי ללמוד איך להחיל הגדרות ב-Terraform או להסיר אותן, ראו פקודות בסיסיות ב-Terraform.

שימו לב: בתהליך עבודה טיפוסי של Terraform, מחילים את כל התוכנית בבת אחת. אבל לצורך המדריך הזה, אפשר לטרגט משאב ספציפי. לדוגמה:

terraform apply -target="google_eventarc_trigger.default"

# Create an Eventarc trigger that routes Cloud Storage events to Workflows
resource "google_eventarc_trigger" "default" {
  name     = "cloud-run-job-trigger"
  location = google_workflows_workflow.default.region

  # Capture objects changed in the bucket
  matching_criteria {
    attribute = "type"
    value     = "google.cloud.storage.object.v1.finalized"
  }
  matching_criteria {
    attribute = "bucket"
    value     = google_storage_bucket.default.name
  }

  # Send events to Workflows
  destination {
    workflow = google_workflows_workflow.default.id
  }

  service_account = google_service_account.workflows.email

}

בכל פעם שמעלים קובץ או מחליפים קובץ בקטגוריית Cloud Storage שמכילה את קובץ נתוני הקלט, תהליך העבודה מופעל עם אירוע Cloud Storage התואם כארגומנט.

הפעלת תהליך העבודה

כדי לבדוק את המערכת מקצה לקצה, מעדכנים את קובץ נתוני הקלט ב-Cloud Storage.

  1. יוצרים נתונים חדשים לקובץ הקלט ומעלים אותו ל-Cloud Storage במיקום שהמשימה של Cloud Run מצפה לו:

    base64 /dev/urandom | head -c 100000 >input_file.txt
    gcloud storage cp input_file.txt gs://input-PROJECT_ID/input_file.txt

    אם יצרתם קטגוריה של Cloud Storage באמצעות Terraform, אתם יכולים לאחזר את שם הקטגוריה על ידי הרצת הפקודה הבאה:

    gcloud storage buckets list gs://input*

    יכול להיות שיחלפו כמה דקות עד שהעבודה ב-Cloud Run תסתיים.

  2. כדי לוודא שהמשימה ב-Cloud Run רצה כמו שצריך, בודקים את הרצות המשימה:

    gcloud config set run/region us-central1
    gcloud run jobs executions list --job=parallel-job

    בפלט אמור להופיע ביצוע מוצלח של המשימה, שמציין ש-10/10 משימות הושלמו.

מידע נוסף על הפעלת תהליך עבודה באמצעות אירועים או הודעות Pub/Sub

הסרת המשאבים

אם יצרתם פרויקט חדש בשביל המדריך הזה, תמחקו את הפרויקט. אם השתמשתם בפרויקט קיים ואתם רוצים לשמור אותו בלי השינויים שנוספו במדריך הזה, מחקו את המשאבים שנוצרו בשביל המדריך.

מחיקת הפרויקט

הדרך הקלה ביותר לבטל את החיוב היא למחוק את הפרויקט שיצרתם בשביל המדריך הזה.

כדי למחוק את הפרויקט:

  1. נכנסים לדף Manage resources במסוף Google Cloud .

    כניסה לדף Manage resources

  2. ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
  3. כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.

מחיקת משאבים של מדריכים

מוחקים את המשאבים שיצרתם במדריך הזה:

  1. מוחקים את הטריגר של Eventarc:

    gcloud eventarc triggers delete cloud-run-job-workflow-trigger --location=us
  2. מחיקת תהליך העבודה:

    gcloud workflows delete cloud-run-job-workflow --location=us-central1
  3. מוחקים את המשימה של Cloud Run:

    gcloud run jobs delete parallel-job
  4. מוחקים את הקטגוריה של Cloud Storage שנוצרה בשביל נתוני הקלט:

    gcloud storage rm --recursive gs://input-PROJECT_ID/
  5. מחיקת מאגר Artifact Registry:

    gcloud artifacts repositories delete REPOSITORY --location=us-central1

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