במדריך הזה מוסבר איך להשתמש ב-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, והשימוש בהם כרוך בתשלום:
כדי להעריך את ההוצאות בהתאם לתחזית השימוש שלכם, אתם יכולים להיעזר במחשבון העלויות.
כשמסיימים את המשימות שמתוארות במסמך הזה אפשר למחוק את המשאבים שיצרתם כדי להימנע מחיובים נוספים. מידע נוסף זמין בקטע הסרת המשאבים.
לפני שמתחילים
-
מכינים את סביבת הפיתוח, Cloud Shell או מעטפת מקומית:
Cloud Shell
כדי להשתמש בטרמינל אונליין שבו כבר מוגדרים ה-CLI של gcloud ו-Terraform, צריך להפעיל את Cloud Shell.
בחלק התחתון של הדף הזה מתחיל סשן של Cloud Shell ומופיעה הנחיה של שורת הפקודה. הסשן יופעל תוך כמה שניות.
מעטפת מקומית
כדי להשתמש בסביבת פיתוח מקומית:
-
התקינו את ה-CLI של Google Cloud.
-
אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
-
כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:
gcloud init - מתקינים את Terraform.
-
-
יוצרים או בוחרים 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 .
-
מפעילים את ממשקי ה-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 -
חשוב לוודא שלפרויקט יש לפחות חשבון שירות אחד עם ההרשאות שנדרשות ללימוד הזה.
באופן ספציפי, אתם יכולים להשתמש באותו חשבון שירות או בשני חשבונות שירות נפרדים כדי להעניק את ההרשאות הבאות:
- מתן אפשרות למשימת ה-cron ליצור משימות באצווה ולצרף את חשבון השירות למשימות באצווה.
- מאפשרים לעבודות Batch ליצור את המשאבים שנדרשים להפעלה ולגשת אליהם.
כדי לוודא שלחשבונות השירות במדריך הזה יש את ההרשאות הנדרשות לשימוש ב-Terraform כדי ליצור משימות Batch באמצעות משימת cron ב-Cloud Scheduler, צריך לבקש מהאדמין להקצות לחשבונות השירות במדריך הזה את תפקידי ה-IAM הבאים:
-
חשבון שירות למשימת ה-cron של Cloud Scheduler:
- הכלי לעריכת משימות באצווה (
roles/batch.jobsEditor) בפרויקט - משתמש בחשבון שירות (
roles/iam.serviceAccountUser) בחשבון השירות של עבודות Batch (גם אם זה אותו חשבון)
- הכלי לעריכת משימות באצווה (
-
חשבון שירות למשימות באצווה:
- Batch Agent Reporter (
roles/batch.agentReporter) בפרויקט - כתיבה ביומן (
roles/logging.logWriter) בפרויקט
- Batch Agent Reporter (
להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.
יכול להיות שהאדמין יוכל גם לתת לחשבונות השירות של המדריך הזה את ההרשאות שנדרשות באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש אחרים.
-
מוודאים שיש לכם את ההרשאות הנדרשות כדי לבצע את הפעולות שמפורטות במדריך הזה.
באופן ספציפי, אתם צריכים הרשאות לביצוע הפעולות הבאות:
- יוצרים משימת cron ומצרפים אליה את חשבון השירות.
- הצגה ומחיקה של משימת ה-cron ומשימות ה-Batch.
כדי לקבל את ההרשאות שדרושות לשימוש ב-Terraform כדי ליצור משימות Batch באמצעות משימת cron ב-Cloud Scheduler, צריך לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים:
- משתמש בחשבון שירות (
roles/iam.serviceAccountUser) בחשבון השירות של משימת ה-cron ב-Cloud Scheduler - אדמין Cloud Scheduler (
roles/cloudscheduler.admin) בפרויקט - הכלי לעריכת משימות באצווה (
roles/batch.jobsEditor) בפרויקט - מציג היומנים (
roles/logging.viewer) בפרויקט
יצירת ספריית Terraform וקובץ התצורה
יוצרים ספרייה ל-Terraform וקובץ הגדרות שמגדיר את המשאבים שרוצים ליצור או לעדכן באמצעות Terraform.
קובץ התצורה לדוגמה במדריך הזה מגדיר משימת cron ב-Cloud Scheduler בשם batch-job-invoker.
כשהאפשרות הזו מופעלת, batch-job-invoker משימת ה-cron מופעלת כל 5 דקות כדי ליצור מופע חדש של משימה באצווה שהוגדרה.
כדי ליצור ספרייה וקובץ תצורה חדש של Terraform (
.tf) בתוך הספרייה הזו, מקלידים את הפקודה הבאה ומקישים עלEnter:mkdir terraform && cd terraform && cat > main.tfהפקודה הזו יוצרת את הספרייה
terraform, מעבירה אתכם אליה ומתחילה להגדיר קובץ הגדרות חדשmain.tfבשורה הבאה.מעתיקים ומדביקים את התצורה הבאה של 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 } } }מחליפים את מה שכתוב בשדות הבאים:
-
PROJECT_ID: מזהה הפרויקט שלכם. -
PROJECT_NUMBER: מספר הפרויקט שלכם.
CLOUD_SCHEDULER_SERVICE_ACCOUNT_EMAIL: כתובת האימייל של חשבון השירות שהכנתם למשימת ה-cron של Cloud Scheduler.לדוגמה, כדי להשתמש בחשבון השירות שמוגדר כברירת מחדל ב-Compute Engine, צריך לציין את הפרטים הבאים:
PROJECT_NUMBER-compute@developer.gserviceaccount.com
BATCH_SERVICE_ACCOUNT_EMAIL: כתובת האימייל של חשבון השירות שהכנתם לעבודות Batch.לדוגמה, כדי להשתמש בחשבון השירות שמוגדר כברירת מחדל ב-Compute Engine, צריך לציין את הפרטים הבאים:
PROJECT_NUMBER-compute@developer.gserviceaccount.com
ההגדרה הזו של Terraform מגדירה כמה משתני קלט ומשימת cron שיוצרת קשר עם שיטת ה-API ליצירת משימה באצווה.
-
כדי לשמור את הקובץ ולסגור אותו, מקישים על
Ctrl+D(או עלCommand+Dב-macOS).
פריסת התצורה של Terraform כדי ליצור את משימת ה-cron
פורסים את הגדרות Terraform על ידי הפעלת Terraform, יצירת השינויים המתוכננים והחלת השינויים האלה. אחרי פריסת ההגדרה של Terraform, אפשר לתאר את המשאבים בפרויקט כדי לוודא שמערכת Terraform יצרה בהצלחה את משימת ה-cron batch-job-invoker.
מאתחלים את 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.יוצרים את תוכנית הביצוע של 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.כדי להחיל את התוכנית ליצירת משימת ה-cron
batch-job-invoker, פועלים לפי השלבים הבאים:מזינים את הפקודה הבאה:
terraform applyהפלט דומה לפלט של הפקודה הקודמת
terraform plan, אבל הוא מסתיים בהודעת אישור.כדי לאשר ולהחיל את התוכנית, מזינים
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.
כדי לוודא שעבודת ה-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 בצורה נכונה.
אפשר להמתין 5 דקות עד שהמשימה של cron תפעל באופן אוטומטי, או להפעיל את המשימה של cron באופן מיידי:
gcloud scheduler jobs run batch-job-invoker --location us-central1מפרטים את משימות ה-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 עתידיות, צריך לבצע את אותו תהליך.
מעדכנים את קובץ התצורה של Terraform כדי להשהות את משימת ה-cron. לשם כך, מגדירים את השדה
pausedלערךtrue:sed -i 's/paused = false # this cron job is enabled/paused = true # this cron job is paused/g' main.tfיוצרים את תוכנית הביצוע של 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.כדי להחיל את התוכנית לעדכון של משימת ה-cron
batch-job-invoker:מזינים את הפקודה הבאה:
terraform applyהפלט דומה לפלט של הפקודה הקודמת
terraform plan, אבל הוא מסתיים בהודעת אישור.כדי לאשר ולהחיל את התוכנית, מזינים
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.
כדי לוודא שעבודת ה-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 בגלל השימוש במשאבים שנעשה במסגרת המדריך הזה, אפשר למחוק את הפרויקט שמכיל את המשאבים, או להשאיר את הפרויקט ולמחוק את המשאבים בנפרד.
מחיקת הפרויקט
כדי למחוק Google Cloud פרויקט:
gcloud projects delete PROJECT_ID
עוברים לספריית ההורה, ואז מוחקים את ספריית Terraform ואת כל הקבצים שלה.
cd .. && rm -r terraform
מחיקת משאבים בודדים
מוחקים את משימת ה-
batch-job-invokercron.terraform destroyכדי למחוק את כל עבודות ה-Batch מההדרכה הזו, פועלים לפי השלבים הבאים:
כדי לראות את כל משימות ה-Batch שנוצרו על ידי משימת ה-cron
batch-job-invoker:gcloud batch jobs list \ --filter labels.source=\"terraform_and_cloud_scheduler_tutorial\" \ --sort-by ~createTimeרושמים את השם של כל משימה שרוצים למחוק.
מחיקת משימה באצווה מההדרכה הזו:
gcloud batch jobs delete JOB_NAME --location us-central1מחליפים את
JOB_NAMEבשם של משימה באצווה.חוזרים על השלב הזה לכל עבודות ה-Batch.
אם יצרתם חשבון שירות לצורך המדריך הזה, צריך למחוק את חשבון השירות:
gcloud iam service-accounts delete SERVICE_ACCOUNT_EMAILמחליפים את
SERVICE_ACCOUNT_EMAILבכתובת האימייל של חשבון השירות שיצרתם לצורך המדריך הזה. כלומר, השתמשתם בחשבונות השירות הבאים:-
CLOUD_SCHEDULER_SERVICE_ACCOUNT_EMAIL: חשבון השירות של Cloud Scheduler. -
BATCH_SERVICE_ACCOUNT_EMAIL: חשבון השירות של Batch.
אם יצרתם שני חשבונות שירות נפרדים, חוזרים על השלב הזה.
-
עוברים לספריית ההורה, ואז מוחקים את ספריית Terraform ואת כל הקבצים שלה.
cd .. && rm -r terraform
המאמרים הבאים
- מידע נוסף על שימוש ב-Terraform עם Google Cloud:
- מידע נוסף על משימות cron ב-Cloud Scheduler
- מידע נוסף על משימות באצווה