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

Découvrez comment créer un job Cloud Run simple et le déployer à partir d'une source pour mettre automatiquement votre code en package dans une image de conteneur, importer cette image dans Artifact 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 Google Cloud compte. Si vous n'avez jamais utilisé Google Cloud, créez un compte pour évaluer les performances de nos produits dans des scénarios réels. Les nouveaux clients bénéficient également de 300 $de crédits sans frais pour exécuter, tester et déployer des charges de travail.
  2. Installez la Google Cloud CLI.

  3. Si vous utilisez un fournisseur d'identité (IdP) externe, vous devez d'abord vous connecter à la gcloud CLI avec votre identité fédérée.

  4. Pour initialiser la gcloud CLI, exécutez la commande suivante :

    gcloud init
  5. Créez ou sélectionnez un Google Cloud projet.

    Rôles requis pour sélectionner ou créer un projet

    • Sélectionner un projet : la sélection d'un projet ne nécessite pas de rôle IAM spécifique Vous pouvez sélectionner n'importe quel projet pour lequel un rôle vous a été attribué.
    • Créer un projet : pour créer un projet, vous avez besoin du rôle Créateur de projet (roles/resourcemanager.projectCreator), qui contient l'autorisation resourcemanager.projects.create. Découvrez comment attribuer des rôles.
    • Créez un Google Cloud projet :

      gcloud projects create PROJECT_ID

      Remplacez PROJECT_ID par le nom du Google Cloud projet que vous créez.

    • Sélectionnez le Google Cloud projet que vous avez créé :

      gcloud config set project PROJECT_ID

      Remplacez PROJECT_ID par le nom de votre Google Cloud projet.

  6. Si vous utilisez un projet existant pour ce guide, vérifiez que vous disposez des autorisations nécessaires pour suivre les instructions. Si vous avez créé un nouveau projet, vous disposez déjà des autorisations requises.

  7. Vérifiez que la facturation est activée pour votre Google Cloud projet.

  8. Installez la Google Cloud CLI.

  9. Si vous utilisez un fournisseur d'identité (IdP) externe, vous devez d'abord vous connecter à la gcloud CLI avec votre identité fédérée.

  10. Pour initialiser la gcloud CLI, exécutez la commande suivante :

    gcloud init
  11. Créez ou sélectionnez un Google Cloud projet.

    Rôles requis pour sélectionner ou créer un projet

    • Sélectionner un projet : la sélection d'un projet ne nécessite pas de rôle IAM spécifique Vous pouvez sélectionner n'importe quel projet pour lequel un rôle vous a été attribué.
    • Créer un projet : pour créer un projet, vous avez besoin du rôle Créateur de projet (roles/resourcemanager.projectCreator), qui contient l'autorisation resourcemanager.projects.create. Découvrez comment attribuer des rôles.
    • Créez un Google Cloud projet :

      gcloud projects create PROJECT_ID

      Remplacez PROJECT_ID par le nom du Google Cloud projet que vous créez.

    • Sélectionnez le Google Cloud projet que vous avez créé :

      gcloud config set project PROJECT_ID

      Remplacez PROJECT_ID par le nom de votre Google Cloud projet.

  12. Si vous utilisez un projet existant pour ce guide, vérifiez que vous disposez des autorisations nécessaires pour suivre les instructions. Si vous avez créé un nouveau projet, vous disposez déjà des autorisations requises.

  13. Vérifiez que la facturation est activée pour votre Google Cloud projet.

  14. Activez l'API Cloud Run Admin et les API Cloud Build :

    Rôles requis pour activer les API

    Pour activer les API, vous avez besoin du rôle IAM Administrateur d'utilisation du service (roles/serviceusage.serviceUsageAdmin), qui contient l' serviceusage.services.enable autorisation. Découvrez comment attribuer des rôles.

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

    Une fois l'API Cloud Run Admin activée, le compte de service Compute Engine par défaut est créé automatiquement.

  15. Consultez la tarification de Cloud Run ou estimez les coûts à l'aide du simulateur de coût.

Rôles requis

Pour obtenir les autorisations nécessaires pour suivre ce guide de démarrage rapide, demandez à votre administrateur de vous accorder les rôles IAM suivants :

Pour en savoir plus sur l'attribution de rôles, consultez Gérer l'accès aux projets, aux dossiers et aux organisations.

Vous pouvez également obtenir les autorisations requises avec des rôles personnalisés ou d'autres rôles prédéfinis.

Accorder l'accès au compte de service Cloud Build à votre projet

Cloud Build utilise automatiquement le compte de service Compute Engine par défaut comme compte de service Cloud Build par défaut pour créer votre code source et votre ressource Cloud Run, sauf si vous remplacez ce comportement.

Pour que Cloud Build puisse créer vos sources, accordez au compte de service Cloud Build le rôle Compilateur Cloud Run (roles/run.builder) sur votre projet :

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

Remplacez PROJECT_ID par votre Google Cloud ID de projet et SERVICE_ACCOUNT_EMAIL_ADDRESS par l'adresse e-mail du compte de service Cloud Build. Si vous utilisez le compte de service Compute Engine par défaut comme compte de service Cloud Build, utilisez le format suivant pour l'adresse e-mail du compte de service :

PROJECT_NUMBER-compute@developer.gserviceaccount.com

Remplacez PROJECT_NUMBER par votre Google Cloud numéro de projet.

Pour obtenir des instructions détaillées sur la recherche de votre ID et de votre numéro de projet, consultez la section Créer et gérer des projets.

La propagation de l'attribution du rôle de compilateur Cloud Run prend quelques minutes pour se propager.

Écrire l'exemple de tâche

Pour écrire une tâche en Python :

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

    mkdir jobs
    cd jobs
    
  2. Créez un fichier main.py pour le code de tâche réel. Copiez les exemples de lignes suivants :

    import json
    import os
    import random
    import sys
    import time
    
    # Retrieve Job-defined env vars
    TASK_INDEX = os.getenv("CLOUD_RUN_TASK_INDEX", 0)
    TASK_ATTEMPT = os.getenv("CLOUD_RUN_TASK_ATTEMPT", 0)
    # Retrieve User-defined env vars
    SLEEP_MS = os.getenv("SLEEP_MS", 0)
    FAIL_RATE = os.getenv("FAIL_RATE", 0)
    
    
    # Define main script
    def main(sleep_ms=0, fail_rate=0):
        """Program that simulates work using the sleep method and random failures.
    
        Args:
            sleep_ms: number of milliseconds to sleep
            fail_rate: rate of simulated errors
        """
        print(f"Starting Task #{TASK_INDEX}, Attempt #{TASK_ATTEMPT}...")
        # Simulate work by waiting for a specific amount of time
        time.sleep(float(sleep_ms) / 1000)  # Convert to seconds
    
        # Simulate errors
        random_failure(float(fail_rate))
    
        print(f"Completed Task #{TASK_INDEX}.")
    
    
    def random_failure(rate):
        """Throws an error based on fail rate
    
        Args:
            rate: a float between 0 and 1
        """
        if rate < 0 or rate > 1:
            # Return without retrying the Job Task
            print(
                f"Invalid FAIL_RATE env var value: {rate}. "
                + "Must be a float between 0 and 1 inclusive."
            )
            return
    
        random_failure = random.random()
        if random_failure < rate:
            raise Exception("Task failed.")
    
    
    # Start script
    if __name__ == "__main__":
        try:
            main(SLEEP_MS, FAIL_RATE)
        except Exception as err:
            message = (
                f"Task #{TASK_INDEX}, " + f"Attempt #{TASK_ATTEMPT} failed: {str(err)}"
            )
    
            print(json.dumps({"message": message, "severity": "ERROR"}))
            sys.exit(1)  # Retry Job Task by exiting the process

    Les jobs Cloud Run permettent aux utilisateurs de spécifier le nombre de tâches que le job 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 tâches sont généralement exécutées en parallèle. L'utilisation de plusieurs tâches est pertinente si chacune d'elles peut traiter indépendamment un sous-ensemble de vos données.

    Chaque tâche 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 de tâches fournies au moment de l'exécution du job 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 texte nommé Procfile sans extension de fichier et contenant les éléments suivants :

    web: python3 main.py

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

Créer un conteneur de jobs, l'envoyer à Artifact Registry et le déployer dans Cloud Run

Ce guide de démarrage rapide utilise un déploiement à partir d'une source pour créer le conteneur, l'importer dans Artifact Registry et déployer le job dans 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 correspond à votre ID de projet et REGION correspond à votre région, par exemple europe-west1. Notez que vous pouvez modifier les différents paramètres avec 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 tâches afin que vous puissiez tester le parallélisme et réessayer les tâches ayant échoué.

Exécuter une tâche dans Cloud Run

Pour exécuter le job que vous venez de créer, procédez comme suit :

gcloud run jobs execute job-quickstart --region REGION

Remplacez REGION par la région que vous avez utilisée lors de la création et du déploiement du job (par exemple, europe-west1).

Effectuer un nettoyage

Pour éviter des frais supplémentaires sur votre Google Cloud compte, supprimez toutes les ressources que vous avez déployées avec ce guide de démarrage rapide.

Supprimer votre dépôt

Cloud Run ne facture que le temps d'exécution de votre job. Toutefois, vous pouvez toujours être facturé pour le stockage de l'image de conteneur dans Artifact Registry. Pour supprimer des dépôts Artifact Registry, suivez les étapes décrites dans Supprimer des dépôts dans la documentation Artifact Registry.

Supprimer votre job

Les jobs Cloud Run n'entraînent des coûts que lorsqu'une tâche de job est en cours d'exécution. Pour supprimer votre job Cloud Run, procédez comme suit :

Console

Pour supprimer une tâche, procédez comme suit :

  1. Dans la Google Cloud console, accédez à Cloud Run :

    Accédez à Cloud Run

  2. Recherchez le job que vous souhaitez supprimer dans la liste des jobs, puis cliquez la case correspondante pour le sélectionner.

  3. Cliquez sur Supprimer. Toutes les exécutions de job en cours et toutes les instances de conteneur en cours d'exécution sont alors arrêtées.

gcloud

Pour supprimer une tâche, exécutez la commande suivante :

gcloud run jobs delete JOB_NAME

Remplacez JOB_NAME par le nom de la tâche.

Supprimer votre projet de test

La suppression de votre Google Cloud projet arrête la facturation de toutes les ressources de ce projet. Pour libérer toutes les Google Cloud ressources de votre projet, procédez comme suit :

    Supprimer un Google Cloud projet :

    gcloud projects delete PROJECT_ID

É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 :