Skip to main content

3 conseils pour gérer la dérive causée par des modifications manuelles dans Terraform

Écrit par
Headshot of Stephane Jourdan

Stephane Jourdan

feature synk iac terraform magenta

22 mai 2020

0 minutes de lecture

Note de la rédaction : Cette publication a d’abord été publiée sur CloudSkiff.com. CloudSkiff a rejoint Snyk en octobre 2021.‹

Comment gérer la dérive causée par des modifications manuelles dans Terraform ? Si quelqu’un modifie manuellement un élément de l’infrastructure, comment gérer cela dans Terraform et lancer Terraform plan la fois suivante ? Selon les situations, il existe différentes façons de gérer la dérive causée par des modifications manuelles de votre infrastructure dans Terraform.

Voici trois options :

  • Modifiez le code manuellement pour mettre à jour votre état

  • Reconstituez l’environnement existant avec Terraform à l’aide d’un outil

  • Importez des éléments spécifiques de votre nouveau code à l’aide de la sous-commande Terraform import

1. Modifiez le code manuellement pour mettre à jour votre état

Il est toujours plus facile de commencer par un exemple. Imaginons que l’un des membres de votre équipe ait modifié manuellement un groupe de sécurité, par exemple en ouvrant un port HTTP pour un sous-réseau spécifique, et que vous le découvriez lors du prochain terraform apply. (C’est un cas simple.)

À la suite de cette action, vous trouverez un diff dans votre terraform output (dans la CI ou sur votre ordinateur). Vous pouvez donc ajouter directement cette différence sous forme d’extrait dans votre code Terraform et l’appliquer. En gros, il vous suffit d’ajouter le code manuellement après le déploiement. Lors du prochain terraform apply, Terraform constatera que l’état ne comprend pas ce nouvel élément (dans notre exemple, l’autorisation du trafic HTTP pour un sous-réseau) et demandera à votre fournisseur de cloud (AWS, par exemple) de le créer. AWS répondra alors : « Je l’ai déjà. »

Dans ce cas simple, la différence apparaît uniquement dans le fichier TFstate, et vous avez résolu le problème manuellement. C’est un peu comme résoudre un conflit lors d’une fusion Git.

Voici donc les étapes clés :

  • Écrivez le code manquant

  • Envoyez-le

  • Appliquez-le

  • La différence disparaît

  • Et l’état final est mis à jour dans le fichier d’état

2. Reconstituez l’environnement existant avec Terraform

Si vous êtes face à un cas bien plus complexe, comme une machine virtuelle complète, ou pire, un cluster Kubernetes entier de 10 000 nœuds déployé manuellement, vous n’allez évidemment pas écrire le code à la main, comme je viens de le faire pour un cas très simple. Je vous recommande d’utiliser un outil comme Terraformer ou Terraforming.

Ce type d’outil analyse les comptes de votre fournisseur cloud pour détecter les ressources et les paramètres. Une fois tous les paramètres récupérés (par exemple, pour une machine virtuelle : disque dur, adresse IP, type de système d’exploitation, etc.), l’outil convertit ces éléments en code Terraform valide et crée un TFState à partir du code.

Terraformer a été créé par l’équipe SRE de Waze chez Google, à Tel-Aviv. Il effectuera environ 80 % du travail ; il vous restera simplement quelques ajustements à faire.

Vous obtiendrez donc trois éléments avec cet outil :

  • Le code que vous venez d’extraire

  • Un déploiement manuel existant

  • Un fichier d’état

Le problème, à présent, c’est que ces éléments ne sont pas vraiment intégrés à votre dépôt d’infrastructure existant. C’est le sujet de la prochaine section : choisir les éléments à importer.

3. Importez des éléments spécifiques de votre nouveau code avec la sous-commande Terraform import

Une fois votre code prêt, utilisez la sous-commande terraform import pour sélectionner avec précision les éléments à importer.

Imaginons, par exemple, que vous ayez lancé manuellement une adresse IP spécifique pour un ancien équilibreur de charge. La production doit conserver cette adresse IP particulière, et vous voulez vous assurer qu’elle est gérée dans Terraform. Vous pouvez écrire le code Terraform correspondant et importer l’ID associé dans AWS.

C’est assez différent de simplement envoyer et appliquer du code, puis de vérifier si « ça marche » de l’autre côté. Vous disposez de ce code et savez que si vous l’exécutez maintenant, vous créerez un doublon (dans cet exemple précis, car il peut y avoir des centaines d’adresses IP associées à un nom ; ce n’était pas le cas dans l’exemple précédent du groupe de sécurité, où un seul port 80 peut être ouvert).

Dans cet exemple, j’identifierais donc cette adresse IP très précise à l’aide d’un outil d’importation comme Terraformer, puis je la copierais dans mon code existant. Ensuite, je ne l’appliquerais pas directement : je l’importerais avec la sous-commande terraform import.

Voici à quoi ressemble la commande terraform import.

Capture d’écran du terminal affichant la commande Terraform `import --help` et ses options disponibles.
Commande `import --help`
Gros plan sur un terminal affichant l’aide et les commandes de Terraform import pour importer une infrastructure existante dans l’état Terraform.
Zoom avant

En conclusion : gérer la dérive causée par des modifications manuelles dans Terraform

Selon la situation, voici les trois façons que je recommande pour gérer les modifications manuelles de votre infrastructure avec Terraform :

  1. Écrivez le code et appliquez-le pour les petites modifications qui n’ont pas besoin d’être importées à nouveau, puis laissez Terraform synchroniser automatiquement le fichier d’état.

  2. Importez votre nouvel environnement et reconstituez-le avec Terraform à l’aide d’un outil comme Terraformer.

  3. Et/ou importez manuellement des éléments très précis avec la sous-commande Terraform import.

Sécuriser votre code Terraform

Snyk IaC sécurise vos configurations Terraform (ainsi que vos modèles Kubernetes, CloudFormation et ARM !) pendant que vous codez, et vous propose des correctifs guidés pour vous permettre de fusionner et de passer à la suite. Testez votre code au fur et à mesure, surveillez les changements dans vos dépôts Git et automatisez les tests dans vos pipelines de build avant le déploiement. Démarrer avec une offre gratuite ne prend que quelques minutes, alors qu’une faille due à une mauvaise configuration IaC peut avoir des conséquences durables. Inscrivez-vous ci-dessous et commencez à sécuriser vos configurations. Consultez cet article pour en savoir plus sur la détection et la prévention de la dérive de configuration.

Sécurisez votre infrastructure dès la source

Snyk automatise la sécurité et la conformité de l’IaC dans vos workflows, et détecte les ressources dont la configuration a dérivé ou qui sont manquantes.