4
votes

Comment puis-je parcourir une variable de carte dans terraform

J'essaye de parcourir une carte de type variable et je ne sais pas comment

C'est ce que j'ai jusqu'à présent

Dans mon main.tf:

variable "account_name" {
   type = "map"
  default = {
      "account1" = "accountA"
      "account2" = "accountB"
}
}

Et dans mes variables.tf

   resource "aws_route_53_record" "proxy_dns" {
      count = "${length(var.account_name)}"
      zone_id = "${infrastructure.zone_id}"
      name = "proxy-${element(split(",", var.account_name), count.index)}-dns
      type = CNAME
      ttl = 60
      records = ["{records.dns_name}"]
}

Je souhaite pouvoir créer plusieurs ressources avec les différents noms de compte


0 commentaires

3 Réponses :


-2
votes

Peux-tu essayer:

resource "aws_route_53_record" "proxy_dns" {
    count = "${length(var.account_name)}"
    name = "proxy-${var.account_name[count.index]}-dns
}


0 commentaires

0
votes

Faites de la variable une liste au lieu d'une carte. Les cartes sont utilisées pour référencer un nom à une valeur. Les listes sont meilleures pour une itération via une méthode de comptage.

resource "aws_route_53_record" "proxy_dns" {
    count = "${length(var.account_name)}"
    zone_id = "${infrastructure.zone_id}"
    name = "proxy-${element(var.account_name, count.index)}-dns
    type = CNAME
    ttl = 60
    records = ["{records.dns_name}"]
}
variable "account_name" {
  type = "list"
  default = {"accountA","accountB"}
}


0 commentaires

10
votes

Si vous utilisez Terraform 0.12.6 ou version ultérieure, vous pouvez utiliser for_each au lieu de count pour produire une instance pour chaque élément de votre carte:

resource "aws_route53_record" "proxy_dns" {
  for_each = var.account_name

  zone_id = infrastructure.zone_id
  name    = "proxy-${each.value}-dns"
  # ... etc ...
}

Le principal avantage de for_each sur le count est que Terraform identifiera les instances par la clé dans la carte, vous obtiendrez donc des instances telles que aws_route53_record.proxy_dns["account1"] au lieu de aws_route53_record.proxy_dns[0] , et ainsi vous pourrez ajouter et supprimez des éléments de votre carte à l'avenir avec Terraform sachant quelle instance spécifique appartient à chaque élément.

each.key et each.value dans les arguments de type de ressource remplacent count.index lorsque for_each est utilisé. Ils évaluent respectivement la clé et la valeur de l'élément actuel de la carte.


3 commentaires

Puis-je exclure un élément en utilisant for_each?


Vous ne pouvez pas faire cela en utilisant for_each lui-même, mais vous pouvez produire une nouvelle carte avec certains des éléments filtrés à l'aide d'une expression for . C'est une question différente de celle à laquelle je répondais ici, donc je ne peux pas entrer dans les détails dans un commentaire ici, mais si vous essayez et avez d'autres questions, je vous suggère de commencer une nouvelle question ici dans Stack Overflow pour en discuter.


résolu en utilisant for with if pour filtrer les valeurs :)