Solución de problemas del proveedor de Terraform

En este tema se describe cómo solucionar problemas comunes del proveedor de Terraform de Oracle Cloud Infrastructure (OCI).

Comience por Solución de problemas básicos y, a continuación, consulte las siguientes secciones:

Aspectos básicos de la solución de problemas

Al solucionar problemas u obtener soporte para el proveedor de Terraform de Oracle Cloud Infrastructure (OCI), suele resultar útil comprobar primero el estado de los servicios de OCI y la versión de Terraform y del proveedor, así como activar y recopilar el log detallado.

Consejo

La comprobación del estado del servicio y la salida del log detallado pueden ayudarle a determinar si un problema está relacionado con el proveedor de Terraform o el servicio de OCI que utiliza el proveedor.

Consulte la lista de incidencias comunes después de comenzar por las básicas.

Comprobación del estado y las interrupciones del servicio OCI

Para comprobar el estado más reciente y si hay interrupciones en OCI, consulte Estado de OCI.

Comprobación de las versiones de Terraform y del proveedor de Terraform de OCI

Para verificar la versión de Terraform y del proveedor de Terraform de OCI, inicialice Terraform desde un directorio con las configuraciones y, a continuación, ejecute el comando -version. Por ejemplo:

terraform init
terraform -version

Se muestran las versiones:

Terraform v0.12.20
+ provider registry.terraform.io/hashicorp/oci v3.95.0
Consejo

Las versiones más recientes del proveedor de Terraform de OCI incluyen la versión del proveedor en los mensajes de error.

La documentación del proveedor de Terraform de OCI refleja cuál es la última versión. Puede ver la documentación de versiones anteriores del proveedor visitando la referencia de HashiCorp y seleccionando una versión específica. También puede descargar e instalar una versión específica del proveedor.

Log detallado del proveedor de Terraform de OCI

Para obtener una salida de la consola detallada cuando el proveedor se esté ejecutando, preceda al comando de Terraform con los indicadores TF_LOG y OCI_GO_SDK_DEBUG. Por ejemplo:

TF_LOG=DEBUG OCI_GO_SDK_DEBUG=v terraform plan

El nivel TF_LOG y el indicador OCI_GO_SDK_DEBUG también se pueden definir como variables de entorno.

Reintentos automáticos

Al aplicar, refrescar o destruir un plan, Terraform puede encontrarse con algunos errores de OCI intermitentes (como errores 429 o 500) que podrían solucionarse con un reintento. Por defecto, el proveedor de Terraform de OCI reintenta automáticamente dichas operaciones durante un máximo de 10 minutos. Para configurar aún más el comportamiento de reintento, se pueden especificar los siguientes campos en el bloque provider:

  • disable_auto_retries: para desactivar los reintentos automáticos para los errores recuperables.
  • retry_duration_seconds: duración mínima (en segundos) durante la cual reintentar una operación de recurso en respuesta a errores HTTP 429 y HTTP 500. La duración real del reintento puede ser ligeramente mayor debido al jitter de las operaciones de reintento. Este valor se ignora si el campo disable_auto_retries está definido en true.

Control de simultaneidad mediante jitter e inactividad de los intentos

Para aliviar la contención entre las operaciones paralelas en los servicios de OCI, el proveedor de Terraform de OCI planifica los reintentos valiéndose de la inactividad cuadrática y el jitter absoluto. La inactividad cuadrática aumenta el intervalo máximo entre los reintentos posteriores, mientras que el jitter absoluto selecciona al azar un intervalo de reintento dentro del rango de inactividad.

Por ejemplo, el tiempo de espera entre el primer y el segundo reintento se selecciona al azar entre 1 y 8 segundos. A continuación, el tiempo de espera entre el segundo y el tercer reintento se selecciona al azar entre 1 y 18 segundos. Independientemente del número de reintentos, el tiempo del intervalo de reintento se limita después del 12º intento a los 288 segundos.

Tenga en cuenta que el campo retry_duration_seconds solo afecta a la duración de los reintentos que se realizan en respuesta a errores HTTP 429 y 500, ya que estos errores es más probable que se solucionen tras una duración de reintento larga. Es poco probable que otros errores HTTP (como los 400, 401, 403, 404 y 409) se solucionen tras un reintento. El campo retry_duration_seconds no afecta al comportamiento de los reintentos ante dichos errores.

Problemas comunes

Nota

Consulte Problemas de etiquetado conocidos para obtener información sobre los problemas de etiquetas conocidos en relación con Terraform.

Los recursos se destruyen al aplicar cambios

Es posible que los recursos de OCI existentes se destruyan y se vuelvan a crear cuando las configuraciones de Terraform intenten actualizar una propiedad de un recurso que no se pueda actualizar. Terraform le advierte en los casos en los que los cambios destruirán un recurso. Ejecute siempre terraform plan antes de aplicar cambios para ver qué recursos se verán afectados. Consulte Cambios destructivos para obtener más información.

No se puede actualizar el recurso dependiente

A veces, una actualización de un recurso de OCI debe forzar que se destruya y se vuelva a crear el recurso, pero la dependencia de otro recurso en el recurso no permite la operación.

Por ejemplo, puede que desee realizar una actualización de un recurso oci_core_instance_configuration, pero un pool de instancias utiliza esa configuración de instancia. No se puede suprimir la configuración de instancia porque el pool de instancias hace referencia a ella en un argumento necesario.

Para solucionar este tipo de comportamiento, puede utilizar los metaargumentos lifecycle y create_before_destroy en el bloque de recursos.

En este ejemplo, Terraform crea un segundo recurso oci_core_instance_configuration que incluye las actualizaciones y, a continuación, asigna la nueva configuración de instancia al pool de instancias relacionado. Por último, Terraform destruye la configuración de instancia original. Por ejemplo:

resource "oci_core_instance_configuration" "test_instance_configuration" {
...

 lifecycle {
    create_before_destroy = true
  }
}

Consulte The lifecycle Meta-Argument y Cambios destructivos para obtener más información.

El recurso no se puede destruir ni actualizar

Puede evitar que se destruya un recurso de OCI incluyendo los metaargumentos lifecycle y prevent_destroy = true en el bloque de recursos del archivo de configuración de Terraform. La siguiente configuración, por ejemplo, da como resultado un cubo de Object Storage que no se puede destruir:

resource "oci_objectstorage_bucket" "test_bucket" {
  #Required
  compartment_id = var.tenancy
  name = "test"
  namespace = "exampleNamespace"

  lifecycle {
    prevent_destroy = true
  }
} 

Este metaargumento evita el uso de terraform destroy. Dado que determinadas actualizaciones de configuración requieren que se destruyan recursos para que puedan aplicarse, esta configuración puede hacer que algunas actualizaciones también sean imposibles de aplicar. En este ejemplo, name es una propiedad que no se puede actualizar sin destruir ni volver a crear el recurso. Por lo tanto, no puede actualizar el nombre del cubo sin eliminar o cambiar el metaargumento lifecycle.

Consulte el metaargumento lifecycle para obtener más información.

No se puede anular la definición del argumento de recurso

Muchos recursos de Oracle Cloud Infrastructure gestionados por el proveedor de Terraform de OCI aceptan argumentos de configuración opcionales. Una vez definidos, ya sea durante la creación del recurso o una actualización posterior, no se pueden anular la definición de estos argumentos mediante la transferencia de una cadena vacía o la eliminación del argumento de la configuración. Terraform ignora los intentos de anular la definición de estos argumentos.

La referencia completa de los recursos y orígenes de datos que soporta el proveedor de Terraform de OCI contiene detalles sobre el uso, los argumentos y los atributos. La referencia completa está disponible en docs.oracle.com y en Terraform Registry.

Los recursos y los orígenes de datos se agrupan por servicio en la referencia.

Referencia a disparadores en metaargumentos del ciclo de vida

Es posible que Terraform v0.14 y versiones posteriores requieran que sustituya las variables globales de los archivos de configuración por una combinación de variables locales y disparadores. Para hacer referencia a un disparador en los metaargumentos lifecycle y ignore_changes y evitar ejecutar la configuración en operaciones de aplicación de Terraform posteriores, haga referencia al disparador de la siguiente manera:

resource "null_resource" "exampleB" {
  depends_on = [null_resource.exampleA]
  triggers = {
    os_user = var.os_user
  }
  lifecycle {
    ignore_changes = [
      triggers["os_user"]
    ]
  }

No se puede suprimir el compartimento

Por defecto, el proveedor de Terraform no suprime un compartimento al utilizar el comando destroy.

Debe definir el argumento enable_delete en true para que el proveedor intente suprimir el compartimento. Por ejemplo:

resource "oci_identity_compartment" "test_compartment" {
    compartment_id = var.compartment_id
    description = var.compartment_description
    name = var.compartment_name

    enable_delete = true
}
Nota

Para destruir un compartimento, el compartimento también debe estar vacío. Utilice el argumento depends_on para asegurarse de que se definen todas las dependencias ocultas. Consulte Recursos para obtener más información.

Error "Operation Timeout"

Si la CLI de Terraform devuelve un mensaje de error como el siguiente:

Error: Operation Timeout
Provider version: <provider_version>, released on <release_date>. This provider is <n> updates behind to current. 
Service: <service>
Error Message: timeout while waiting for state to become 'SUCCEEDED, FAILED, CANCELED' (last state: 'IN_PROGRESS', timeout: 15m)

El servicio de OCI especificado está indicando que el recurso aún no ha alcanzado el estado esperado después de realizar un sondeo durante algún tiempo.

Es posible que tenga que aumentar el timeout de la operación para que el recurso pueda continuar con el sondeo durante más tiempo. Consulte la sección sobre los timeouts de operaciones para obtener más información sobre cómo hacerlo.

Error "Unexpected LifeCycle state"

Si la CLI de Terraform devuelve un mensaje de error como el siguiente:

Error: Unexpected LifeCycle state
Provider version: <provider_version>, released on <release_date>. This provider is <n> updates behind to current. 
Service: <service>
Error Message: During deletion, Terraform expected the resource to reach state: TERMINATED, but the service reported unexpected state: RUNNING.
Resource OCID: exampleuniqueID
Suggestion: Please retry or contact support for help with service: <service>

El servicio de OCI especificado ha detectado un error desconocido. Vuelva a intentarlo o póngase en contacto con los Servicios de Soporte en relación con ese servicio.

Incidencias de la CLI de Terraform

Esta sección contiene información sobre la instalación y la configuración de la CLI de Terraform.

Error "No such file" después de actualizar el proveedor de Terraform de OCI

Si la CLI de Terraform devuelve un mensaje de error como el siguiente:

Error asking for user input: 1 error(s) occurred:

* provider.oci: dial unix /var/folders/6r/8fk5dmbj4_z3sl0mc_y_fhjw0000gn/T/plugin811254328|netrpc: connect: no such file or directory

Es probable que esté utilizando una versión del proveedor de Terraform de OCI que no sea compatible con el binario de Terraform que ha instalado. Para las versiones del proveedor de OCI v3.x.x y posteriores, se necesita como mínimo la versión v.0.10.1 de Terraform.

Mensaje "TCP...i/o timeout" al conectarse mediante proxy

Si la CLI de Terraform devuelve un mensaje de error como el siguiente:

* provider.oci: ... dial tcp 134.70.16.0:443: i/o timeout

Es posible que no haya configurado correctamente los ajustes del proxy. El proveedor de Terraform de OCI soporta las variables http_proxy, https_proxy y no_proxy en las que las listas de inclusión o exclusión se pueden definir de la siguiente manera:

export http_proxy=http://www.your-proxy.com:80/
export https_proxy=http://www.your-proxy.com:80/
export no_proxy=localhost,127.0.0.1

Mensaje de error "x509: certificate signed by unknown authority"

Si la CLI de Terraform devuelve un mensaje de error como el siguiente:

Error: Get https://iaas.<region>.oraclecloud.com/20160918/services: x509: certificate signed by unknown authority
  on ../modules/network/modules/main/main.tf line 3...

Asegúrese de que Terraform está utilizando certificados TLS de confianza y de que la cadena de certificados es válida. Consulte el artículo sobre el fallo de las ejecuciones de Terraform con el error "x509: certificate signed by unknown authority" para obtener más información. Si utiliza MacOS Catalina, consulte la sección MacOS del documento para obtener más detalles sobre la resolución de problemas relacionados con certificados.

Mensaje de error "Outdated GPG key...unable to verify new provider releases"

Si la CLI de Terraform devuelve un mensaje de error como el siguiente:

Warning: registry.terraform.io: 
This version of Terraform has an outdated GPG key and is unable to verify new provider releases.
Please upgrade Terraform to at least <version> to receive new provider updates.
For details see: https://discuss.hashicorp.com/t/hcsec-2021-12-codecov-security-event-and-hashicorp-gpg-key-exposure/23512

Este mensaje significa que el registro de Terraform omite las versiones del proveedor de Terraform firmadas por una nueva clave de GPG. La CLI de Terraform instalará la última versión más reciente del proveedor de Terraform de OCI que pueda verificar correctamente, que podría no ser la versión más reciente.

Para eliminar este mensaje y asegurarse de que puede utilizar la versión más reciente del proveedor de Terraform de OCI, actualice la CLI de Terraform a la versión de mantenimiento más reciente disponible para la versión de Terraform principal que está utilizando. Por ejemplo, si utiliza Terraform v0.12.21, actualice a la versión más reciente disponible de v0.12.

Incidencias del proveedor de Terraform

Esta sección contiene información relacionada con la instalación y la configuración del proveedor de Terraform de OCI.

Error "NotAuthenticated" al utilizar módulos

Si utiliza módulos y la CLI de Terraform devuelve un mensaje de error como el siguiente:

Error: 401-NotAuthenticated, The required information to complete authentication was not provided or was incorrect.

Verifique que cada módulo declare sus propios requisitos de proveedor. Para obtener más información, consulte Proveedores dentro de módulos.

Error "NotAuthenticated" al utilizar Terraform

Si la CLI de Terraform devuelve un mensaje de error como el siguiente:

Error: 401-NotAuthenticated
Provider version: <provider_version>, released on <release_date>. This provider is <n> updates behind to current.
Service: <service>
Error Message: The required information to complete authentication was not provided or was incorrect.
OPC request ID: exampleuniqueID
Suggestion: Please retry or contact support for help with service: <service>
  • Verifique que ha definido correctamente user_ocid, tenancy_ocid, fingerprint y private_key_path.
  • Verifique que private_key_path apunta a la clave privada y no a la clave pública correspondiente.
  • Verifique que ha agregado la clave pública correspondiente a la cuenta de usuario especificada con user_ocid.
  • Verifique que los pares de claves públicas/privadas que está utilizando tienen el formato correcto. Consulte Claves necesarias para obtener detalles sobre el formato correcto y cómo generar claves.
  • Verifique que la cuenta de usuario forma parte de un grupo con los permisos adecuados para poder realizar las acciones del plan que está ejecutando.
  • Verifique que el arrendamiento se ha suscrito a la región a la que se dirige en el plan.
  • Si está utilizando módulos, verifique que cada módulo declare sus propios requisitos de proveedor. Para obtener más información, consulte Proveedores dentro de módulos.

Mensaje "Can not create client, bad configuration: did not find a proper configuration for tenancy" al utilizar alias

Si la CLI de Terraform devuelve un mensaje similar a este, podría indicar una incidencia con su entorno:

Error: can not create client, bad configuration: did not find a proper configuration for tenancy

Si la configuración del proveedor incluye un alias, los recursos deben especificar explícitamente el alias del proveedor mediante provider = "oci.alias_name". Si un recurso no utiliza el alias para especificar el proveedor, Terraform crea un proveedor por defecto para utilizarlo con dichos recursos. El proveedor por defecto carga los valores de configuración de las variables de entorno o del archivo ~/.oci/config. Estos valores pueden ser diferentes de los utilizados por el proveedor con alias y provocar el error de configuración.

Elimine el alias en la configuración del proveedor o asegúrese de que cada recurso especifique el proveedor por el alias adecuado. Obtenga más información sobre el uso de alias en la documentación oficial de Terraform y consulte Configuración del proveedor para obtener más información sobre cómo utiliza Terraform las variables de entorno y el archivo de configuración de OCI.

Mensaje de error "Field cannot be set"

Si la CLI de Terraform devuelve un mensaje de error como el siguiente:

* Error: "field_name": this field cannot be set

Probablemente esté utilizando una versión anterior del proveedor de Terraform de OCI y el campo que está intentando definir se publicase en una versión posterior. Utilice el siguiente comando para comprobar la versión del proveedor de Terraform.

terraform -version

La documentación del proveedor de Terraform de OCI refleja cuál es la última versión.

Mensaje de error "Could not get info about the first DbHome in the dbSystem" al importar db_home

Si a oci_database_db_system que se está importando le falta un db_home principal, se define un marcador de posición vacío para db_home en el archivo de estado de Terraform. Para mantener las configuraciones coherentes con el estado importado, agregue un marcador de posición vacío para db_home a la configuración. Por ejemplo:

# Add this placeholder into your oci_database_db_system configuration to indicate that the primary db home is empty. 
db_home {
 database { 
  admin_password = "" 
  } 
}

Mensaje de error "Failed to query available provider packages" al ejecutar la detección de recursos

Si la CLI de Terraform devuelve un mensaje de error como el siguiente cuando se utiliza la detección de recursos:

Failed to query available provider packages
 
Could not retrieve the list of available versions for provider hashicorp/oci:
the previously-selected version is no longer available

Puede asegurarse de que Terraform utilice un binario de proveedor local existente especificando su ubicación mediante la variable de entorno provider_bin_path. Por ejemplo:

export provider_bin_path=/Users/user/go/bin/

Terraform intenta descargar la versión más reciente del proveedor de Terraform de OCI cuando se utiliza la detección de recursos.

Etiquetas por defecto suprimidas al aplicar

A veces, el proveedor de Terraform de OCI puede suprimir inesperadamente los valores por defecto de etiqueta existentes de un recurso al ejecutar terraform apply. Esta incidencia afecta en particular a los valores por defecto de las etiquetas automáticas Oracle-Tags.

Para solucionar esta incidencia, puede agregar el atributo ignore_defined_tags al bloque del proveedor.

El atributo ignore_defined_tags permite mostrar las claves de las etiquetas definidas que Terraform ignorará como parte del plan o de la aplicación. El atributo ignore_defined_tags solo se puede especificar en el nivel de proveedor y tiene un tamaño máximo permitido de 100. Las etiquetas proporcionadas en este atributo se ignoran para todos los recursos de ese archivo de Terraform.

En el siguiente ejemplo, "Oracle-Tags.CreatedOn" y "Oracle-Tags.CreatedBy" son las claves de la asignación defined_tags asociada a un recurso remoto:

provider "oci" {
    ignore_defined_tags = ["Oracle-Tags.CreatedBy", "Oracle-Tags.CreatedOn"]
}

Para obtener más información, consulte Definiciones de proveedores y consulte la incidencia relacionada en GitHub.

Errores de API de servicio

Dado que el proveedor de Terraform interactúa con los servicios de OCI en su nombre, muchos mensajes de error que puede mostrar el proveedor de Terraform provienen directamente de los servicios de OCI. La referencia Errores de API muestra los errores comunes devueltos por todos los servicios.

Los mensajes de error de servicio devueltos por el proveedor de Terraform de OCI incluyen la siguiente información:

  • Error: estado de HTTP y códigos de error de API
  • Versión del proveedor: versión del proveedor de Terraform de OCI utilizada para realizar la solicitud.
  • Servicio: servicio de OCI que responde con el error
  • Mensaje de error: detalles relacionados con el error devuelto por el servicio
  • ID de solicitud de OCP: ID de solicitud
  • Sugerencia: siguientes pasos sugeridos

Por ejemplo:

Error: <http_code>-<api_error_code>
Provider version: <provider_version>, released on <release_date>. This provider is <n> updates behind to current. 
Service: <service>
Error Message: <error_message>
OPC request ID: exampleuniqueID
Suggestion: <next_steps>

En esta sección se detallan algunos de los errores de servicio devueltos con más frecuencia.

Error "400-InvalidParameter"

Si la CLI de Terraform devuelve un mensaje de error como el siguiente:

Error: 400-InvalidParameter
Provider version: <provider_version>, released on <release_date>. This provider is <n> updates behind to current. 
Service: <service>
Error Message: <error_message>
OPC request ID: exampleuniqueID
Suggestion: Please update the parameter(s) in the Terraform config as per error message: <error_message>

Actualice el parámetro especificado en el mensaje de error en la configuración de Terraform para el recurso.

Error "400-LimitExceeded"

Al utilizar Terraform, puede que se encuentre con errores que indiquen que ha alcanzado o superado los límites de servicio de un recurso. Por ejemplo:

Error: 400-LimitExceeded
Provider version: <provider_version>, released on <release_date>. This provider is <n> updates behind to current. 
Service: <service>
Error Message: Fulfilling this request exceeds the Oracle-defined limit for this tenancy for this resource type.
OPC request ID: exampleuniqueID
Suggestion: Request a service limit increase for this resource <service>

Para obtener más información sobre los límites de su servicio OCI y cómo solicitar un aumento del límite, consulte Límites de servicio.

Error "404-NotAuthorized"

Si la CLI de Terraform devuelve un mensaje de error como el siguiente:

Error: 404-NotAuthorizedOrNotFound
Provider version: <provider_version>, released on <release_date>. This provider is <n> updates behind to current.
Service: <service>
Error Message: Authorization failed or requested resource not found.
OPC request ID: exampleuniqueID
Suggestion: Either the resource has been deleted or service <service> need policy to access this resource. Policy reference: <link>

Verifique que la cuenta de usuario forma parte de un grupo con los permisos adecuados para poder realizar las acciones del plan que está ejecutando. Consulte la Referencia de política del servicio para obtener más información.

Error "500-InternalError"

Si la CLI de Terraform devuelve un mensaje de error como el siguiente:

Error: 500-InternalError
Provider version: <provider_version>, released on <release_date>. This provider is <n> updates behind to current. 
Service: <service>
Error Message: Internal error occurred
OPC request ID: exampleuniqueID
Suggestion: The service for this resource encountered an error. Please contact support for help with service <service>

El servicio ha respondido a la solicitud del proveedor de Terraform con un error interno. Si se pone en contacto con los Servicios de Soporte en relación con esta incidencia, haga referencia a la información del mensaje.