Dépannage du fournisseur Terraform

Cette rubrique explique comment résoudre les problèmes courants du fournisseur Oracle Cloud Infrastructure (OCI) Terraform.

Commencez par les notions de dépannage de base, puis reportez-vous aux sections suivantes :

Notions de dépannage de base

Lors du dépannage du fournisseur Oracle Cloud Infrastructure (OCI) Terraform ou de l'obtention d'une assistance, il est souvent utile de commencer par vérifier le statut des services OCI, et la version de Terraform et du fournisseur, ainsi que d'activer et de collecter la journalisation en mode verbose.

Conseil

La vérification du statut de service et de la sortie de journal en mode verbose peut vous aider à déterminer si le problème est lié au fournisseur Terraform ou au service OCI que le fournisseur utilise.

Reportez-vous à la liste des problèmes courants une fois que vous avez examiné les notions de base.

Vérification des coupures et du statut du service OCI

Pour vérifier le statut le plus récent et savoir si des coupures sont en cours dans OCI, reportez-vous au statut d'OCI.

Vérification des versions de Terraform et du fournisseur OCI Terraform

Pour vérifier la version de Terraform et du fournisseur OCI Terraform, initialisez Terraform à partir d'un répertoire contenant vos configurations, puis exécutez la commande -version. Par exemple :

terraform init
terraform -version

Les versions sont affichées :

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

Les versions plus récentes du fournisseur OCI Terraform indiquent la version du fournisseur dans les messages d'erreur.

La documentation du fournisseur OCI Terraform reflète la dernière version. Vous pouvez consulter la documentation des versions antérieures du fournisseur en accédant à la référence HashiCorp et en sélectionnant une version spécifique. Vous pouvez également télécharger et installer une version spécifique du fournisseur.

Journalisation en mode verbose pour le fournisseur OCI Terraform

Pour obtenir la sortie de la console en mode verbose lorsque le fournisseur est en cours d'exécution, précédez votre commande Terraform des indicateurs TF_LOG et OCI_GO_SDK_DEBUG. Par exemple :

TF_LOG=DEBUG OCI_GO_SDK_DEBUG=v terraform plan

Les indicateurs TF_LOG (niveau) et OCI_GO_SDK_DEBUG peuvent également être définis en tant que variables d'environnement.

Nouvelles tentatives automatiques

Lors de l'application, de l'actualisation ou de la destruction d'un plan, Terraform peut rencontrer des erreurs OCI intermittentes (telles que les erreurs 429 ou 500) qui pourraient disparaître lors d'une nouvelle tentative. Par défaut, le fournisseur OCI Terraform réessaie automatiquement ces opérations pendant 10 minutes au maximum. Les champs suivants peuvent être spécifiés dans le bloc provider pour configurer davantage le comportement des nouvelles tentatives :

  • disable_auto_retries : désactive les nouvelles tentatives automatiques pour les erreurs qui s'y prêtent.
  • retry_duration_seconds : durée minimale (en secondes) pour réessayer une opération de ressource en réponse aux erreurs HTTP 429 et HTTP 500. La durée réelle pour les nouvelles tentatives peut être légèrement supérieure en raison de la gigue des nouvelles tentatives. Cette valeur est ignorée si le champ disable_auto_retries est défini sur true.

Contrôle d'accès simultané à l'aide de l'attente entre les nouvelles tentatives et de la gigue

Pour atténuer les conflits entre les opérations parallèles sur les services OCI, le fournisseur OCI Terraform programme les nouvelles tentatives à l'aide de l'attente quadratique et de la gigue complète. L'attente quadratique augmente l'intervalle maximal entre les nouvelles tentatives, tandis que la gigue complète sélectionne aléatoirement un intervalle de tentatives dans la plage d'attente.

Par exemple, le temps d'attente entre la première et la deuxième tentative est choisi au hasard entre 1 et 8 secondes. Le temps d'attente entre la deuxième et la troisième tentative est choisi au hasard entre 1 et 18 secondes. Indépendamment du nombre de tentatives, l'intervalle entre deux tentatives est plafonné à 288 secondes après la 12e tentative.

Le champ retry_duration_seconds affecte uniquement la durée de la tentative en réponse aux erreurs HTTP 429 et 500, car ces erreurs sont plus susceptibles de disparaître après une tentative de longue durée. Il est peu probable que d'autres erreurs HTTP (telles que les erreurs 400, 401, 403, 404 et 409) disparaissent après une nouvelle tentative. Le champ retry_duration_seconds n'affecte pas le comportement des nouvelles tentatives pour ces erreurs.

Problèmes courants

Remarque

Pour accéder à un problème connu relatif aux balises en lien avec Terraform, reportez-vous à Problèmes connus pour Tagging.

Ressources détruites lors de l'application des modifications

Les ressources OCI existantes peuvent être détruites et recréées lorsque les configurations Terraform tentent de mettre à jour une propriété de ressource qui ne peut pas l'être. Terraform vous avertit lorsque les modifications vont détruire une ressource. Exécutez toujours terraform plan avant d'appliquer des modifications pour déterminer les ressources concernées. Pour plus d'informations, reportez-vous à Modifications destructives.

La ressource dépendante ne peut pas être mise à jour

Parfois, la mise à jour d'une ressource OCI requiert de la détruire et de la recréer, mais une ressource dépendante empêche cette opération.

Par exemple, vous souhaitez mettre à jour une ressource oci_core_instance_configuration, mais un pool d'instances utilise cette configuration d'instance. La configuration d'instance ne peut pas être supprimée car le pool d'instances la référence dans un argument requis.

Pour contourner ce type de comportement, vous pouvez utiliser les méta-arguments lifecycle et create_before_destroy dans le bloc de ressource.

Dans cet exemple, Terraform crée une seconde ressource oci_core_instance_configuration qui inclut vos mises à jour, puis affecte la nouvelle configuration d'instance au pool d'instances associé. Terraform détruit ensuite la configuration d'instance d'origine. Par exemple :

resource "oci_core_instance_configuration" "test_instance_configuration" {
...

 lifecycle {
    create_before_destroy = true
  }
}

Pour plus d'informations, reportez-vous à Méta-argument lifecycle et à Modifications destructives.

Impossible de détruire ou de mettre à jour la ressource

Vous pouvez empêcher la destruction d'une ressource OCI en incluant les méta-arguments lifecycle et prevent_destroy = true dans le bloc de ressource de votre fichier de configuration Terraform. Par exemple, la configuration suivante génère un bucket Object Storage qui ne peut pas être détruit :

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

  lifecycle {
    prevent_destroy = true
  }
} 

Ce méta-argument empêche l'utilisation de terraform destroy. Etant donné que certaines mises à jour de configuration nécessitent la destruction de ressources avant leur application, ce paramètre peut également rendre certaines mises à jour impossibles à appliquer. Dans cet exemple, name est une propriété qui ne peut pas être mise à jour sans détruire et recréer la ressource. Par conséquent, vous ne pouvez pas mettre à jour le nom du bucket sans enlever ou modifier le méta-argument lifecycle.

Pour plus d'informations, reportez-vous à Méta-argument lifecycle.

Impossible d'annuler la définition de l'argument de ressource

De nombreuses ressources Oracle Cloud Infrastructure gérées par le fournisseur OCI Terraform acceptent des arguments de configuration facultatifs. Une fois ces arguments définis, que ce soit lors de la création d'une ressource ou lors d'une mise à jour ultérieure, leur définition ne peut pas être annulée en transmettant une chaîne vide ou en enlevant l'argument de la configuration. Les tentatives d'annulation de la définition de ces arguments sont ignorées par Terraform.

La référence complète des ressources et sources de données prises en charge par le fournisseur OCI Terraform contient les détails relatifs à la syntaxe, aux arguments et aux attributs. La référence complète est disponible à l'adresse docs.oracle.com et dans le registre Terraform.

Les sources de données et les ressources sont regroupées par service dans la référence.

Référencement de déclencheurs dans les méta-arguments de cycle de vie

Terraform version 0.14 et versions ultérieures peuvent nécessiter le remplacement des variables globales dans vos fichiers de configuration par une combinaison de variables locales et de déclencheurs. Pour référencer un déclencheur dans les méta-arguments lifecycle et ignore_changes, et éviter d'exécuter la configuration sur les opérations d'application Terraform ultérieures, référencez le déclencheur comme suit :

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

Impossible de supprimer le compartiment

Par défaut, le fournisseur Terraform ne supprime pas de compartiment lors de l'utilisation de la commande destroy.

Vous devez définir l'argument enable_delete sur true pour que le fournisseur tente de supprimer le compartiment. Par exemple :

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

    enable_delete = true
}
Remarque

Pour détruire un compartiment, ce dernier doit également être vide. Utilisez l'argument depends_on pour vérifier si des dépendances masquées sont définies. Pour plus d'informations, reportez-vous à Ressources.

Erreur "Operation Timeout"

Si l'interface de ligne de commande Terraform renvoie un message d'erreur tel que le suivant :

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)

Le service OCI spécifié indique que la ressource n'a pas encore atteint l'état attendu après interrogation pendant un certain temps.

Vous devrez peut-être augmenter le délai d'expiration de l'opération pour que votre ressource poursuive l'interrogation plus longtemps. Pour plus d'informations sur la procédure à suivre, reportez-vous à Délais d'expiration d'opération.

Erreur "Unexpected LifeCycle state"

Si l'interface de ligne de commande Terraform renvoie un message d'erreur tel que le suivant :

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>

Le service OCI spécifié a rencontré une erreur inconnue. Réessayez ou contactez le support technique concernant ce service.

Problèmes avec l'interface de ligne de commande Terraform

Cette section contient des informations concernant l'installation et la configuration de l'interface de ligne de commande Terraform.

Erreur "No such file" après la mise à niveau du fournisseur OCI Terraform

Si l'interface de ligne de commande Terraform renvoie un message d'erreur tel que le suivant :

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

Vous utilisez probablement une version du fournisseur OCI Terraform incompatible avec le fichier binaire Terraform que vous avez installé. Pour les versions v3.x.x et ultérieures du fournisseur OCI, la version minimale requise de Terraform est v.0.10.1.

Message "TCP...i/o timeout" en cas de connexion via proxy

Si l'interface de ligne de commande Terraform renvoie un message d'erreur tel que le suivant :

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

Il se peut que vous n'ayez pas configuré correctement vos paramètres de proxy. Le fournisseur OCI Terraform prend en charge les variables http_proxy, https_proxy et no_proxy dans lesquelles des listes d'inclusion ou d'exclusion peuvent être définies comme suit :

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

Message d'erreur "x509: certificate signed by unknown authority"

Si l'interface de ligne de commande Terraform renvoie un message d'erreur tel que le suivant :

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

Assurez-vous que Terraform utilise des certificats TLS sécurisés et que la chaîne de certificat est valide. Pour plus d'informations, reportez-vous à Echec des exécutions de Terraform avec l'erreur "x509: certificate signed by unknown authority". Si vous utilisez MacOS Catalina, reportez-vous à la section MacOS du document pour plus de détails spécifiques sur la résolution des problèmes de certificat.

Message d'erreur "Outdated GPG key...unable to verify new provider releases"

Si l'interface de ligne de commande Terraform renvoie un message d'erreur tel que le suivant :

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

Ce message signifie que le registre Terraform omet les versions du fournisseur Terraform signées par une nouvelle clé GPG. L'interface de ligne de commande Terraform installe la dernière version du fournisseur OCI Terraform qu'il peut vérifier, ce qui peut ne pas être la toute dernière version.

Pour enlever ce message et vous assurer que vous pouvez utiliser la dernière version du fournisseur OCI Terraform, mettez à niveau l'interface de ligne de commande Terraform vers la dernière version de maintenance disponible pour la version majeure de Terraform que vous utilisez. Par exemple, si vous utilisez Terraform version 0.12.21, effectuez une mise à niveau vers la dernière version disponible de version 0.12.

Problèmes avec le fournisseur Terraform

Cette section contient des informations concernant l'installation et la configuration du fournisseur OCI Terraform.

Erreur "NotAuthenticated" lors de l'utilisation de modules

Si vous utilisez des modules et que l'interface de ligne de commande Terraform renvoie un message d'erreur semblable au suivant :

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

Vérifiez que chaque module déclare ses propres exigences de fournisseur. Pour plus d'informations, reportez-vous à Fournisseurs dans les modules.

Erreur "NotAuthenticated" lors de l'utilisation de Terraform

Si l'interface de ligne de commande Terraform renvoie un message d'erreur tel que le suivant :

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>
  • Vérifiez que user_ocid, tenancy_ocid, fingerprint et private_key_path sont correctement définis.
  • Vérifiez que private_key_path pointe vers votre clé privée et non vers la clé publique correspondante.
  • Vérifiez que vous avez ajouté la clé publique correspondante au compte utilisateur indiqué avec user_ocid.
  • Vérifiez que le format des paires de clés publique/privée que vous utilisez est correct. Pour plus de détails sur le format correct et sur la génération des clés, reportez-vous à Clés requises.
  • Vérifiez que le compte utilisateur fait partie d'un groupe disposant des droits d'accès appropriés pour effectuer les actions du plan que vous exécutez.
  • Vérifiez que votre location est abonnée à la région que vous ciblez dans votre plan.
  • Si vous utilisez des modules, vérifiez que chaque module déclare ses propres exigences de fournisseur. Pour plus d'informations, reportez-vous à Fournisseurs dans les modules.

Message "Can not create client, bad configuration: did not find a proper configuration for tenancy" lors de l'utilisation d'alias

Si l'interface de ligne de commande Terraform renvoie un message de ce type, cela peut indiquer un problème avec votre environnement :

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

Si votre configuration de fournisseur inclut un alias, vos ressources doivent spécifier explicitement l'alias de fournisseur à l'aide de provider = "oci.alias_name". Si une ressource n'utilise pas l'alias pour indiquer le fournisseur, Terraform crée un fournisseur par défaut à employer avec ce type de ressource. Le fournisseur par défaut charge les valeurs de configuration à partir des variables d'environnement ou du fichier ~/.oci/config. Ces valeurs peuvent être différentes de celles utilisées par votre fournisseur avec alias et provoquer l'erreur de configuration.

Enlevez l'alias dans la configuration du fournisseur ou assurez-vous que chaque ressource indique le fournisseur via l'alias correct. Pour plus d'informations sur l'utilisation de alias, reportez-vous à la documentation Terraform officielle, et pour plus d'informations sur la façon dont Terraform utilise les variables d'environnement et le fichier de configuration OCI, reportez-vous à Configuration du fournisseur.

Message d'erreur "Field cannot be set"

Si l'interface de ligne de commande Terraform renvoie un message d'erreur tel que le suivant :

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

Vous utilisez probablement une ancienne version du fournisseur OCI Terraform et le champ que vous essayez de définir a été publié dans une version ultérieure. Utilisez la commande suivante pour vérifier la version de votre fournisseur Terraform.

terraform -version

La documentation du fournisseur OCI Terraform reflète la dernière version.

Message d'erreur "Could not get info about the first DbHome in the dbSystem" lors de l'import de db_home

Si oci_database_db_system en cours d'import ne comporte aucun élément db_home principal, un espace réservé vide est défini pour db_home dans le fichier d'état Terraform. Pour que les configurations restent cohérentes avec l'état importé, ajoutez un espace réservé vide pour db_home à votre configuration. Par exemple :

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

Message d'erreur "Failed to query available provider packages" lors de l'exécution du repérage des ressources

Si l'interface de ligne de commande Terraform renvoie un message d'erreur semblable au suivant lorsque vous utilisez le repérage de ressources :

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

Vous pouvez vous assurer que Terraform utilise un fichier binaire de fournisseur local existant en indiquant son emplacement à l'aide de la variable d'environnement provider_bin_path. Par exemple :

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

Terraform tente de télécharger la dernière version du fournisseur OCI Terraform lorsque vous utilisez le repérage des ressources.

Balises par défaut supprimées lors de l'application

Parfois, le fournisseur OCI Terraform peut supprimer de manière inattendue les valeurs par défaut de balise existantes d'une ressource lors de l'exécution de terraform apply. Ce problème affecte particulièrement les valeurs par défaut des balises automatiques Oracle-Tags.

Pour contourner ce problème, vous pouvez ajouter l'attribut ignore_defined_tags au bloc fournisseur.

L'attribut ignore_defined_tags vous permet de répertorier les clés des balises définies que Terraform doit ignorer lors d'une exécution plan ou apply. L'attribut ignore_defined_tags peut uniquement être spécifié au niveau du fournisseur. La taille maximale autorisée est 100. Les balises indiquées dans l'attribut sont ignorées pour toutes les ressources du fichier Terraform.

Dans l'exemple suivant, "Oracle-Tags.CreatedOn" et "Oracle-Tags.CreatedBy" sont les clés de la correspondance defined_tags associée à une ressource distante :

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

Pour plus d'informations, reportez-vous à Définitions de fournisseur et au problème associé sur GitHub.

Erreurs d'API de service

Etant donné que le fournisseur Terraform interagit avec les services OCI en votre nom, de nombreux messages d'erreur présentés par le fournisseur Terraform proviennent directement des services OCI. La référence Erreurs d'API répertorie les erreurs courantes renvoyées par tous les services.

Les messages d'erreur de service renvoyés par le fournisseur OCI Terraform incluent les informations suivantes :

  • Erreur : codes de statut HTTP et d'erreur d'API
  • Version du fournisseur : version du fournisseur OCI Terraform utilisée pour effectuer la demande
  • Service : service OCI qui répond avec l'erreur
  • Message d'erreur : détails concernant l'erreur renvoyée par le service
  • ID de demande OPC : ID de la demande
  • Suggestion : étapes suivantes suggérées

Par exemple :

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>

Cette section détaille quelques-unes des erreurs de service les plus fréquemment renvoyées.

Erreur "400-InvalidParameter"

Si l'interface de ligne de commande Terraform renvoie un message d'erreur tel que le suivant :

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>

Mettez à jour le paramètre spécifié dans le message d'erreur dans la configuration Terraform pour la ressource.

Erreur "400-LimitExceeded"

Lors de l'utilisation de Terraform, vous pouvez rencontrer des erreurs indiquant que vous avez atteint ou dépassé les limites de service d'une ressource. Par exemple :

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>

Pour en savoir plus sur vos limites de service OCI et sur la procédure pour demander une augmentation de limite, reportez-vous à Limites de service.

Erreur "404-NotAuthorized"

Si l'interface de ligne de commande Terraform renvoie un message d'erreur tel que le suivant :

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>

Vérifiez que le compte utilisateur fait partie d'un groupe disposant des droits d'accès appropriés pour effectuer les actions du plan que vous exécutez. Pour plus d'informations, reportez-vous à la référence de stratégie pour votre service.

Erreur "500-InternalError"

Si l'interface de ligne de commande Terraform renvoie un message d'erreur tel que le suivant :

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>

Le service a répondu à la demande du fournisseur Terraform avec une erreur interne. Si vous contactez le support technique pour ce problème, fournissez les informations contenues dans le message.