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...
3 Réponses :
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 queTerraform destroy object data "null_data_source"
, puis vous pouvez supprimer le bloc fournisseur "null" car il ne sera plus nécessaire .
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
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.
Il faut s'y attendre, étant donné que Terraform est toujours en version 0.xy
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