Solucionar problemas

En esta página se explica cómo resolver los problemas que pueden surgir al usar Workflows.

Para obtener más información, consulta los artículos sobre monitorización y depuración de Workflows.

Errores de implementación

Cuando se implementa un flujo de trabajo, Workflows comprueba que el código fuente no tenga errores y que coincida con la sintaxis del lenguaje. Workflows devuelve un error si se encuentra alguno. Los tipos de errores de implementación más habituales son los siguientes:

  • Hacer referencia a una variable, un paso o un subflujo de trabajo no definidos
  • Sintaxis incorrecta
    • Sangría incorrecta
    • Falta o sobra {, }, ", - o :

Por ejemplo, el siguiente código fuente genera un error de implementación porque la instrucción return hace referencia a una variable indefinida, varC:

- step1:
    assign:
    - varA: "Hello"
    - varB: "World"
- step2:
    return: ${varC + varB}

Este código fuente incorrecto se usa en los siguientes ejemplos de Google Cloud consola y gcloud CLI.

Consola

Cuando se produce un error de implementación, Workflows muestra el mensaje de error en un banner de la página Editar flujo de trabajo: Error de implementación El mensaje de error señala el problema en el código fuente y especifica el origen del error cuando es posible:

Could not deploy workflow: failed to build: error in step step2: error
evaluating return value: symbol 'varC' is neither a variable nor a
sub-workflow name (Code: 3)

gcloud

Cuando ejecutas el comando gcloud workflows deploy, Workflows devuelve un mensaje de error a la línea de comandos si falla la implementación. El mensaje de error indica el problema en el código fuente y especifica el origen del error cuando es posible:

ERROR: (gcloud.workflows.deploy) [INVALID_ARGUMENT] failed to build:
error in step step2: error evaluating return value: symbol 'varC' is neither
a variable nor a sub-workflow name

Para solucionar el problema, edita el código fuente del flujo de trabajo. En este caso, consulta varA en lugar de varC.

Errores de permisos de cuenta de servicio HTTP 403

La ejecución de tu flujo de trabajo falla cuando un servidor HTTP responde con el código de error 403. Por ejemplo:

Permission 'iam.serviceaccounts.actAs' denied on service
account PROJECT_NUMBER-compute@developer.gserviceaccount.com (or it may not exist).

o

SERVICE_ACCOUNT does not have storage.objects.create access to the Google Cloud
Storage object. Permission 'storage.objects.create' denied on resource (or it may not exist).

Cada flujo de trabajo está asociado a una cuenta de servicio de gestión de identidades y accesos en el momento en que se crea. Para solucionar este problema, debes conceder a la cuenta de servicio uno o varios roles de gestión de identidades y accesos que contengan los permisos mínimos necesarios para gestionar tu flujo de trabajo. Por ejemplo, si quieres que tu flujo de trabajo envíe registros a Cloud Logging, asegúrate de que la cuenta de servicio que ejecuta el flujo de trabajo tenga asignado un rol que incluya el permiso logging.logEntries.create. Para obtener más información, consulta Conceder permiso a un flujo de trabajo para acceder a recursos Google Cloud .

Errores de HTTP 404 No such object o Not found

Cuando se usa el conector de Cloud Storage, la ejecución del flujo de trabajo falla si un servidor HTTP responde con el código de error 404. Por ejemplo:

HTTP server responded with error code 404
in step "read_input_file", routine "main", line: 13
{
  "body": "Not Found",
  "code": 404,
  ...
}

Debe codificar los nombres de los objetos como URL para que sean seguros para las rutas. Puede usar las funciones url_encode y url_encode_plus para codificar los caracteres aplicables cuando aparezcan en el nombre del objeto o en la cadena de consulta de una URL de solicitud. Por ejemplo:

- init:
    assign:
        - source_bucket: "my-bucket"
        - file_name: "my-folder/my-file.json"
- list_objects:
    call: googleapis.storage.v1.objects.get
    args:
        bucket: ${source_bucket}
        object: ${text.url_encode(file_name)}
        alt: media
    result: r
- returnStep:
    return: ${r}

Si no codifica con URL el nombre del objeto y su carpeta de almacenamiento, la solicitud fallará. Para obtener más información, consulta Codificar partes de la ruta de URL y Consideraciones sobre los nombres de Cloud Storage.

Errores de HTTP 429 Too many requests

Hay un número máximo de ejecuciones de flujo de trabajo activas que se pueden ejecutar simultáneamente. Una vez que se agote esta cuota, y si la acumulación de ejecuciones está inhabilitada o se alcanza la cuota de ejecuciones acumuladas, las nuevas ejecuciones fallarán y se devolverá el código de estado HTTP 429 Too many requests.

La acumulación de ejecuciones te permite poner en cola ejecuciones de flujos de trabajo una vez que se alcanza la cuota de ejecuciones simultáneas. De forma predeterminada, el retraso de ejecución está habilitado para todas las solicitudes (incluidas las que activa Cloud Tasks), con las siguientes excepciones:

  • Cuando se crea una ejecución mediante un conector executions.run o executions.create en un flujo de trabajo, la acumulación de ejecuciones está inhabilitada de forma predeterminada. Para configurarlo, asigna el valor false al campo disableConcurrencyQuotaOverflowBuffering de la ejecución.
  • En las ejecuciones activadas por Pub/Sub, el retraso de las ejecuciones está inhabilitado y no se puede configurar.

Para obtener más información, consulta Gestionar el retraso de la ejecución.

También puedes habilitar una cola de Cloud Tasks para ejecutar flujos de trabajo secundarios a un ritmo que definas y conseguir una mejor tasa de ejecución. En ese caso, te recomendamos que inhabilites explícitamente el registro de ejecuciones pendientes.

Errores de permisos de cuentas de servicio entre proyectos

Si recibes un error PERMISSION_DENIED al intentar usar una cuenta de servicio entre proyectos para implementar un flujo de trabajo, asegúrate de que la restricción booleana iam.disableCrossProjectServiceAccountUsage no se haya aplicado a tu proyecto y de que hayas configurado correctamente la cuenta de servicio. Para obtener más información, consulta Implementar un flujo de trabajo con una cuenta de servicio entre proyectos.

El nombre del recurso debe cumplir la RFC 1123.

La ejecución de tu flujo de trabajo falla cuando un servidor HTTP responde con el código de error 400. Por ejemplo:

"description": "must conform to RFC 1123: only lowercase, digits, hyphens,
and periods are allowed, must begin and end with letter or digit, and less
than 64 characters."

Para solucionar este problema, asegúrate de que el nombre del recurso siga el estándar de etiqueta DNS definido en RFC 1123 y de que, al asignar variables, concatenes correctamente cadenas y expresiones.

Por ejemplo, no puedes asignar una variable de esta forma: - string: hello-${world}. En su lugar, haga lo siguiente:

YAML

  - assign_vars:
      assign:
          - string: "hello"
          - string: ${string+" "+"world"}

JSON

  [
    {
      "assign_vars": {
        "assign": [
          {
            "string": "hello"
          },
          {
            "string": "${string+" "+"world"}"
          },
        ]
      }
    }
  ]

Expresiones que contengan dos puntos

En YAML, las expresiones que contienen dos puntos pueden provocar un comportamiento inesperado cuando los dos puntos se interpretan como la definición de un mapa. Aunque es posible implementar y ejecutar el flujo de trabajo, la salida no será la esperada.

Si creas un flujo de trabajo mediante la consola, no se podrá representar visualmente en la consola y es posible que recibas una advertencia similar a la siguiente: Google Cloud Google Cloud

Advertencia de creación de flujo de trabajo

Para solucionar este problema, encierra la expresión YAML entre comillas simples:

Recomendación: '${"a: " +string(a)}'

No recomendado: ${"a: " +string(a)}

Asignar teclas con caracteres no alfanuméricos

Cuando accedas a claves de mapa con caracteres no alfanuméricos (por ejemplo, el signo de exclamación en "special!key": value), debes incluir el nombre de la clave entre comillas. Si el nombre de la clave no está entre comillas, el flujo de trabajo no se puede implementar. Por ejemplo, si intentas implementar el siguiente código fuente, se producirá un error token recognition error:

- init:
    assign:
    - var:
        key:
            "special!key": bar
- returnOutput:
    return: '${"foo" + var.key[special!key]}'

Para solucionarlo, utiliza el siguiente código para devolver el resultado:

'${"foo" + var.key["special!key"]}'

Varias expresiones en una lista

No se puede usar más de una expresión en una lista como la siguiente intervalo de iteración porque no es un archivo YAML válido:

[${rangeStart}, ${rangeEnd}])

Para solucionar este problema, puedes hacer lo siguiente:

  • Coloca la lista dentro de una expresión:

    ${[rangeStart, rangeEnd]}

  • Encierra cada expresión entre comillas simples:

    ['${rangeStart}', '${rangeEnd}']

El resultado es una lista de dos valores, como se esperaba.

Claves de encriptado gestionadas por el cliente (CMEK)

Es posible que se produzcan errores al usar Cloud KMS con Workflows. En la siguiente tabla se describen diferentes problemas y cómo solucionarlos.

Problema Descripción
El permiso cloudkms.cryptoKeyVersions.useToEncrypt está denegado La clave de Cloud KMS proporcionada no existe o el permiso no está configurado correctamente.

Solución:

La versión de clave no está habilitada La versión de la clave de Cloud KMS proporcionada se ha inhabilitado.

Solución: vuelve a habilitar la versión de la clave de Cloud KMS.

La región del conjunto de claves no coincide con el recurso que se va a proteger La región del conjunto de claves de KMS proporcionada es diferente de la región del flujo de trabajo.

Solución: Usa un conjunto de claves de Cloud KMS y un flujo de trabajo protegido de la misma región. Ten en cuenta que pueden estar en proyectos diferentes. Para obtener más información, consulta las ubicaciones de Cloud KMS y las ubicaciones de Workflows.

Se ha superado el límite de cuota de Cloud KMS Se ha alcanzado el límite de cuota de solicitudes de Cloud KMS.

Solución: limita el número de llamadas a Cloud KMS o aumenta el límite de cuota. Para obtener más información, consulta las cuotas de Cloud KMS.

No se ha encontrado la entidad solicitada al usar el conector de Cloud Run

La ejecución de tu flujo de trabajo falla cuando un servidor HTTP responde con el código de error 404 al intentar usar el método del conector googleapis.run.v1.namespaces.jobs.create.

Para usar este método, debes especificar la ubicación del endpoint HTTP. Por ejemplo, us-central1 o asia-southeast1. Si no especifica ninguna ubicación, se usará el endpoint global https://run.googleapis.com. Sin embargo, esta ubicación solo admite métodos de lista.

Para solucionar este problema, asegúrese de especificar un argumento location al llamar al conector. Para ver las opciones de ubicación de la API Admin de Cloud Run, consulta los endpoints de servicio.

Límites de recursos

Si te encuentras con límites de recursos o un error como ResourceLimitError, MemoryLimitExceededError o ResultSizeLimitExceededError, puedes liberar memoria borrando variables. Por ejemplo, puede que quieras liberar memoria que se necesite para pasos posteriores. También puedes recibir llamadas con resultados que no te interesan y omitirlos por completo.

Indentación de YAML

La sangría de YAML es significativa y debe ser de al menos dos espacios por nivel de sangría. Si la sangría es insuficiente, se pueden producir errores. Además, cada nivel debe tener una sangría de al menos dos espacios con respecto al inicio del texto de la línea anterior.

Por ejemplo, en el siguiente código se especifica incorrectamente un elemento de lista que contiene un mapa con elementos stepName y call:

- stepName:
  call: sys.log

En su lugar, debes añadir dos espacios en la línea siguiente para anidar call dentro de stepName:

- stepName:
    call: sys.log

Asegúrate de usar espacios en lugar de tabulaciones para aplicar sangría a las líneas.

Siguientes pasos