Kurzanleitung: Go-Job in Cloud Run einbinden und erstellen

Go-Job in Cloud Run einbinden und erstellen

Erfahren Sie, wie Sie einen einfachen Cloud Run-Job erstellen, in ein Container-Image verpacken, das Container-Image in Container Registry hochladen und dann in Cloud Run bereitstellen. Sie können zusätzlich zu den angezeigten Sprachen auch andere Sprachen verwenden.

Hinweis

  1. Melden Sie sich bei Ihrem Google Cloud-Konto an. Wenn Sie mit Google Cloud noch nicht vertraut sind, erstellen Sie ein Konto, um die Leistungsfähigkeit unserer Produkte in der Praxis sehen und bewerten zu können. Neukunden erhalten außerdem ein Guthaben von 300 $, um Arbeitslasten auszuführen, zu testen und bereitzustellen.
  2. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  3. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein. So prüfen Sie, ob die Abrechnung für ein Projekt aktiviert ist

  4. Installieren Sie die Google Cloud CLI.
  5. Führen Sie folgenden Befehl aus, um die gcloud CLI zu initialisieren:

    gcloud init
  6. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  7. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein. So prüfen Sie, ob die Abrechnung für ein Projekt aktiviert ist

  8. Installieren Sie die Google Cloud CLI.
  9. Führen Sie folgenden Befehl aus, um die gcloud CLI zu initialisieren:

    gcloud init

Beispieljob schreiben

So schreiben Sie einen Job in Go:

  1. Erstellen Sie ein neues Verzeichnis mit dem Namen jobs und ersetzen Sie das aktuelle Verzeichnis durch dieses Verzeichnis:

    mkdir jobs
    cd jobs
    
  2. Erstellen Sie im selben Verzeichnis eine main.go-Datei für den tatsächlichen Jobcode. Kopieren Sie die folgenden Beispielzeilen in diese Datei:

    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-Jobs ermöglichen es Nutzern, die Anzahl der Aufgaben anzugeben, die der Job ausführen soll. In diesem Beispielcode wird gezeigt, wie Sie die integrierte Umgebungsvariable CLOUD_RUN_TASK_INDEX verwenden. Jede Aufgabe stellt eine laufende Kopie des Containers dar. Aufgaben werden normalerweise parallel ausgeführt. Die Verwendung mehrerer Aufgaben ist nützlich, wenn jede Aufgabe eine Teilmenge Ihrer Daten unabhängig verarbeiten kann.

    Jede Aufgabe kennt ihren Index, der in der Umgebungsvariable CLOUD_RUN_TASK_INDEX gespeichert ist. Die integrierte Umgebungsvariable CLOUD_RUN_TASK_COUNT enthält die Anzahl der Aufgaben, die zum Zeitpunkt der Jobausführung über den Parameter --tasks bereitgestellt werden.

    Der dargestellte Code zeigt auch, wie Aufgaben mit der integrierten Umgebungsvariable CLOUD_RUN_TASK_ATTEMPT wiederholt werden. Die Umgebungsvariable gibt an, wie oft diese Aufgabe wiederholt wurde, beginnend bei 0 für den ersten Versuch und erhöht sich um 1 für jeden nachfolgenden Versuch, bis --max-retries.

    Außerdem können Sie Fehler generieren, um Wiederholungsversuche zu testen und Fehlerlogs zu generieren, um deren Aussehen zu verstehen.

  3. Erstellen Sie eine go.mod-Datei mit folgendem Inhalt:

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

Ihr Code ist vollständig und kann in einen Container gepackt werden.

Jobcontainer erstellen und an Repository senden

Wichtig: In dieser Kurzanleitung wird davon ausgegangen, dass Sie Inhaber- oder Bearbeiterrollen in dem Projekt haben, das Sie für die Kurzanleitung verwenden. Andernfalls finden Sie die Berechtigungen unter Cloud Run-Bereitstellungsberechtigungen, Cloud Build-Berechtigungen und Artifact Registry-Berechtigungen.

Verwenden Sie einen Buildpack, um den Container zu erstellen:

gcloud builds submit --pack image=gcr.io/PROJECT_ID/logger-job

Job in Cloud Run erstellen

So erstellen Sie einen Job mit dem soeben erstellten Container:

gcloud run jobs create job-quickstart \
    --image gcr.io/PROJECT_ID/logger-job \
    --tasks 50 \
    --set-env-vars SLEEP_MS=10000 \
    --set-env-vars FAIL_RATE=0.5 \
    --max-retries 5 \
    --region REGION \
    --project=PROJECT_ID

Dabei ist PROJECT_ID Ihre Projekt-ID und REGION Ihre Region, z. B. us-central1. Beachten Sie, dass Sie die verschiedenen Parameter auf die Werte ändern können, die Sie zu Testzwecken verwenden möchten. SLEEP_MS simuliert die Arbeit und FAIL_RATE führt dazu, dass X% der Aufgaben fehlschlagen, sodass Sie mit Parallelität experimentieren und fehlgeschlagene Aufgaben wiederholen können.

Job in Cloud Run ausführen

So führen Sie den gerade erstellten Job aus:

gcloud run jobs execute job-quickstart

Wenn Sie zur Eingabe der Region aufgefordert werden, wählen Sie die Region Ihrer Wahl aus, zum Beispiel us-central1.

Lokal testen

Sie können den Job lokal ausführen:

docker run --rm -e FAIL_RATE=0.9 -e SLEEP_MS=1000 gcr.io/PROJECT_ID/logger-job
Dabei ist PROJECT_ID Ihre Projekt-ID.

Nächste Schritte

Weitere Informationen dazu, wie Sie einen Container aus Quellcode erstellen und diesen mithilfe eines Push-Vorgangs in ein Repository übertragen, finden Sie unter: