51
votes

Erreur "Adresse du fournisseur hérité non valide" sur Terraform

J'essaie de déployer un pipeline Bitbucket à l'aide de Terraform V0.14.3 pour créer des ressources dans Google Cloud. Après avoir exécuté la commande Terraform, le pipeline échoue avec cette erreur:

terraform {
  backend "gcs" {
    bucket      = "some-bucket"
    prefix      = "terraform/state"
    credentials = "key.json" #this is just a bitbucket pipeline variable
  }
  required_providers {
    google = {
      source  = "hashicorp/google"
      version = "~> 2.20.0"
    }
  }
}
provider "google" {
  project     = var.project_ID
  credentials = "key.json"
  region      = var.project_region
}

Nous avons mis à jour notre version locale de Terraform à V.0.13.0 puis exécutée: terraform 0.13upgrade comme référencé dans ce guide: https://www.terraform.io/upgrade-uides /0-13.html . Un fichier versions.tf a été généré nécessitant une version Terraform> = 0,13 et notre bloc de fournisseur requis ressemble maintenant à ceci:

Error: Invalid legacy provider address

This configuration or its associated state refers to the unqualified provider
"google".

You must complete the Terraform 0.13 upgrade process before upgrading to later
versions.

Nous obtenons toujours la même erreur lors de l'initiation du pipeline Bitbucket. Quelqu'un sait-il comment dépasser cette erreur? Merci d'avance.


0 commentaires

9 Réponses :


2
votes

Pendant que vous étiez sous TF13, avez-vous appliqué State au moins une fois pour le projet en cours d'exécution?

Selon les documents TF: https://www.terraform.io/ Guides de mise à niveau / 0-14.html

Il n'y a pas de commande de mise à jour automatique (séparément) dans 0,14 (comme il y en avait dans 0,13). La seule façon de mettre à niveau est de forcer l'état sur un projet au moins une fois, alors qu'il était sous commande lors du déplacement de TF13 à 14.

Vous pouvez également essayer terraform init dans le répertoire du projet.


2 commentaires

Merci, c'est un bon point et je n'ai pas lu la documentation assez étroitement initialement pour réaliser que l'application de l'état était nécessaire. Cependant, je suppose que cela signifierait que je devrais l'exécuter localement - ce qui n'est pas une bonne option dans ma situation ... en espérant qu'il pourrait y avoir un moyen de contourner cela.


Essayez de changer Hashicorp / Google (dans les fournisseurs de req) à Hashicorp / Terraform-Provider-Google. Je crois que c'est le nouveau lien source. De plus, vous devriez penser à mettre à jour sur Google 3.5 (le dernier versioning)



67
votes

Solution

Si vous utilisez une version plus récente de Terraform, telle que v0.14.x , vous devriez:

  1. Utilisez le Replace-Provider sous-commande

    terraform init
    
    #=>
    
    Initializing the backend...
    
    Initializing provider plugins...
    - Reusing previous version of hashicorp/google from the dependency lock file
    - Using previously-installed hashicorp/google vx.xx.x
    
    Terraform has been successfully initialized!
    
    You may now begin working with Terraform. Try . . .
    
  2. Initialisez à nouveau Terraform:

    terraform state replace-provider \
    -auto-approve \
    "registry.terraform.io/-/google" \
    "hashicorp/google"
    
    #=>
    
    Terraform will perform the following actions:
    
      ~ Updating provider:
        - registry.terraform.io/-/google
        + registry.terraform.io/hashicorp/google
    
    Changing x resources:
    
      . . .
    
    Successfully replaced provider for x resources.
    
  3. Explication

    terraform ne prend en charge que les mises à niveau d'une mise à niveau principale de fonctionnalités à la fois. Votre fichier d'État plus ancien a été, plus que probablement, créé à l'aide d'une version plus tôt que v0.13.x .

    Si vous n'avez pas exécuté le Appliquer Commande Avant de mettre à niveau votre version Terraform, vous pouvez vous attendre à cette erreur: la mise à niveau de v0.13.x vers v0.14.x était pas complet.

    Vous pouvez trouver plus d'informations ici .


1 commentaires

Hey @ laura-h! Si cette réponse a résolu votre question, veuillez envisager de l'accepter en cliquant sur la marque de contrôle. Cela indique à la communauté au sens large que vous avez trouvé une solution et que vous donnez une certaine réputation au répondeur et à vous-même.



0
votes

Nous avons rencontré un problème similaire dans nos environnements opérationnels aujourd'hui. Nous avons terminé avec succès la commande terraform 0.13upgrade . Cela a en effet introduit un fichier versions.tf .

Cependant, effectuer une Terraform init avec cette configuration n'était toujours pas possible, et l'erreur suivante est apparue: p >

terraform state replace-provider "registry.terraform.io/-/google" "hashicorp/google"

Une enquête plus approfondie dans le fichier d'état a révélé que, pour certaines ressources, le bloc du fournisseur était pas mis à jour. Nous avons donc dû exécuter la commande suivante pour finaliser le processus de mise à niveau.

Error: Invalid legacy provider address

Modifier Le déploiement dans l'environnement suivant a révélé que cela a été causé par des ressources conditionnelles. Pour activer / désactiver facilement certaines ressources, nous tirons parti de l'attribut compter et utilisons 0 ou 1. Pour les ressources avec count = 0 , qui étaient inchangées avec Terraform 0.13, le fournisseur n'a pas été mis à jour.


0 commentaires

28
votes

Dans notre cas, nous étions sur AWS et avons eu une erreur similaire xxx

Les étapes à résoudre devaient s'assurer que la syntaxe a été mise à niveau en exécutant Terraform init , en vérifiant à nouveau Les avertissements et enfin mis à jour le fichier d'état avec la méthode suivante.

# update provider in state file
terraform state replace-provider -- -/aws hashicorp/aws

# reinit
terraform init

Spécifique du problème OPS, si le problème se produit toujours, vérifiez l'accès à l'emplacement du seau à partir du local et du pipeline. Vérifiez également la version de Terraform en cours d'exécution dans le pipeline. Selon la configuration, il peut s'agir que le fichier d'état distant est / peut être mis à jour.


1 commentaires

J'ai rencontré le même problème avec AWS. La solution @MirageGlobe a fonctionné.



2
votes

Mon cas était comme celui-ci

Terraform will perform the following actions:

  ~ Updating provider:
    - registry.terraform.io/-/openstack
    + registry.terraform.io/terraform-provider-openstack/openstack

Changing 11 resources:

  openstack_compute_servergroup_v2.kubernetes_master
  openstack_networking_network_v2.kube_router
  openstack_compute_instance_v2.kubernetes_worker
  openstack_networking_subnet_v2.internal
  openstack_networking_subnet_v2.kube_router
  data.openstack_networking_network_v2.external_network
  openstack_compute_instance_v2.kubernetes_etcd
  openstack_networking_router_interface_v2.internal
  openstack_networking_router_v2.internal
  openstack_compute_instance_v2.kubernetes_master
  openstack_networking_network_v2.internal

Do you want to make these changes?
Only 'yes' will be accepted to continue.

Enter a value: yes

Successfully replaced provider for 11 resources.

pour résoudre le problème

terraform state replace-provider -- -/openstack terraform-provider-openstack/openstack

La commande suivante

remove the .terraform folder

Après cette commande, vous verrez l'impression ci-dessous, entrez oui

Error: Invalid legacy provider address

This configuration or its associated state refers to the unqualified provider
"openstack".

You must complete the Terraform 0.13 upgrade process before upgrading to later
versions.


0 commentaires

3
votes

Pour ajouter, j'avais installé Terraform 0.14.6 mais l'état semblait être coincé dans 0,12. Dans mon cas, j'avais 3 références qui étaient désactivées, cet article m'a aidé à identifier lesquels (toutes les entrées des "fournisseurs requis par l'État" qui avaient un - dans le lien. https://github.com/hashicorp/terraform/issues/27615 Je l'ai corrigé en exécutant la commande Remplace-Provider pour chaque entrée qui était désactivée, puis en exécutant Terraform init. Je note de le faire et d'exécuter un diff git, le tfState a été mis à jour et utilise désormais 0.14.x terraform au lieu de mon 0.12.x précédent. c'est-à-dire

terraform providers

terraform state replace-provider registry.terraform.io/-/azurerm registry.terraform.io/hashicorp/azurerm 


2 commentaires

Gérer les fournisseurs de terraforms, vous pouvez voir lequel fait le conflit. Merci!


Une explication de ce qu'il faut rechercher dans la sortie des fournisseurs Terraform serait utile.



15
votes

Même problème pour moi. J'ai couru:

terraform state replace-provider registry.terraform.io/-/google registry.terraform.io/hashicorp/google

qui m'a donné:

Providers required by configuration:
registry.terraform.io/hashicorp/google

Providers required by state:
registry.terraform.io/-/google


0 commentaires

3
votes

Explication : Votre projet TerraForm contient tf.state fichier qui est obsolète et arbitrant à l'ancienne adresse du fournisseur. Le message d'erreur présentera cette erreur:

  ~ Updating provider:
    - registry.terraform.io/-/aws
    + registry.terraform.io/hashicorp/aws

solution : Afin de résoudre ce problème, vous devez modifier le tf. État références à Link vers les nouveaux fournisseurs requis, mettez à jour le fichier tf.state et initialisez à nouveau le projet. Les étapes sont:

  1. Créer / modifier le bloc les fournisseurs obligatoires avec le nom et la version pertinents, je préfère le faire sur versions.tf Fichier.
  2. Exemple:

    terraform state replace-provider registry.terraform.io/-/aws registry.terraform.io/hashicorp/aws
    
    1. Exécuter Commande TerraForm Providers pour présenter les fournisseurs requis de la configuration par rapport aux fournisseurs requis qui ont enregistré à l'état.
    2. Exemple:

         Providers required by configuration:
      .
      ├── provider[registry.terraform.io/hashicorp/aws] >= 3.35.0
      
      Providers required by state:
      
          provider[registry.terraform.io/-/aws]
      
      1. Communiquez et réaffectez l'adresse source du fournisseur requise dans l'état Terraform (en utilisant la commande TerraForm State Remplace-Provider ) afin que nous puissions dire à Terraform comment interpréter le fournisseur hérité.
      2. La sous-commande Terraform State Remplace-Provider permet de réaffecter Adresses de source du fournisseur enregistrées dans l'État de Terraform, et donc nous Peut utiliser cette commande pour dire à Terraform comment réinterpréter le "héritage" les adresses du fournisseur comme des fournisseurs correctement conformes à des noms qui correspondent avec la source du fournisseur adresse dans la configuration.

        AVERTISSE Les sous-commandes d'État Terraform créeront un nouvel instantané d'État et Écrivez-le dans le backend configuré. Une fois que la commande a réussi le Le dernier instantané d'État utilisera la syntaxe que Terraform v0.12 ne peut pas Comprenez, donc vous ne devriez effectuer cette étape que lorsque vous êtes prêt à Mettez en scène en permanence vers Terraform v0.13.

        Exemple:

        terraform {
          required_version = ">= 0.14"
          required_providers {
            aws = {
                  source  = "hashicorp/aws"
                  version = ">= 3.35.0"
                }
              }
            }
        


1 commentaires

Le Terraform State Replace-Provider Registry.terraform.io/-/aws registry.terraform.io/hashicorp/aws l'a corrigé pour moi avec le fournisseur AWS - thnx



1
votes

J'ai récemment rencontré cela en utilisant Terraform Cloud pour le backend distant. Nous avions des espaces de travail liés à l'AWS plus anciens définis sur la version 0.12.4 (dans le cloud) qui se sont trompés avec "l'adresse du fournisseur hérité non valide" et refusé d'exécuter avec le dernier client Terraform 1.1.8.

J'ajoute ma réponse Parce que c'est beaucoup plus simple que les autres réponses. Nous n'avons fait aucun des éléments suivants:

  terraform providers
  terraform 0.13upgrade  
  remove the .terraform folder
  terraform state replace-provider 

Au lieu de cela, nous sommes simplement:

  1. Dans un dossier propre (aucun état local, en utilisant la version locale Terraform.exe 0.13.7) a géré 'Terraform init'
  2. a effectué un petit changement insignifiant (pour s'assurer que s'appliquer écrivait un état) à un fichier .tf dans l'espace de travail
  3. Dans Terraform Cloud, définissez la version de l'espace de travail sur 0.13.7
  4. Utilisation de 0.13.7 Terraform.exe Ran Local Appliquer - qui a sauvé un nouvel état.
  5. Maintenant, nous pouvons utiliser le cloud et le terraform local.exe version 1.1.8 et plus de problèmes.
  6. Notez que nous avions également besoin de mettre à jour quelques ressources liées à l'AWS S3 à la nouvelle syntaxe du fournisseur AWS pour que tous nos espaces de travail fonctionnent avec le dernier fournisseur.


0 commentaires