Soluciona problemas

En esta página, se muestra cómo resolver problemas que podrías encontrar cuando uses Workflows.

Para obtener más información, consulta Supervisa y depura Workflows.

Errores en la implementación

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

  • Referencia a una variable, un paso o un subflujo de trabajo no definidos
  • Sintaxis incorrecta
    • Sangría incorrecta
    • Faltan o sobran {, }, ", - o :

Por ejemplo, el siguiente código fuente arroja un error de implementación porque la sentencia return hace referencia a una variable no definida, varC:

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

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

Console

Cuando se produce un error de implementación, Workflows muestra el mensaje de error en un banner en la página Editar flujo de trabajo: Error de Deployment El mensaje de error marca 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 la implementación falla. El mensaje de error marca 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 resolver el problema, edita el código fuente del flujo de trabajo. En este caso, consulta varA en lugar de varC.

Errores de permisos de la cuenta de servicio HTTP 403

Es posible que encuentres un error de HTTP 403 (PERMISSION_DENIED) cuando ejecutes un flujo de trabajo o cuando implementes o actualices un flujo de trabajo.

Se denegó el permiso cuando se ejecutaba un flujo de trabajo

La ejecución de tu flujo de trabajo falla cuando un servidor HTTP responde con un código de error de 403 porque la cuenta de servicio del flujo de trabajo no tiene permiso para acceder a un recurso objetivo. Por ejemplo:

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 se asocia a una cuenta de servicio de Identity and Access Management (IAM) cuando se crea el flujo de trabajo. Para resolver este problema, otorga a la cuenta de servicio del flujo de trabajo uno o más roles de IAM que contengan los permisos mínimos necesarios para acceder a los recursos que usa tu flujo de trabajo. Por ejemplo, para permitir 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 un rol que incluya el permiso logging.logEntries.create. Para obtener más información, consulta Otorga permiso a un flujo de trabajo para acceder a los recursos de Google Cloud .

Se denegó el permiso cuando se implementaba o actualizaba un flujo de trabajo

Cuando implementas o actualizas un flujo de trabajo, la solicitud puede fallar con un error HTTP 403 (PERMISSION_DENIED) si no tienes permiso para actuar como la cuenta de servicio del flujo de trabajo. Por ejemplo:

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

o

permission iam.serviceAccounts.ActAs is required on the workflow's new/current
service account to set it or the workflow source contents

Para resolver este problema, otorga a la principal que implementa o actualiza el flujo de trabajo un rol que incluya el permiso iam.serviceAccounts.actAs, como Usuario de cuenta de servicio (roles/iam.serviceAccountUser). Según la operación, otorga este rol en la siguiente cuenta de servicio:

  • Actualiza solo el código fuente del flujo de trabajo (sin actualizar la cuenta de servicio): otorga el rol en la cuenta de servicio existente asociada con el flujo de trabajo.
  • Crear un flujo de trabajo, actualizar la cuenta de servicio o actualizar el código fuente y la cuenta de servicio: otorga el rol en la cuenta de servicio nueva que asociarás con el flujo de trabajo.

Para obtener más información, consulta Permisos de cuentas de servicio.

Errores HTTP 404 No such object o Not found

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

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

Debes codificar en URL los nombres de los objetos para que sean seguros para la ruta. Puedes usar las funciones url_encode y url_encode_plus para codificar los caracteres aplicables cuando aparecen 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 codificas la URL del nombre del objeto y tu bucket de almacenamiento tiene carpetas, la solicitud fallará. Para obtener más información, consulta Codifica las partes de ruta de URL y Consideraciones sobre los nombres de Cloud Storage.

Errores de HTTP 429 Too many requests

Existe una cantidad máxima de ejecuciones de flujo de trabajo activas que se pueden ejecutar de forma simultánea. Una vez que se agota esta cuota, y si se inhabilita la acumulación de ejecuciones o si se alcanza la cuota para las ejecuciones acumuladas, las ejecuciones nuevas fallan con un código de estado HTTP 429 Too many requests.

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

  • Cuando creas una ejecución con un conector executions.run o executions.create en un flujo de trabajo, la acumulación de ejecuciones se inhabilita de forma predeterminada. Puedes configurarlo si estableces de forma explícita el campo disableConcurrencyQuotaOverflowBuffering de la ejecución en false.
  • En el caso de las ejecuciones activadas por Pub/Sub, la acumulación de ejecuciones está inhabilitada y no se puede configurar.

Para obtener más información, consulta Administra la acumulación de ejecuciones.

También puedes habilitar una cola de Cloud Tasks para ejecutar flujos de trabajo secundarios con una frecuencia que definas y lograr una mejor tasa de ejecución. En ese caso, es posible que quieras inhabilitar de forma explícita la acumulación de ejecuciones.

Errores de permisos de cuentas de servicio entre proyectos

Si recibes un error PERMISSION_DENIED cuando intentas 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 aplique a tu proyecto y de que hayas configurado correctamente la cuenta de servicio. Para obtener más información, consulta Implementa un flujo de trabajo con una cuenta de servicio entre proyectos.

El nombre del recurso debe cumplir con RFC 1123

La ejecución de tu flujo de trabajo falla cuando un servidor HTTP responde con un código de error de 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 resolver este problema, asegúrate de que el nombre del recurso siga el estándar de etiqueta de DNS, como se define en RFC 1123, y que, cuando asignes variables, concatenes strings y expresiones correctamente.

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

YAML

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

JSON

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

Expresiones que contienen dos puntos

En YAML, las expresiones que contienen dos puntos pueden causar un comportamiento inesperado cuando se interpreta que los dos puntos definen un mapa. Aunque es posible implementar y ejecutar el flujo de trabajo, el resultado no será el esperado.

Si creas un flujo de trabajo con la consola de Google Cloud , este no se puede renderizar de forma visual en la consola de Google Cloud , y es posible que recibas una advertencia similar a la siguiente:

Advertencia sobre la creación de flujos de trabajo

Para resolver este problema, une la expresión YAML entre comillas simples:

Recomendado: '${"a: " +string(a)}'

No se recomienda: ${"a: " +string(a)}

Claves de mapa que usan 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 unir el nombre de la clave entre comillas. Si el nombre de la clave no está entre comillas, no se puede implementar el flujo de trabajo. Por ejemplo, si intentas implementar el siguiente código fuente, se arroja un token recognition error:

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

Para resolver este problema, usa el siguiente código para devolver el resultado:

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

Varias expresiones en una lista

No es válido usar varias expresiones dentro de una lista, como en el siguiente ejemplo de rango de iteración:

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

Para resolver este problema, puedes realizar una de las siguientes acciones:

  • 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 encriptación administradas por el cliente (CMEK)

Es posible que encuentres errores cuando uses Cloud KMS con Workflows. En la siguiente tabla, se describen los diferentes problemas y cómo resolverlos.

Problema Descripción
Se rechazó el permiso cloudkms.cryptoKeyVersions.useToEncrypt Es posible que la clave de Cloud KMS proporcionada no exista o que el permiso no esté configurado de forma correcta.

Solución:

La versión de clave no está habilitada Se inhabilitó la versión de la clave de Cloud KMS proporcionada.

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

La región del llavero de claves no coincide con el recurso que se protegerá La región del llavero de claves de KMS que se proporciona es diferente de la región del flujo de trabajo.

Solución: Usa un llavero 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 Ubicaciones de Cloud KMS y Ubicaciones de Workflows.

Se superó el límite de cuota de Cloud KMS Se alcanzó el límite de cuota para las solicitudes de Cloud KMS.

Solución: Limita la cantidad de llamadas a Cloud KMS o aumenta el límite de cuota. Para obtener más información, consulta Cuotas de Cloud KMS.

No se encontró la entidad solicitada cuando se usó el conector de Cloud Run

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

Este método requiere que especifiques la ubicación del extremo HTTP. Por ejemplo, us-central1 o asia-southeast1. Si no especificas una ubicación, se usa el extremo global https://run.googleapis.com. Sin embargo, esta ubicación solo admite métodos de lista.

Para resolver este problema, asegúrate de especificar un argumento location cuando llames al conector. Para conocer las opciones de ubicación de la API de Cloud Run Admin, consulta extremos de servicio.

Límites de recursos

Si encuentras límites de recursos o un error como ResourceLimitError, MemoryLimitExceededError o ResultSizeLimitExceededError, puedes liberar memoria borrando variables. Por ejemplo, es posible que quieras liberar la memoria que se necesita para los pasos posteriores. O bien, puedes tener llamadas con resultados que no te interesan y puedes omitir esos resultados por completo.

Sangría de YAML

La sangría de YAML es significativa y debe ser de al menos dos espacios por nivel de sangría. La sangría insuficiente puede causar errores y un nivel nuevo debe ser al menos dos espacios a partir del inicio del texto en la línea anterior.

Por ejemplo, en el siguiente ejemplo, se especifica de forma incorrecta un elemento de lista que contiene un mapa con elementos stepName y call:

- stepName:
  call: sys.log

En su lugar, debes aplicar una sangría de dos espacios a la línea siguiente para anidar call dentro de stepName:

- stepName:
    call: sys.log

Asegúrate de usar espacios, en lugar de caracteres de tabulación, para aplicar sangría a las líneas.

¿Qué sigue?