REX Migration Terraform : de la v0.11.13 vers la v0.12

le 26/06/2019 par Aryana Peze
Tags: Software Engineering

Hello !

Comme vous le savez probablement tous, la v0.12 tant attendue de Terraform est sortie ! \o/

Sur mon projet, nous avons migré de la version Terraform 0.11.13 vers la version 0.12.2.

Je pense que chaque projet rencontrera des blocages différents en fonction de son code, et votre expérience sera peut-être très différente de la mienne, mais voici un petit REX sur la migration appliquée à mon projet.

Contexte

Technos du projet :

  • Provider : AWS version 2.15
  • Terraform : migration de la 0.11.3 vers 0.12.2

Architecture du projet :

  • Un dossier infra, composé de tous les différents dossiers terraform (networks, cluster,  elasticsearch…)
  • Un module pour générer les services fargate rattachés à mon cluster
  • Un dossier terraform par service (chacun basé sur le module)

Etape 1 : la commande terraform 0.12checklist est plutôt décevante

J'ai tout d'abord voulu suivre la doc Terraform qui explique comment procéder pour la migration, mais cela n'a pas été très concluant.

On vous conseille de passer d'abord en v0.11.14, et d'utiliser la commande terraform 0.12checklist. La commande n'a jamais fonctionné chez moi, et je tombais sans cesse sur ce message :

- [ ] Terraform couldn't reach the Terraform Registry (at 'http://registry.terraform.io/') to determine whether current provider plugins are v0.12-compatible.

Un de mes collègues, qui a testé cette commande il y a quelques temps déjà, dit qu'elle lui indiquait surtout si la version du provider était compatible avec notre version de Terraform... Un peu décevant vu le temps que j’y ai consacré...

J'ai donc finalement sauté cette étape.

Etape 2 : quelques erreurs "aléatoires" au terraform init

Le reste de la doc est assez simple et de manière générale plutôt logique. Il y a des explications sur quelques changements majeurs de la nouvelle version. Ils ne nous concernaient cependant pas particulièrement.

J’ai eu par la suite des soucis sur le terraform init de certains de mes dossiers, et le message d'erreur n'était pas clair : "Error: registry service is unreachable, check https://status.hashicorp.com/ for status updates".

J’ai fini par réaliser que le soucis était la syntaxe de ma variable dans mon fichier de config : j'ai écrit "${var.aws_region}" alors qu'il attendait var.aws_region. Je n'ai eu le soucis que sur certains dossiers, je ne sais pas vraiment pourquoi...

Le terraform plan s'est déroulé sans encombre. J'ai corrigé les syntaxes lorsque c'était demandé, à savoir essentiellement :

  • des suppressions de virgules dans mes json de “aws_iam_policy_document”
  • des suppressions de crochets “[ ]” lorsque la valeur renvoyée est déjà un tableau

Je n'ai eu aucun gros blocage, si ce n'est que la façon d’ignorer les changements sur un tag spécifique avait changé et que je n’ai pas trouvé où cela était documenté.

Etape 3 : la commande terraform 0.12upgrade fonctionne vraiment bien !

Comme je disais, le terraform plan s'est déroulé sans encombre. Mais cela me paraissait curieux car je n'avais rien changé à mon code (à part la config qui fige la version terraform), et qu'il me semblait qu'il y avait de gros changements au niveau des variables (documenté ici). J'ai donc tenté une nouvelle commande de la v.0.12.2 : terraform 0.12upgrade.

La commande m'a réécrit toutes mes variables avec la nouvelle nomenclature ! C'est très pratique, ça m'aurait pris beaucoup de temps à la main ! Et le terraform plan suivant m'a bien affiché que rien n'avait changé, donc nickel =)

A savoir :

  • Le terraform 0.12upgrade part du principe que vous êtes encore en v0.11. Si vous avez déjà modifié la syntaxe à certains endroits, ça va l'embrouiller et il va afficher une erreur.
  • Il génère un fichier versions.tf. Perso je l'ai mis dans mon gitignore.
  • Par moments, quand il n'est pas sûr de sa modification, il nous rajoute un petit commentaire explicatif ! Il faut penser à le prendre en compte et à le supprimer avant de commit.

CONCLUSION

Une fois de plus, basé sur mon expérience personnelle, voici ce que j’en retiens :

  • La commande terraform 0.12checklist de terraform 0.11.14 a pour moi un intérêt très limité - quand ça fonctionne !
  • Je suis donc passée directement en 0.12.2 et j'ai fait l’upgrade.
  • Entre la commande terraform 0.12upgrade et les messages d'erreur très clairs concernant la syntaxe affichés lors du terraform plan, ça se passe plutôt bien
  • Mon collègue, qui travaille sur un autre projet, m'a remonté des décalages entre les terraform plan et terraform apply, mais personnellement je n'ai pas eu ce soucis. J'espère que vous n'en aurez pas non plus =)

Je me permets de finir sur un gros RAPPEL : Si vous changez le tfstate d'un dossier en testant la v0.12, vous le rendez inaccessible pour tous ceux en v0.11 !

Donc si vous êtes plusieurs à travailler sur le Terraform :

  • Travaillez sur un environnement séparé pour ne pas impacter les autres membres de l'équipe
  • Je vous conseille de faire la migration rapidement et idéalement sans interruption. J'ai malheureusement dû faire beaucoup de context-switching. C'est frustrant et chronophage car je dois bien veiller à changer de branche, d'environnement, et de binaire terraform à chaque fois (je suis en v0.12 sur ma branche/env de migration, et en v0.11 sinon).

Au final, cela n'a pas été une mauvaise expérience ! Sans le context-switching et les interruptions constantes, ça aurait été plié en même pas une journée je pense.

J'espère que ça vous sera utile =)