Terraform - Attention à for_each


Utiliser for_each à la place de count peut avoir un impact important sur le graphe orienté acyclique généré par Terraform.

Démonstration avec un exemple.

Je construis actuellement un cluster Kubernetes dans lequel chaque noeud se doit d’avoir son propre enregistrement DNS. Dans mon cas, il s’agit ici d’une relation avec une cardinalité 1,1. Chaque enregistrement DNS est associé avec un seul neul et chaque noeud est associé avec un seul enregistrement DNS.

This is a placeholder image description

Le code ci dessus permet la création de 5 noeuds, accessibles avec digitalocean_droplet.nodes.

Créer les enregistrements DNS

Intuitivement, utiliser for_each peut sembler simple et évident pour réaliser cette tâche, mais cela peut poser problème, voyons pourquoi.

This is a placeholder image description

Le problème avec cette solution c’est que chaque enregistrement a pour dépendance implicite tous les noeuds. Il est possible de générer un graphe de dépendances avec le tout récent outil Pluralith (actuellement en version Alpha).

https://media.licdn.com/dms/image/D4E12AQH9WC3xTs2Nag/article-inline_image-shrink_1500_2232/0/1665322071006?e=1677715200&v=beta&t=LhN-KLJuKcHoqJBJ7OzxV0opQ1RX1sgeYOG5u2urB34

Ces dépendances supplémentaires sont complètement inutiles, pollue le graphe et viennent avec un coût sur les performances.

Utiliser count à la place de for_each

Plutôt que d’utiliser une solution itérative, il est possible de récupérer les propriétés d’un noeud avec une complexité O(1).

https://media.licdn.com/dms/image/D4E12AQHj7SwDu9fIOw/article-inline_image-shrink_1500_2232/0/1665322326878?e=1677715200&v=beta&t=xpwubEtjZlKVrRf0fqcBagKSoJuE8kowQDTPi952Ss8

Maintenant chaque noeud est récupéré par indexation, sans itérer, ce qui se reflète dans le graphe par l’absence de dépendances inutiles et a un impact positif sur les performances et la lisibilité.

https://media.licdn.com/dms/image/D4E12AQEIDAsJXpOkmw/article-inline_image-shrink_1500_2232/0/1665322492307?e=1677715200&v=beta&t=tbYAVHfMfXLB89ahszZx8u6O9s9h8RjQJecZiKoeZOo

Bien plus lisible et optimisé! Attention toute fois à ne pas complétement abandonner for_each qui a d’autres avantages.