פיתוח ויצירה של משימת Go ב-Cloud Run

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

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

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

  2. הגדירו שה-CLI של gcloud ישתמש בזהות המאוחדת שלכם.

    איך נכנסים ל-CLI של gcloud באמצעות הזהות המאוחדת?

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

    gcloud init
  4. יוצרים או בוחרים פרויקט ב- Cloud de Confiance .

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

    • בחירת פרויקט: כדי לבחור פרויקט לא נדרש תפקיד IAM ספציפי – אתם יכולים לבחור כל פרויקט שקיבלתם בו תפקיד.
    • יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד "יצירת פרויקטים" (roles/resourcemanager.projectCreator), שכולל את ההרשאה resourcemanager.projects.create. איך מקצים תפקידים?
    • יוצרים פרויקט ב- Cloud de Confiance :

      gcloud projects create PROJECT_ID

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

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

      gcloud config set project PROJECT_ID

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

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

  6. מוודאים שהחיוב מופעל בפרויקט ב- Cloud de Confiance .

  7. מפעילים את Cloud Run Admin API ואת Cloud Build API, אם הם עדיין לא מופעלים:

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

    כדי להפעיל ממשקי API, צריך את ההרשאה serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד "בעלים" (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד "אדמין בממשק 'שימוש בשירות'" (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידים

    gcloud services enable run.googleapis.com cloudbuild.googleapis.com

    אחרי שמפעילים את Cloud Run Admin API, חשבון השירות שמוגדר כברירת מחדל ב-Compute Engine נוצר באופן אוטומטי.

  8. למחירון של Cloud Run או למחשבון עלויות.

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

כדי לקבל את ההרשאות שדרושות להשלמת המדריך למתחילים, אתם צריכים לבקש מהאדמין לתת לכם את התפקידים הבאים ב-IAM:

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

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

מתן גישה לפרויקט לחשבון השירות של Cloud Build

כברירת מחדל, Cloud Build משתמש בחשבון השירות שמוגדר כברירת מחדל ב-Compute Engine בתור חשבון השירות שמוגדר כברירת מחדל ב-Cloud Build כדי ליצור את קוד המקור ואת המשאב של Cloud Run, אלא אם משנים את ההתנהגות הזו.

כדי ש-Cloud Build יוכל ליצור את המקורות, צריך להקצות לחשבון השירות של Cloud Build את התפקיד Cloud Run Builder‏ (roles/run.builder) בפרויקט:

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=serviceAccount:SERVICE_ACCOUNT_EMAIL_ADDRESS \
    --role=roles/run.builder

מחליפים את PROJECT_ID במזהה הפרויקט ב- Cloud de Confianceואת SERVICE_ACCOUNT_EMAIL_ADDRESS בכתובת האימייל של חשבון השירות של Cloud Build. אם אתם משתמשים בחשבון השירות שמוגדר כברירת מחדל ב-Compute Engine בתור חשבון השירות של Cloud Build, השתמשו בפורמט הבא לכתובת האימייל של חשבון השירות:

PROJECT_NUMBER-compute@developer.s3ns-system.iam.gserviceaccount.com

מחליפים את PROJECT_NUMBER במספר הפרויקט ב- Cloud de Confiance.

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

הקצאת התפקיד "מפתח ב-Cloud Run" מתעדכנת תוך כמה דקות.

כתיבת המשימה לדוגמה

כדי לכתוב משימה ב-Go:

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

    mkdir jobs
    cd jobs
    
  2. באותה ספרייה, יוצרים קובץ main.go לקוד המשימה בפועל. מעתיקים את שורות הדוגמה הבאות:

    package main
    
    import (
    	"fmt"
    	"log"
    	"math/rand"
    	"os"
    	"strconv"
    	"time"
    )
    
    type Config struct {
    	// Job-defined
    	taskNum    string
    	attemptNum string
    
    	// User-defined
    	sleepMs  int64
    	failRate float64
    }
    
    func configFromEnv() (Config, error) {
    	// Job-defined
    	taskNum := os.Getenv("CLOUD_RUN_TASK_INDEX")
    	attemptNum := os.Getenv("CLOUD_RUN_TASK_ATTEMPT")
    	// User-defined
    	sleepMs, err := sleepMsToInt(os.Getenv("SLEEP_MS"))
    	failRate, err := failRateToFloat(os.Getenv("FAIL_RATE"))
    
    	if err != nil {
    		return Config{}, err
    	}
    
    	config := Config{
    		taskNum:    taskNum,
    		attemptNum: attemptNum,
    		sleepMs:    sleepMs,
    		failRate:   failRate,
    	}
    	return config, nil
    }
    
    func sleepMsToInt(s string) (int64, error) {
    	sleepMs, err := strconv.ParseInt(s, 10, 64)
    	return sleepMs, err
    }
    
    func failRateToFloat(s string) (float64, error) {
    	// Default empty variable to 0
    	if s == "" {
    		return 0, nil
    	}
    
    	// Convert string to float
    	failRate, err := strconv.ParseFloat(s, 64)
    
    	// Check that rate is valid
    	if failRate < 0 || failRate > 1 {
    		return failRate, fmt.Errorf("Invalid FAIL_RATE value: %f. Must be a float between 0 and 1 inclusive.", failRate)
    	}
    
    	return failRate, err
    }
    
    func main() {
    	config, err := configFromEnv()
    	if err != nil {
    		log.Fatal(err)
    	}
    
    	log.Printf("Starting Task #%s, Attempt #%s ...", config.taskNum, config.attemptNum)
    
    	// Simulate work
    	if config.sleepMs > 0 {
    		time.Sleep(time.Duration(config.sleepMs) * time.Millisecond)
    	}
    
    	// Simulate errors
    	if config.failRate > 0 {
    		if failure := randomFailure(config); failure != nil {
    			log.Fatalf("%v", failure)
    		}
    	}
    
    	log.Printf("Completed Task #%s, Attempt #%s", config.taskNum, config.attemptNum)
    }
    
    // Throw an error based on fail rate
    func randomFailure(config Config) error {
    	rand.Seed(time.Now().UnixNano())
    	randomFailure := rand.Float64()
    
    	if randomFailure < config.failRate {
    		return fmt.Errorf("Task #%s, Attempt #%s failed.", config.taskNum, config.attemptNum)
    	}
    	return nil
    }
    

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

    כל משימה מודעת לאינדקס שלה, שמאוחסן במשתנה הסביבה CLOUD_RUN_TASK_INDEX. משתנה הסביבה המובנה CLOUD_RUN_TASK_COUNT מכיל את מספר המשימות שסופקו בזמן ביצוע המשימה באמצעות הפרמטר --tasks.

    הקוד שמוצג גם מראה איך לנסות שוב משימות, באמצעות משתנה הסביבה המובנה CLOUD_RUN_TASK_ATTEMPT, שמכיל את מספר הפעמים שהמשימה הזו נוסתה שוב, החל מ-0 בניסיון הראשון וגדל ב-1 בכל ניסיון חוזר, עד --max-retries.

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

  3. יוצרים קובץ go.mod עם התוכן הבא:

    module github.com/GoogleCloudPlatform/golang-samples/run/jobs
    
    go 1.25.0
    

הקוד שלכם מוכן לאריזה בקונטיינר.

יצירת קונטיינר של משימות, שליחה שלו ל-Artifact Registry ופריסה ב-Cloud Run

במדריך למתחילים הזה משתמשים בפריסה מהמקור, שיוצרת את הקונטיינר, מעלה אותו ל-Artifact Registry ופורסת את המשימה ב-Cloud Run:

gcloud run jobs deploy job-quickstart \
    --source . \
    --tasks 50 \
    --set-env-vars SLEEP_MS=10000 \
    --set-env-vars FAIL_RATE=0.1 \
    --max-retries 5 \
    --region REGION \
    --project=PROJECT_ID

כאשר PROJECT_ID הוא מזהה הפרויקט ו-REGION הוא האזור, לדוגמה europe-west1. שימו לב שאפשר לשנות את הפרמטרים השונים לכל ערך שרוצים להשתמש בו למטרות בדיקה. הפונקציה SLEEP_MS מדמה עבודה, והפונקציה FAIL_RATE גורמת ל-X% מהמשימות להיכשל, כדי שתוכלו להתנסות בהקבלה ובניסיון חוזר של משימות שנכשלו.

הפעלת משימה ב-Cloud Run

כדי להריץ את המשימה שיצרתם:

gcloud run jobs execute job-quickstart --region REGION

מחליפים את REGION באזור שבו יצרתם ופרסתם את המשימה, לדוגמה europe-west1.

הסרת המשאבים

כדי להימנע מחיובים נוספים בחשבון Cloud de Confiance by S3NS , צריך למחוק את כל המשאבים שפרסתם באמצעות המדריך למתחילים.

מחיקת המאגר

ב-Cloud Run החיוב הוא רק על הזמן שבו המשימה פועלת. עם זאת, יכול להיות שעדיין תחויבו על אחסון קובץ האימג' של הקונטיינר ב-Artifact Registry. כדי למחוק מאגרים של Artifact Registry, פועלים לפי השלבים שמפורטים במאמר מחיקת מאגרים במסמכי התיעוד של Artifact Registry.

מחיקת המשרה

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

המסוף

כדי למחוק משרה:

  1. נכנסים ל-Cloud Run במסוף Cloud de Confiance by S3NS :

    כניסה ל-Cloud Run

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

  3. לוחצים על Delete. הפעולה הזו מסיימת את כל הרצות המשימות שמתבצעות ואת כל המכונות של הקונטיינרים שפועלות.

gcloud

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

gcloud run jobs delete JOB_NAME

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

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

מחיקת הפרויקט ב- Cloud de Confiance מפסיקה את החיוב על כל המשאבים באותו פרויקט. כדי לשחרר את כל המשאבים של Cloud de Confiance by S3NS בפרויקט:

    כדי למחוק פרויקט ב- Cloud de Confiance :

    gcloud projects delete PROJECT_ID

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

למידע נוסף על בניית קונטיינר מקוד מקור ודחיפה למאגר, ראו: