3
votes

Passer de terraform 0.12.6 à 0.13.0 me donne le fournisseur ["registry.terraform.io / - / null"] est requis, mais il a été supprimé

Je gère l'état dans un terraform-cloud distant

J'ai téléchargé et installé la dernière CLI terraform 0.13

Ensuite, j'ai supprimé le .terraform .

Ensuite, j'ai exécuté terraform init et je n'ai eu aucune erreur

alors j'ai fait

###################################################################################
# EKS CLUSTER                                                                     #
#                                                                                 #
# This module contains configuration for EKS cluster running various applications #
###################################################################################

module "eks_label" {
  source      = "git::https://github.com/cloudposse/terraform-null-label.git?ref=master"
  namespace   = var.project
  environment = var.environment
  attributes  = [var.component]
  name        = "eks"
}


#
# Local computed variables
#
locals {
  names = {
    secretmanage_policy = "secretmanager-${var.environment}-policy"
  }
}

data "aws_eks_cluster" "cluster" {
  name = module.eks-cluster.cluster_id
}

data "aws_eks_cluster_auth" "cluster" {
  name = module.eks-cluster.cluster_id
}

provider "kubernetes" {
  host                   = data.aws_eks_cluster.cluster.endpoint
  cluster_ca_certificate = base64decode(data.aws_eks_cluster.cluster.certificate_authority.0.data)
  token                  = data.aws_eks_cluster_auth.cluster.token
  load_config_file       = false
  version                = "~> 1.9"
}

module "eks-cluster" {
  source          = "terraform-aws-modules/eks/aws"
  cluster_name    = module.eks_label.id
  cluster_version = var.cluster_version
  subnets         = var.subnets
  vpc_id          = var.vpc_id

  worker_groups = [
    {
      instance_type = var.cluster_node_type
      asg_max_size  = var.cluster_node_count
    }
  ]

  tags = var.tags
}

# Grant secretmanager access to all pods inside kubernetes cluster
# TODO:
# Adjust implementation so that the policy is template based and we only allow
# kubernetes access to a single key based on the environment.
# we should export key from modules/secrets and then grant only specific ARN access
# so that only production cluster is able to read production secrets but not dev or staging
# https://docs.aws.amazon.com/secretsmanager/latest/userguide/auth-and-access_identity-based-policies.html#permissions_grant-get-secret-value-to-one-secret
resource "aws_iam_policy" "secretmanager-policy" {
  name        = local.names.secretmanage_policy
  description = "allow to read secretmanager secrets ${var.environment}"
  policy      = file("modules/kubernetes/policies/secretmanager.json")
}

#
# Attache the policy to k8s worker role
#
resource "aws_iam_role_policy_attachment" "attach" {
  role       = module.eks-cluster.worker_iam_role_name
  policy_arn = aws_iam_policy.secretmanager-policy.arn
}

#
# Attache the S3 Policy to Workers
# So we can use aws commands inside pods easily if/when needed
#
resource "aws_iam_role_policy_attachment" "attach-s3" {
  role       = module.eks-cluster.worker_iam_role_name
  policy_arn = "arn:aws:iam::aws:policy/AmazonS3FullAccess"
}

C'est le contenu du module / kubernetes / main.tf

➜ terraform apply -var-file env.auto.tfvars

Error: Provider configuration not present

To work with
module.kubernetes.module.eks-cluster.data.null_data_source.node_groups[0] its
original provider configuration at provider["registry.terraform.io/-/null"] is
required, but it has been removed. This occurs when a provider configuration
is removed while objects created by that provider still exist in the state.
Re-add the provider configuration to destroy
module.kubernetes.module.eks-cluster.data.null_data_source.node_groups[0],
after which you can remove the provider configuration again.

Releasing state lock. This may take a few moments...


0 commentaires

3 Réponses :


0
votes

Cette erreur survient lorsqu'il y a un objet dans le dernier état de Terraform qui n'est plus dans la configuration mais que Terraform ne peut pas le détruire (comme on s'y attendrait normalement) car la configuration du fournisseur pour le faire n'est pas non plus présente.

Solution:

Cela ne devrait se produire que si vous avez récemment supprimé l'objet "data.null_data_source" avec le bloc fournisseur "null". Pour cela, you'll need to temporarily restore that provider "null" block , exécutez terraform apply pour que Terraform destroy object data "null_data_source" , puis vous pouvez supprimer le bloc fournisseur "null" car il ne sera plus nécessaire .


2 commentaires

Naveen mais je n'ai eu aucun changement de code - comment ce fournisseur a-t-il été manqué?


C'est étrange. Peut-être pouvez-vous essayer d'ajouter un bloc nul de fournisseur et tester s'il fonctionne correctement



6
votes

Tous les crédits pour ce correctif vont à celui qui le mentionne sur le canal cloudposse slack:

terraform state replace-provider -auto-approve - - / null registry.terraform.io/hashicorp/null

Cela a résolu mon problème avec cette erreur, à l'erreur suivante. Tout pour mettre à jour une version sur terraform.


1 commentaires

Il faut s'y attendre, étant donné que Terraform est toujours en version 0.xy



1
votes

Pour nous, nous avons mis à jour toutes les URL des fournisseurs que nous utilisions dans le code comme ci-dessous:

terraform state replace-provider 'registry.terraform.io/-/null' 
'registry.terraform.io/hashicorp/null'
terraform state replace-provider 'registry.terraform.io/-/archive' 
'registry.terraform.io/hashicorp/archive'
terraform state replace-provider 'registry.terraform.io/-/aws' 
'registry.terraform.io/hashicorp/aws'

Je voudrais être très précis avec le remplacement, j'ai donc utilisé l'URL cassée en remplaçant la nouvelle.

Pour être plus précis, ce n'est qu'avec terraform 13 [1].

[1] https://www.terraform.io/upgrade-guides/0-13.html#explicit-provider-source-locations

[2] https://www.terraform.io/docs/providers/index.html#providers-in-the-terraform-registry


0 commentaires