Crea e crea un job Go in Cloud Run

Scopri come creare un semplice job Cloud Run ed eseguire il deployment dall'origine, che pacchettizza automaticamente il codice in un'immagine container, carica l'immagine del container su Artifact Registry ed esegue il deployment in Cloud Run. Puoi utilizzare altre lingue oltre a quelle mostrate.

Prima di iniziare

  1. Accedi al tuo account Google Cloud. Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti gratuiti per l'esecuzione, il test e il deployment dei carichi di lavoro.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  4. Installa Google Cloud CLI.
  5. Per initialize gcloud CLI, esegui questo comando:

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

    Go to project selector

  7. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  8. Installa Google Cloud CLI.
  9. Per initialize gcloud CLI, esegui questo comando:

    gcloud init

Scrittura del job di esempio

Per scrivere un job in Go:

  1. Crea una nuova directory denominata jobs e cambiala in questa directory:

    mkdir jobs
    cd jobs
    
  2. Nella stessa directory, crea un file main.go per il codice del job effettivo. Copia al suo interno le seguenti righe di esempio:

    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
    }
    

    I job Cloud Run consentono agli utenti di specificare il numero di attività che il job deve eseguire. Questo codice campione mostra come utilizzare la variabile di ambiente CLOUD_RUN_TASK_INDEX integrata. Ogni attività rappresenta una copia in esecuzione del container. Tieni presente che di solito le attività vengono eseguite in parallelo. Utilizzare più attività è utile se ognuna può elaborare in modo indipendente un sottoinsieme di dati.

    Ogni attività è a conoscenza del proprio indice, archiviato nella variabile di ambiente CLOUD_RUN_TASK_INDEX. La variabile di ambiente CLOUD_RUN_TASK_COUNT integrata contiene il numero di attività fornite durante l'esecuzione del job tramite il parametro --tasks.

    Il codice mostrato mostra anche come riprovare le attività utilizzando la variabile di ambiente CLOUD_RUN_TASK_ATTEMPT integrata, che contiene il numero di volte in cui è stato ripetuto l'attività, a partire da 0 per il primo tentativo e con incrementi di 1 per ogni nuovo tentativo, fino a un massimo di --max-retries.

    Il codice consente anche di generare errori per testare i nuovi tentativi e generare log di errore in modo da vederli.

  3. Crea un file go.mod con il seguente contenuto:

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

Il codice è completo e pronto per essere pacchettizzato in un container.

Crea il container dei job, invialo ad Artifact Registry ed esegui il deployment in Cloud Run

Importante: questa guida rapida presuppone che tu disponga dei ruoli di proprietario o editor nel progetto che stai utilizzando per la guida rapida. In caso contrario, fai riferimento al ruolo Sviluppatore origine Cloud Run per le autorizzazioni richieste per il deployment di una risorsa Cloud Run dall'origine.

Questa guida rapida utilizza il deployment dall'origine, che crea il container, lo carica su Artifact Registry ed esegue il deployment del job in 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

dove PROJECT_ID è l'ID progetto e REGION è la tua regione, ad esempio us-central1. Tieni presente che puoi modificare i vari parametri impostandoli sui valori che desideri utilizzare per i tuoi test. SLEEP_MS simula il lavoro e FAIL_RATE fa sì che una percentuale pari a X% delle attività non vada a buon fine, quindi puoi sperimentare il parallelismo e ripetere le attività non riuscite.

esegui un job in Cloud Run

Per eseguire il job appena creato:

gcloud run jobs execute job-quickstart --region REGION

Sostituisci REGION con la regione utilizzata quando hai creato il job e ne hai eseguito il deployment, ad esempio us-central1.

Passaggi successivi

Per ulteriori informazioni sulla creazione di un container dall'origine di codice e sul push a un repository, consulta: