Restez organisé à l'aide des collections Enregistrez et classez les contenus selon vos préférences.
Guide de démarrage rapide : concevoir et créer une tâche Go dans Cloud Run

Concevoir et créer une tâche Go dans Cloud Run

Apprenez à créer une tâche Cloud Run simple, à l'intégrer dans une image de conteneur, à importer cette image dans Container Registry, puis à la déployer dans Cloud Run. Vous pouvez utiliser d'autres langages en plus de ceux présentés.

Avant de commencer

  1. Connectez-vous à votre compte Google Cloud. Si vous débutez sur Google Cloud, créez un compte pour évaluer les performances de nos produits en conditions réelles. Les nouveaux clients bénéficient également de 300 $ de crédits gratuits pour exécuter, tester et déployer des charges de travail.
  2. Dans Google Cloud Console, sur la page de sélection du projet, sélectionnez ou créez un projet Google Cloud.

    Accéder au sélecteur de projet

  3. Assurez-vous que la facturation est activée pour votre projet Cloud. Découvrez comment vérifier si la facturation est activée sur un projet.

  4. Installez et initialisez Google Cloud CLI.
  5. Dans Google Cloud Console, sur la page de sélection du projet, sélectionnez ou créez un projet Google Cloud.

    Accéder au sélecteur de projet

  6. Assurez-vous que la facturation est activée pour votre projet Cloud. Découvrez comment vérifier si la facturation est activée sur un projet.

  7. Installez et initialisez Google Cloud CLI.

Écrire l'exemple de tâche

Pour écrire une tâche dans Go :

  1. Créez un répertoire nommé jobs et modifiez les sous-répertoires comme suit :

    mkdir jobs
    cd jobs
    
  2. Dans le même répertoire, créez un fichier main.go pour le code de la tâche réelle. Copiez les exemples de lignes suivants :

    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
    }
    

    Les tâches Cloud Run permettent aux utilisateurs de spécifier le nombre d'opérations que la tâche doit exécuter. Cet exemple de code montre comment utiliser la variable d'environnement CLOUD_RUN_TASK_INDEX intégrée. Chaque tâche correspond à une copie en cours d'exécution du conteneur. Notez que les opérations sont généralement exécutées en parallèle. L'utilisation de plusieurs opérations est pertinente si chacune d'elles peut traiter indépendamment un sous-ensemble de vos données.

    Chaque opération connaît son index, stocké dans la variable d'environnement CLOUD_RUN_TASK_INDEX. La variable d'environnement CLOUD_RUN_TASK_COUNT intégrée contient le nombre d'opérations fournies au moment de l'exécution de la tâche via le paramètre --tasks.

    Le code présenté montre également comment relancer des tâches à l'aide de la variable d'environnement intégrée CLOUD_RUN_TASK_ATTEMPT, qui contient le nombre de tentatives d'exécution de cette tâche, commençant à 0 pour la première tentative et incrémentée de 1 pour chaque nouvelle tentative, jusqu'à--max-retries.

    Le code vous permet également de générer des échecs afin de tester la répétition des tentatives et de générer des journaux d'erreurs afin que vous puissiez voir à quoi ils ressemblent.

  3. Créez un fichier go.mod avec le contenu suivant :

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

Votre code est terminé et prêt à être empaqueté dans un conteneur.

Créer un conteneur de tâches et envoyer au dépôt

Important : Dans ce guide de démarrage rapide, nous partons du principe que vous disposez de rôles de propriétaire ou d'éditeur dans le projet que vous utilisez pour les besoins du guide de démarrage rapide. Sinon, reportez-vous aux sections Autorisations de déploiement Cloud Run, Autorisations Cloud Build et Autorisations Artifact Registry pour connaître les autorisations requises.

Utilisez un Buildpack pour créer le conteneur :

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

Créer une tâche dans Cloud Run

Pour créer une tâche à l'aide du conteneur que vous venez de compiler, procédez comme suit:

gcloud beta 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_ID correspond à votre ID de projet et REGION à votre région, par exemple us-central1. Notez que vous pouvez remplacer les différents paramètres par les valeurs que vous souhaitez utiliser à des fins de test. SLEEP_MS simule le travail et FAIL_RATE entraîne l'échec de X % des opérations afin que vous puissiez tester le parallélisme et réessayer les opérations ayant échoué.

Exécuter une tâche dans Cloud Run

Pour exécuter la tâche que vous venez de créer, procédez comme suit :

gcloud beta run jobs execute job-quickstart

Lorsque vous êtes invité à indiquer la région, sélectionnez la région de votre choix, par exemple us-central1.

Tester en local

Vous pouvez exécuter la tâche en local :

docker run --rm -e FAIL_RATE=0.9 -e SLEEP_MS=1000 gcr.io/PROJECT_ID/logger-job
PROJECT_ID correspond à l'ID de votre projet.

Étape suivante

Pour savoir comment créer un conteneur à partir d'une source de code et le transférer vers un dépôt, consultez la section suivante :