Compila y crea un trabajo de Node.js en Cloud Run

Aprende a crear un trabajo simple de Cloud Run, luego a implementar desde la fuente, lo que empaqueta tu código automáticamente en una imagen de contenedor, sube la imagen del contenedor a Artifact Registry y, luego, se implementa en Cloud Run. Puedes usar otros lenguajes además de los que se muestran.

Antes de comenzar

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

  4. Install the Google Cloud CLI.

  5. Si usas un proveedor de identidad externo (IdP), primero debes acceder a gcloud CLI con tu identidad federada.

  6. Para inicializar gcloud CLI, ejecuta el siguiente comando:

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

    Go to project selector

  8. Verify that billing is enabled for your Google Cloud project.

  9. Install the Google Cloud CLI.

  10. Si usas un proveedor de identidad externo (IdP), primero debes acceder a gcloud CLI con tu identidad federada.

  11. Para inicializar gcloud CLI, ejecuta el siguiente comando:

    gcloud init
  12. Habilita la API de Cloud Run Admin y la API de Cloud Build:

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

    Después de habilitar la API de Cloud Run Admin, se crea de forma automática la cuenta de servicio predeterminada de Compute Engine.

  13. Otorga a la cuenta de servicio de Cloud Build el siguiente rol de IAM.

    Haz clic para ver los roles necesarios para la cuenta de servicio de Cloud Build

    Cloud Build usa automáticamente la cuenta de servicio predeterminada de Compute Engine como la cuenta de servicio predeterminada de Cloud Build para compilar tu código fuente y el recurso de Cloud Run, a menos que anules este comportamiento. Para que Cloud Build pueda compilar tus fuentes, pídele a tu administrador que otorgue el rol de Compilador de Cloud Run (roles/run.builder) a la cuenta de servicio predeterminada de Compute Engine en tu proyecto:

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

    Reemplaza PROJECT_NUMBER por el número de tu proyecto Google Cloudy PROJECT_ID por el ID del proyecto proyecto Google Cloud. Para obtener instrucciones detalladas sobre cómo encontrar el ID y el número de tu proyecto, consulta Crea y administra proyectos.

    El otorgamiento del rol de compilador de Cloud Run a la cuenta de servicio predeterminada de Compute Engine tarda un par de minutos en propagarse.

  14. Revisa los precios de Cloud Run o estima los costos con la calculadora de precios.
  15. Escribe el trabajo de muestra

    Para escribir un trabajo en Node.js, sigue estos pasos:

    1. Crea un directorio nuevo llamado jobs y usa el comando de cambio de directorio en él:

      mkdir jobs
      cd jobs
      
    2. Crea un archivo package.json con el siguiente contenido:

      {
          "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. En el mismo directorio, crea un archivo index.js para el código real del trabajo. Copia las siguientes líneas de muestra en él:

      // 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
      });

      Los trabajos de Cloud Run permiten a los usuarios especificar la cantidad de tareas que se ejecutarán en el trabajo. En este código de muestra, se indica cómo usar la variable de entorno integrada CLOUD_RUN_TASK_INDEX. Cada tarea representa una copia en ejecución del contenedor. Ten en cuenta que las tareas se suelen ejecutar en paralelo. Usar múltiples tareas es útil si cada una puede procesar de forma independiente un subconjunto de tus datos.

      Cada tarea conoce su índice, almacenado en la variable de entorno CLOUD_RUN_TASK_INDEX. La variable de entorno CLOUD_RUN_TASK_COUNT integrada contiene la cantidad de tareas que se proporcionan en el momento de la ejecución del trabajo mediante el parámetro --tasks.

      En el código que se muestra, también aparece cómo reintentar tareas mediante la variable de entorno integrada CLOUD_RUN_TASK_ATTEMPT, que contiene la cantidad de veces que se reintentó esta tarea, a partir del 0 para el primer intento y con incrementos de 1 por cada reintento sucesivo, hasta --max-retries.

      El código también te permite generar fallas como una forma de probar los reintentos y generar registros de errores para que puedas ver cómo se ven.

    4. Crea un Procfile con el siguiente contenido:

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

    Tu código está completo y listo para empaquetarse en un contenedor.

    Compila un contenedor de trabajos, envíalo a Artifact Registry y, luego, impleméntalo en Cloud Run

    Importante: En esta guía de inicio rápido, se supone que tienes roles de propietario o de editor en el proyecto que usas para la guía de inicio rápido. De lo contrario, consulta el rol del desarrollador de fuente de Cloud Run para conocer los permisos necesarios para implementar un recurso de Cloud Run desde la fuente.

    En esta guía de inicio rápido, se usa la implementación desde la fuente, lo que compila el contenedor, lo sube a Artifact Registry y, luego, implementa el trabajo en 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

    En el ejemplo anterior, PROJECT_ID es el ID del proyecto y REGION es la región, por ejemplo, europe-west1. Ten en cuenta que puedes cambiar los diversos parámetros a cualquier valor que desees usar para fines de prueba. SLEEP_MS simula el trabajo y FAIL_RATE hace que el X% de las tareas fallen, por lo que puedes experimentar con el paralelismo y reintentar las tareas con errores.

    Ejecuta un trabajo en Cloud Run

    Para ejecutar el trabajo que acabas de crear, sigue estos pasos:

    gcloud run jobs execute job-quickstart --region REGION

    Reemplaza REGION por la región que usaste cuando creaste e implementaste el trabajo, por ejemplo, europe-west1.

    Limpia

    Para evitar cargos adicionales en tu cuenta de Google Cloud , borra todos los recursos que implementaste con esta guía de inicio rápido.

    Borra tu repositorio

    Cloud Run solo cobra por el tiempo que se ejecuta tu trabajo. Sin embargo, es posible que se te cobre por almacenar la imagen del contenedor en Artifact Registry. Para borrar repositorios de Artifact Registry, sigue los pasos que se indican en Borra repositorios en la documentación de Artifact Registry.

    Borra tu trabajo

    Los trabajos de Cloud Run solo generan costos cuando se ejecuta una tarea del trabajo. Para borrar tu trabajo de Cloud Run, sigue uno de estos pasos:

    Console

    Para borrar un trabajo, sigue estos pasos:

    1. En la consola de Google Cloud , ve a Cloud Run:

      Ir a Cloud Run

    2. Ubica el trabajo que deseas borrar en la lista de trabajos y haz clic en su casilla de verificación para seleccionarlo.

    3. Haz clic en Borrar. Esto finaliza todas las ejecuciones de trabajos en curso y todas las instancias de contenedor en ejecución.

    gcloud

    Para borrar un trabajo, ejecuta el siguiente comando:

    gcloud run jobs delete JOB_NAME

    Reemplaza JOB_NAME por el nombre del trabajo.

    Borra tu proyecto de prueba

    Si borras tu proyecto de Google Cloud , se detendrá la facturación de todos los recursos que contenga. Para liberar todos los recursos Google Cloud de tu proyecto, sigue estos pasos:

    1. In the Google Cloud console, go to the Manage resources page.

      Go to Manage resources

    2. In the project list, select the project that you want to delete, and then click Delete.
    3. In the dialog, type the project ID, and then click Shut down to delete the project.

    ¿Qué sigue?

    Para obtener más información sobre cómo compilar un contenedor a partir de código fuente y enviarlo a un repositorio, consulta los siguientes vínculos: