Node.js-Job in Cloud Run entwickeln und erstellen

Erfahren Sie, wie Sie einen einfachen Cloud Run-Job erstellen, dann aus der Quelle bereitstellen, der Ihren Code automatisch in ein Container-Image verpackt, das Container-Image in Artifact Registry hochlädt und anschließend in Cloud Run bereitstellt. Sie können zusätzlich zu den angezeigten Sprachen auch andere Sprachen verwenden.

Hinweise

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Install the Google Cloud CLI.
  5. To initialize the gcloud CLI, run the following command:

    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. Make sure that billing is enabled for your Google Cloud project.

  8. Install the Google Cloud CLI.
  9. To initialize the gcloud CLI, run the following command:

    gcloud init
  10. Aktivieren Sie die Cloud Run Admin API und die Cloud Build API:

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

    Nachdem die Cloud Run Admin API aktiviert wurde, wird das Compute Engine-Standarddienstkonto automatisch erstellt.

  11. Damit Cloud Build Ihre Quellen erstellen kann, weisen Sie dem Compute Engine-Standarddienstkonto die Rolle Cloud Build-Dienstkonto zu. Führen Sie dazu Folgendes aus:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
        --role=roles/cloudbuild.builds.builder

    Ersetzen Sie PROJECT_NUMBER durch Ihre Google Cloud-Projektnummer und PROJECT_ID durch Ihre Google Cloud-Projekt-ID. Eine detaillierte Anleitung zum Ermitteln der Projekt-ID und der Projektnummer finden Sie unter Projekte erstellen und verwalten.

    Es dauert einige Minuten, bis die Zuweisung der Rolle „Cloud Build-Dienstkonto“ für das Compute Engine-Standarddienstkonto übertragen wurde.

Beispieljob schreiben

So schreiben Sie einen Job in Node.js:

  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 eine package.json-Datei mit folgendem Inhalt:

    {
        "name": "jobs",
        "version": "1.0.0",
        "description": "Node.js sample for Cloud Run jobs",
        "main": "index.js",
        "scripts": {
            "start": "node index.js"
        },
        "engines": {
            "node": ">=16.0.0"
        },
        "author": "Google LLC",
        "license": "Apache-2.0"
    }
    
  3. Erstellen Sie im selben Verzeichnis eine index.js-Datei für den tatsächlichen Jobcode. Kopieren Sie die folgenden Beispielzeilen in diese Datei:

    // Retrieve Job-defined env vars
    const {CLOUD_RUN_TASK_INDEX = 0, CLOUD_RUN_TASK_ATTEMPT = 0} = process.env;
    // Retrieve User-defined env vars
    const {SLEEP_MS, FAIL_RATE} = process.env;
    
    // Define main script
    const main = async () => {
      console.log(
        `Starting Task #${CLOUD_RUN_TASK_INDEX}, Attempt #${CLOUD_RUN_TASK_ATTEMPT}...`
      );
      // Simulate work
      if (SLEEP_MS) {
        await sleep(SLEEP_MS);
      }
      // Simulate errors
      if (FAIL_RATE) {
        try {
          randomFailure(FAIL_RATE);
        } catch (err) {
          err.message = `Task #${CLOUD_RUN_TASK_INDEX}, Attempt #${CLOUD_RUN_TASK_ATTEMPT} failed.\n\n${err.message}`;
          throw err;
        }
      }
      console.log(`Completed Task #${CLOUD_RUN_TASK_INDEX}.`);
    };
    
    // Wait for a specific amount of time
    const sleep = ms => {
      return new Promise(resolve => setTimeout(resolve, ms));
    };
    
    // Throw an error based on fail rate
    const randomFailure = rate => {
      rate = parseFloat(rate);
      if (!rate || rate < 0 || rate > 1) {
        console.warn(
          `Invalid FAIL_RATE env var value: ${rate}. Must be a float between 0 and 1 inclusive.`
        );
        return;
      }
    
      const randomFailure = Math.random();
      if (randomFailure < rate) {
        throw new Error('Task failed.');
      }
    };
    
    // Start script
    main().catch(err => {
      console.error(err);
      process.exit(1); // Retry Job Task by exiting the process
    });

    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.

  4. Erstellen Sie ein Procfile mit folgendem Inhalt:

    # Define the application's entrypoint to override default, `npm start`
    # https://github.com/GoogleCloudPlatform/buildpacks/issues/160
    web: node index.js
    

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

Jobcontainer erstellen, an Artifact Registry senden und in Cloud Run bereitstellen

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 in der Rolle „Cloud Run Source Developer“ die erforderlichen Berechtigungen zum Bereitstellen einer Cloud Run-Ressource aus der Quelle.

In dieser Kurzanleitung wird die Bereitstellung aus der Quelle verwendet. dabei wird der Container erstellt, in Artifact Registry hochgeladen und der Job in Cloud Run bereitgestellt:

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

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 --region REGION

Ersetzen Sie REGION durch die Region, die Sie beim Erstellen und Bereitstellen des Jobs verwendet haben, z. B. us-central1.

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: