1
votes

Marquage Terraform EKS

J'ai ce problème de balisage Terraform EKS et je ne semble pas trouver de solution viable pour baliser tous les sous-réseaux VPC lorsqu'un nouveau cluster est créé.

Pour fournir un contexte: nous avons un AWS VPC dans lequel nous déployons plusieurs clusters EKS dans les sous-réseaux. Nous ne créons pas de VPC ou les sous-réseaux font partie de la création du cluster EKS. Par conséquent, le code terraform créant un cluster ne permet pas de baliser les sous-réseaux et VPC existants. Bien qu'EKS ajoute les balises requises, elles sont automatiquement supprimées la prochaine fois que nous exécutons terraform apply sur le VPC.

Ma tentative de contournement consiste à fournir un fichier terraform.tfvars dans le VPC comme suit:

    resource "aws_vpc" "demo" {
      cidr_block = "10.0.0.0/16"

      tags = "${
        map(
         ${var.eks_tags}
        )
     }"
    }

Ensuite, dans le VPC et les ressources des sous-réseaux, nous faisons quelque chose comme

eks_tags = 
 [
 "kubernetes.io/cluster/${var.cluster-1}", "shared", 
 "kubernetes.io/cluster/${var.cluster-2}", "shared",
 "kubernetes.io/cluster/${var.cluster-2}", "shared",
]    

Cependant, ce qui précède ne semble pas fonctionner. J'ai essayé diverses fonctions Terraform 0.11 de https://www.terraform.io/docs/configuration-0-11/interpolation.html mais aucune d'entre elles n'aide.

Quelqu'un a-t-il pu résoudre ce problème?

L'idée que nous créons toujours de nouveaux VPC et sous-réseau pour chaque cluster EKS est fausse. De toute évidence, doit-il être un moyen de baliser les ressources VPC et de sous-réseau existantes à l'aide de Terraform?


0 commentaires

3 Réponses :


1
votes

Ce problème existera toujours lorsqu'il y a 2 morceaux de code avec différents fichiers d'état essayant d'agir sur la même ressource.

Une façon de résoudre ce problème consiste à réimporter la ressource VPC dans votre fichier d'état VPC chaque fois que vous appliquez votre code terraform EKS. Cela importera également vos balises. Il en va de même avec les sous-réseaux, mais c'est un processus manuel et fastidieux à long terme.

terraform import aws_vpc.test_vpc vpc-a01106c2

Réf: https://www.terraform.io/docs/providers/aws/r/vpc.html

À votre santé!


5 commentaires

@ praven.chandran Pendant un moment, j'ai pensé que ci-dessus fonctionnerait. cependant, j'ai du mal à ce que mes ressources de sous-réseau soient créées dans un module et Terraform nécessite la définition dans le module racine (voir ci-dessous):


terraform import aws_subnet.public-cluster-c-subnet subnet-02ed*****1b6b Error: resource address "aws_subnet.public-cluster-c-subnet" does not exist in the configuration.


Before importing this resource, please create its configuration in the root module. For example: resource "aws_subnet" "public-cluster-c-subnet" { # (resource arguments) }


Vous pouvez toujours l'importer si la ressource est à l'intérieur d'un module. Essayez de trouver le chemin absolu de la ressource à partir du fichier d'état. Quelque chose comme: terraform import module.some_module.module.some_other_module.aws_vpc.test_vpc vpc-12341234


Le chemin de la ressource doit également être visible dans la sortie d'un terraform plan .



0
votes

Dans notre cas, nous avons des scripts séparés pour provisionner des ressources VPC et réseau, nous n'ajoutons pas de balises spécifiques à EKS.

Pour le provisionnement de cluster EKS, nous avons des scripts séparés qui mettront à jour / ajouteront automatiquement des balises sur le cluster.

Donc, sur les scripts VPC dans le fichier provider.tf, nous ajoutons la condition ci-dessous afin que les scripts ne suppriment pas ces balises et que tout fonctionne correctement.

provider "aws" {
region = "us-east-1"
 ignore_tags {
    key_prefixes = ["kubernetes.io/cluster/"]
  }
}


0 commentaires

0
votes

Vous pouvez désormais utiliser l'attribut ignore_tags fournisseur aws afin que les balises aws_ec2_tag avec la ressource aws_ec2_tag ne soient pas supprimées la prochaine fois que le module VPC est appliqué.

Par exemple, le fournisseur devient:

/*
  Start of resource tagging logic to update the provided vpc and its subnets with the necessary tags for eks to work
  The toset() function is actually multiplexing the resource block, one for every item in the set. It is what allows 
  for setting a tag on each of the subnets in the vpc.
*/
resource "aws_ec2_tag" "vpc_tag" {
  resource_id = data.terraform_remote_state.vpc.outputs.vpc_id
  key         = "kubernetes.io/cluster/${var.cluster_name}"
  value       = "shared"
}

resource "aws_ec2_tag" "private_subnet_tag" {
  for_each    = toset(data.terraform_remote_state.vpc.outputs.private_subnets)
  resource_id = each.value
  key         = "kubernetes.io/role/elb"
  value       = "1"
}

resource "aws_ec2_tag" "private_subnet_cluster_tag" {
  for_each    = toset(data.terraform_remote_state.vpc.outputs.private_subnets)
  resource_id = each.value
  key         = "kubernetes.io/cluster/${var.cluster_name}"
  value       = "shared"
}

resource "aws_ec2_tag" "public_subnet_tag" {
  for_each    = toset(data.terraform_remote_state.vpc.outputs.public_subnets)
  resource_id = each.value
  key         = "kubernetes.io/role/elb"
  value       = "1"
}

resource "aws_ec2_tag" "public_subnet_cluster_tag" {
  for_each    = toset(data.terraform_remote_state.vpc.outputs.public_subnets)
  resource_id = each.value
  key         = "kubernetes.io/cluster/${var.cluster_name}"
  value       = "shared"
}

Ajoutez, vous pouvez ensuite exploiter la ressource aws_ec2_tag comme ceci dans votre module EKS sans vous soucier de la suppression de la balise la prochaine fois que le module VPC est appliqué.

provider "aws" {
  profile = "terraform"
  region  = "us-west-1"
  
  // This is necessary so that tags required for eks can be applied to the vpc without changes to the vpc wiping them out.
  // https://registry.terraform.io/providers/hashicorp/aws/latest/docs/guides/resource-tagging
  ignore_tags {
    key_prefixes = ["kubernetes.io/"]
  }
}


0 commentaires