הפעלת משימת 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.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. 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.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. 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. במסוף Google Cloud , מפעילים את Cloud Shell.

    הפעלת 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, צריך להעניק לסוכן השירות של Cloud Storage את התפקיד Pub/Sub Publisher (roles/pubsub.publisher):

    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 או לפני כן, כדי לתמוך בבקשות 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
  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 Publisher ‏ (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. משאירים את מצב ברירת המחדל, שהוא רגיל.

    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. במסוף Google Cloud , נכנסים לדף Workflows:

    כניסה לדף Workflows

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

  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 step – משתמש ב-method ‏googleapis.run.v1.namespaces.jobs.run של מחבר Cloud Run Admin API כדי להריץ את הג'וב. שמות הקטגוריות של Cloud Storage וקובצי הנתונים מועברים כמשתני דריסה מתהליך העבודה למשימה.

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

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

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

המסוף

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

    כניסה לדף 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. ברשימה Event, בוחרים באפשרות google.cloud.storage.object.v1.finalized.

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

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

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

    • Eventarc Event Receiver: לקבלת אירועים
    • Workflows Invoker: להפעלת תהליכי עבודה
  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 resource ומשנים את קובץ 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. במסוף Google Cloud , נכנסים לדף Manage resources.

    כניסה לדף 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

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