יצירה והפעלה של משימות באצווה באמצעות Terraform ו-Cloud Scheduler

במדריך הזה מוסבר איך להשתמש ב-Terraform כדי ליצור ולהריץ משימות Batch באמצעות משימת cron ב-Cloud Scheduler.

Terraform הוא כלי בקוד פתוח שמאפשר להקצות ולנהל תשתית על ידי ציון המצב הרצוי בקובצי תצורה. הקבצים האלה יכולים להיחשב כקוד ולהישמר במערכות לניהול גרסאות כמו GitHub.

למרות שאין ל-Terraform משאבים ל-Batch, במדריך הזה מוסבר איך אפשר להשתמש ב-Terraform כדי ליצור משימות Batch. באופן ספציפי, אתם יכולים להשתמש ב-Terraform כדי לתזמן ולהריץ משימת cron ב-Cloud Scheduler שמכוונת ל-Batch API כדי ליצור ולהריץ משימות Batch. ‫Cloud Scheduler הוא שירות Google Cloud שמאפשר לתזמן באופן אוטומטי משימות cron ותומך ב-Terraform.

המדריך הזה מיועד למשתמשי Batch שכבר מנהלים תשתית באמצעות Terraform ורוצים לשלב משימות Batch ב-Terraform.

מטרות

  • יוצרים ספרייה של Terraform וקובץ תצורה שמגדיר משימת Cron ב-Cloud Scheduler שיוצרת משימות Batch.
  • פורסים את ההגדרות של Terraform כדי להריץ את משימת ה-cron.
  • מוודאים שעבודת ה-cron יוצרת עבודות Batch.
  • מעדכנים את ההגדרות של Terraform כדי להשהות את משימת ה-cron, כך שהיא תפסיק ליצור משימות Batch.

עלויות

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

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

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

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

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

  1. מכינים את סביבת הפיתוח, Cloud Shell או מעטפת מקומית:

    Cloud Shell

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

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

    מעטפת מקומית

    כדי להשתמש בסביבת פיתוח מקומית:

    1. התקינו את ה-CLI של Google Cloud.

    2. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

    3. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

      gcloud init
    4. מתקינים את Terraform.
  2. יוצרים או בוחרים Google Cloud פרויקט.

    תפקידים שנדרשים כדי לבחור או ליצור פרויקט

    • Select a project: כדי לבחור פרויקט לא צריך תפקיד IAM ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
    • יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד Project Creator (יצירת פרויקטים) (roles/resourcemanager.projectCreator), שכולל את ההרשאה resourcemanager.projects.create. איך מקצים תפקידים
    • יוצרים Google Cloud פרויקט:

      gcloud projects create PROJECT_ID

      מחליפים את PROJECT_ID בשם של פרויקט Google Cloud שיוצרים.

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

      gcloud config set project PROJECT_ID

      מחליפים את PROJECT_ID בשם הפרויקט ב- Google Cloud .

  3. מוודאים שהחיוב מופעל בפרויקט Google Cloud .

  4. מפעילים את ממשקי ה-API של Batch,‏ Compute Engine,‏ Cloud Logging,‏ Cloud Scheduler ומנהל המשאבים:

    תפקידים שנדרשים להפעלת ממשקי API

    כדי להפעיל ממשקי API, צריך את תפקיד ה-IAM 'אדמין של Service Usage' (roles/serviceusage.serviceUsageAdmin), שכולל את ההרשאה serviceusage.services.enable. איך מקצים תפקידים

    gcloud services enable batch.googleapis.com compute.googleapis.com logging.googleapis.com cloudscheduler.googleapis.com cloudresourcemanager.googleapis.com
  5. חשוב לוודא שלפרויקט יש לפחות חשבון שירות אחד עם ההרשאות שנדרשות ללימוד הזה.

    באופן ספציפי, אתם יכולים להשתמש באותו חשבון שירות או בשני חשבונות שירות נפרדים כדי להעניק את ההרשאות הבאות:

    • מתן אפשרות למשימת ה-cron ליצור משימות באצווה ולצרף את חשבון השירות למשימות באצווה.
    • מאפשרים לעבודות Batch ליצור את המשאבים שנדרשים להפעלה ולגשת אליהם.

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

    להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.

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

  6. מוודאים שיש לכם את ההרשאות הנדרשות כדי לבצע את הפעולות שמפורטות במדריך הזה.

    באופן ספציפי, אתם צריכים הרשאות לביצוע הפעולות הבאות:

    • יוצרים משימת cron ומצרפים אליה את חשבון השירות.
    • הצגה ומחיקה של משימת ה-cron ומשימות ה-Batch.

    כדי לקבל את ההרשאות שדרושות לשימוש ב-Terraform כדי ליצור משימות Batch באמצעות משימת cron ב-Cloud Scheduler, צריך לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים:

יצירת ספריית Terraform וקובץ התצורה

יוצרים ספרייה ל-Terraform וקובץ הגדרות שמגדיר את המשאבים שרוצים ליצור או לעדכן באמצעות Terraform. קובץ התצורה לדוגמה במדריך הזה מגדיר משימת cron ב-Cloud Scheduler בשם batch-job-invoker. כשהאפשרות הזו מופעלת, batch-job-invoker משימת ה-cron מופעלת כל 5 דקות כדי ליצור מופע חדש של משימה באצווה שהוגדרה.

  1. כדי ליצור ספרייה וקובץ תצורה חדש של Terraform ‏ (.tf) בתוך הספרייה הזו, מקלידים את הפקודה הבאה ומקישים על Enter:

    mkdir terraform && cd terraform && cat > main.tf
    

    הפקודה הזו יוצרת את הספרייה terraform, מעבירה אתכם אליה ומתחילה להגדיר קובץ הגדרות חדש main.tf בשורה הבאה.

  2. מעתיקים ומדביקים את התצורה הבאה של Terraform:

    # define variables
    variable "project_id" {
      type        = string
      description = "The project name to use."
      default = "PROJECT_ID"
    }
    
    variable "project_number" {
      type        = string
      description = "The project number to use."
      default = "PROJECT_NUMBER"
    }
    
    variable "region" {
      type        = string
      description = "The region where resources are created."
      default = "us-central1"
    }
    
    variable "cloud_scheduler_service_account_email" {
      type        = string
      description = "The service account email."
      default = "CLOUD_SCHEDULER_SERVICE_ACCOUNT_EMAIL"
    }
    
    variable "batch_service_account_email" {
      type        = string
      description = "The service account email."
      default = "BATCH_SERVICE_ACCOUNT_EMAIL"
    }
    
    # define a Cloud Scheduler cron job which triggers Batch jobs
    resource "google_cloud_scheduler_job" "batch-job-invoker" {
      paused           = false # this cron job is enabled
      name             = "batch-job-invoker"
      project          = var.project_id
      region           = var.region
      schedule         = "*/5 * * * *" # when enabled, run every 5 minutes
      time_zone        = "America/Los_Angeles"
      attempt_deadline = "180s"
    
      retry_config {
        max_doublings        = 5
        max_retry_duration   = "0s"
        max_backoff_duration = "3600s"
        min_backoff_duration = "5s"
      }
    
      # when this cron job runs, create and run a Batch job
      http_target {
        http_method = "POST"
        uri = "https://batch.googleapis.com/v1/projects/${var.project_id}/locations/${var.region}/jobs"
        headers = {
          "Content-Type" = "application/json"
          "User-Agent"   = "Google-Cloud-Scheduler"
        }
        # Batch job definition
        body = base64encode(<<EOT
        {
          "taskGroups":[
            {
              "taskSpec": {
                "runnables":{
                  "script": {
                    "text": "echo Hello world! This job was created using Terraform and Cloud Scheduler."
                  }
                }
              }
            }
          ],
          "allocationPolicy": {
            "serviceAccount": {
              "email": "${var.batch_service_account_email}"
            }
          },
          "labels": {
            "source": "terraform_and_cloud_scheduler_tutorial"
          },
          "logsPolicy": {
            "destination": "CLOUD_LOGGING"
          }
        }
        EOT
        )
        oauth_token {
          scope                 = "https://www.googleapis.com/auth/cloud-platform"
          service_account_email = var.cloud_scheduler_service_account_email
        }
      }
    }
    
    

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

    ההגדרה הזו של Terraform מגדירה כמה משתני קלט ומשימת cron שיוצרת קשר עם שיטת ה-API ליצירת משימה באצווה.

  3. כדי לשמור את הקובץ ולסגור אותו, מקישים על Ctrl+D (או על Command+D ב-macOS).

פריסת התצורה של Terraform כדי ליצור את משימת ה-cron

פורסים את הגדרות Terraform על ידי הפעלת Terraform, יצירת השינויים המתוכננים והחלת השינויים האלה. אחרי פריסת ההגדרה של Terraform, אפשר לתאר את המשאבים בפרויקט כדי לוודא שמערכת Terraform יצרה בהצלחה את משימת ה-cron‏ batch-job-invoker.

  1. מאתחלים את Terraform בספרייה:

    terraform init
    

    הפלט אמור להיראות כך:

    ...
    Terraform has been successfully initialized!
    
    You may now begin working with Terraform. Try running "terraform plan" to see
    any changes that are required for your infrastructure. All Terraform commands
    should now work.
    
    If you ever set or change modules or backend configuration for Terraform,
    rerun this command to reinitialize your working directory. If you forget, other
    commands will detect it and remind you to do so if necessary.
    
  2. יוצרים את תוכנית הביצוע של Terraform על סמך המצב הנוכחי של הפרויקט וקובץ ההגדרות:

    terraform plan
    

    הפלט אמור להיראות כך, ולהראות שהתוכנית היא ליצור את משימת ה-cron‏ batch-job-invoker:

    Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
      + create
    
    Terraform will perform the following actions:
    
      # google_cloud_scheduler_job.batch-job-invoker will be created
      + resource "google_cloud_scheduler_job" "batch-job-invoker" {
          + id        = (known after apply)
          + name      = "batch-job-invoker"
          + paused    = false
          + project   = "PROJECT_ID"
          + region    = "us-central1"
          + schedule  = "*/5 * * * *"
          + state     = (known after apply)
          + time_zone = "America/Los_Angeles"
    
          + http_target {
              + body        = "..."
              + headers     = {
                  + "Content-Type" = "application/json"
                  + "User-Agent"   = "Google-Cloud-Scheduler"
                }
              + http_method = "POST"
              + uri         = "https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/us-central1/jobs"
    
              + oauth_token {
                  + scope                 = "https://www.googleapis.com/auth/cloud-platform"
                  + service_account_email = "CLOUD_SCHEDULER_SERVICE_ACCOUNT_EMAIL"
                }
            }
    
          + retry_config {
              + max_backoff_duration = "3600s"
              + max_doublings        = 5
              + max_retry_duration   = "0s"
              + min_backoff_duration = "5s"
              + retry_count          = (known after apply)
            }
        }
    
    Plan: 1 to add, 0 to change, 0 to destroy.
    
    ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
    
    Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now.
    
  3. כדי להחיל את התוכנית ליצירת משימת ה-cron‏ batch-job-invoker, פועלים לפי השלבים הבאים:

    1. מזינים את הפקודה הבאה:

      terraform apply
      

      הפלט דומה לפלט של הפקודה הקודמת terraform plan, אבל הוא מסתיים בהודעת אישור.

    2. כדי לאשר ולהחיל את התוכנית, מזינים yes.

      הפלט אמור להיראות כך:

      google_cloud_scheduler_job.batch-job-invoker: Creating...
      google_cloud_scheduler_job.batch-job-invoker: Creation complete after 0s [id=projects/PROJECT_ID/locations/us-central1/jobs/batch-job-invoker]
      
      Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
      
  4. כדי לוודא שעבודת ה-cron‏ batch-job-invoker קיימת ומופעלת, מתארים אותה:

    gcloud scheduler jobs describe batch-job-invoker --location us-central1
    

    הפלט אמור להיראות כך:

    attemptDeadline: 180s
    httpTarget:
      body: ...
      headers:
        Content-Type: application/json
        User-Agent: Google-Cloud-Scheduler
      httpMethod: POST
      oauthToken:
        scope: https://www.googleapis.com/auth/cloud-platform
        serviceAccountEmail: CLOUD_SCHEDULER_SERVICE_ACCOUNT_EMAIL
      uri: https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/us-central1/jobs
    lastAttemptTime: '...'
    name: projects/PROJECT_ID/locations/us-central1/jobs/batch-job-invoker
    retryConfig:
      maxBackoffDuration: 3600s
      maxDoublings: 5
      maxRetryDuration: 0s
      minBackoffDuration: 5s
    schedule: '*/5 * * * *'
    scheduleTime: '...'
    state: ENABLED
    status: {}
    timeZone: America/Los_Angeles
    userUpdateTime: '...'
    

    בפלט, מוודאים שהשדה state מוגדר לערך ENABLED.

אימות של יצירת משימה באצווה על ידי משימת cron

מוודאים שעבודת ה-cron של batch-job-invoker יוצרת עבודות Batch בצורה נכונה.

  1. אפשר להמתין 5 דקות עד שהמשימה של cron תפעל באופן אוטומטי, או להפעיל את המשימה של cron באופן מיידי:

    gcloud scheduler jobs run batch-job-invoker --location us-central1
    
  2. מפרטים את משימות ה-Batch שנוצרו על ידי משימת ה-cron‏ batch-job-invoker:

    gcloud batch jobs list \
    --filter labels.source=\"terraform_and_cloud_scheduler_tutorial\" \
    --sort-by ~createTime
    
    • הדגל --filter labels.source=\"terraform_and_cloud_scheduler_tutorial\" מסנן את הרשימה כך שיכללו בה רק משימות Batch שיש להן תווית עם המפתח source והערך terraform_and_cloud_scheduler_tutorial.
    • הדגל --sort-by ~createTime ממיין את הרשימה מהחדש ביותר לישן ביותר.

עדכון התצורה של Terraform כדי להשהות את משימת ה-cron

אחרי שמגיעים למספר הרצוי של משימות Batch, מעדכנים ופורסים את התצורה של Terraform כדי להשהות את משימת ה-cron‏ batch-job-invoker. אם רוצים לעדכן מאפיינים אחרים של משימת ה-cron או של משימות Batch עתידיות, צריך לבצע את אותו תהליך.

  1. מעדכנים את קובץ התצורה של Terraform כדי להשהות את משימת ה-cron. לשם כך, מגדירים את השדה paused לערך true:

    sed -i 's/paused           = false # this cron job is enabled/paused           = true # this cron job is paused/g' main.tf
    
  2. יוצרים את תוכנית הביצוע של Terraform על סמך המצב הנוכחי של הפרויקט וקובץ ההגדרות:

    terraform plan
    

    הפלט אמור להיראות כך, ולהראות שהתוכנית היא לעדכן את הערך של השדה paused מ-false ל-true:

    google_cloud_scheduler_job.batch-job-invoker: Refreshing state... [id=projects/PROJECT_ID/locations/us-central1/jobs/batch-job-invoker]
    
    Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
      ~ update in-place
    
    Terraform will perform the following actions:
    
      # google_cloud_scheduler_job.batch-job-invoker will be updated in-place
      ~ resource "google_cloud_scheduler_job" "batch-job-invoker" {
            id               = "projects/PROJECT_ID/locations/us-central1/jobs/batch-job-invoker"
            name             = "batch-job-invoker"
          ~ paused           = false -> true
            # (6 unchanged attributes hidden)
    
          ~ http_target {
              ~ headers     = {
                  + "User-Agent"   = "Google-Cloud-Scheduler"
                    # (1 unchanged element hidden)
                }
                # (3 unchanged attributes hidden)
    
                # (1 unchanged block hidden)
            }
    
            # (1 unchanged block hidden)
        }
    
    Plan: 0 to add, 1 to change, 0 to destroy.
    
    ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
    
    Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now.
    
  3. כדי להחיל את התוכנית לעדכון של משימת ה-cron‏ batch-job-invoker:

    1. מזינים את הפקודה הבאה:

      terraform apply
      

      הפלט דומה לפלט של הפקודה הקודמת terraform plan, אבל הוא מסתיים בהודעת אישור.

    2. כדי לאשר ולהחיל את התוכנית, מזינים yes.

      הפלט אמור להיראות כך:

      google_cloud_scheduler_job.batch-job-invoker: Modifying... [id=projects/PROJECT_ID/locations/us-central1/jobs/batch-job-invoker]
      google_cloud_scheduler_job.batch-job-invoker: Modifications complete after 1s [id=projects/PROJECT_ID/locations/us-central1/jobs/batch-job-invoker]
      
      Apply complete! Resources: 0 added, 1 changed, 0 destroyed.
      
  4. כדי לוודא שעבודת ה-cron‏ batch-job-invoker מושהית, מתארים אותה:

    gcloud scheduler jobs describe batch-job-invoker --location us-central1
    

    הפלט אמור להיראות כך:

    attemptDeadline: 180s
    httpTarget:
      body: ...
      headers:
        Content-Type: application/json
        User-Agent: Google-Cloud-Scheduler
      httpMethod: POST
      oauthToken:
        scope: https://www.googleapis.com/auth/cloud-platform
        serviceAccountEmail: CLOUD_SCHEDULER_SERVICE_ACCOUNT_EMAIL
      uri: https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/us-central1/jobs
    lastAttemptTime: '...'
    name: projects/PROJECT_ID/locations/us-central1/jobs/batch-job-invoker
    retryConfig:
      maxBackoffDuration: 3600s
      maxDoublings: 5
      maxRetryDuration: 0s
      minBackoffDuration: 5s
    schedule: '*/5 * * * *'
    scheduleTime: '...'
    state: PAUSED
    status: {}
    timeZone: America/Los_Angeles
    userUpdateTime: '...'
    

    בפלט, מוודאים שהשדה state מוגדר לערך PAUSED.

הסרת המשאבים

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

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

  1. כדי למחוק Google Cloud פרויקט:

    gcloud projects delete PROJECT_ID

  2. עוברים לספריית ההורה, ואז מוחקים את ספריית Terraform ואת כל הקבצים שלה.

    cd .. && rm -r terraform
    

מחיקת משאבים בודדים

  1. מוחקים את משימת ה-batch-job-invoker cron.

    terraform destroy
    
  2. כדי למחוק את כל עבודות ה-Batch מההדרכה הזו, פועלים לפי השלבים הבאים:

    1. כדי לראות את כל משימות ה-Batch שנוצרו על ידי משימת ה-cron‏ batch-job-invoker:

      gcloud batch jobs list \
      --filter labels.source=\"terraform_and_cloud_scheduler_tutorial\" \
      --sort-by ~createTime
      

      רושמים את השם של כל משימה שרוצים למחוק.

    2. מחיקת משימה באצווה מההדרכה הזו:

      gcloud batch jobs delete JOB_NAME --location us-central1
      

      מחליפים את JOB_NAME בשם של משימה באצווה.

      חוזרים על השלב הזה לכל עבודות ה-Batch.

  3. אם יצרתם חשבון שירות לצורך המדריך הזה, צריך למחוק את חשבון השירות:

    gcloud iam service-accounts delete SERVICE_ACCOUNT_EMAIL
    

    מחליפים את SERVICE_ACCOUNT_EMAIL בכתובת האימייל של חשבון השירות שיצרתם לצורך המדריך הזה. כלומר, השתמשתם בחשבונות השירות הבאים:

    • CLOUD_SCHEDULER_SERVICE_ACCOUNT_EMAIL: חשבון השירות של Cloud Scheduler.
    • BATCH_SERVICE_ACCOUNT_EMAIL: חשבון השירות של Batch.

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

  4. עוברים לספריית ההורה, ואז מוחקים את ספריית Terraform ואת כל הקבצים שלה.

    cd .. && rm -r terraform
    

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