Terraform ou CloudFormation, les deux outils sont souvent mis en opposition, demandant au DevOps de trancher et choisir un outil ou l'autre. Pourtant, de mon point de vue, ces deux outils n'adressent pas forcément les même besoins.

Se poser la question de son besoin exact

Avant de savoir vers quel outil aller, il est important de savoir quel est le besoin exact qu'on doit adresser:

  • Est-ce que je veux déployer uniquement sur AWS?
  • Est-ce que je dois m'interfacer avec des outils (notament CI/CD) déjà existants?
  • Est-ce que je veux héberger moi-même la solution de déploiement ou dépendre d'un service managé?
  • Est-ce que j'utilise déjà d'autres outils de l'écosystème HashiCorp (Nomad, Packer, Consul ou Vault par exemple)?

En effet, avec ces questions on peut déjà cibler plus facilement l'outil que l'on souhaite utiliser.

Terraform : Outil d'Infrastructure as Code d'HashiCorp

Terraform est un outil open source, créé par HashiCorp, spécialisé dans les outils d'automatisation.

Il permet de deployer plus facilement sur Amazon, mais pas uniquement, en effet, Terraform gère des dizaines de providers permettant de déployer avec le même outil sur GCP/Azure/AWS ou bien sur du bare-metal.

De même Terraform sait gérer un déploiement hybride sur plusieurs cloud et/ou datacenters.

Au sein d'Amazon, Terraform sait déployer simultanément sur plusieurs comptes AWS. Il est aussi possible d'étendre les possibilités de Terraform en développant se propres plugins (en GoLang)

L'outil parfait? Non, comme tous les outils, il a aussi ses défauts. Déjà, il utilise un langage qui lui est propre, le HCL (pour HashiCorp Language), qui ressemble (de loin), à du JSON. Ensuite, Terraform ne sait pas gérer toutes les subtilités de certains services Amazon, et à une latence (même faible), lorsqu'un nouveau service arrive, ou de nouvelles fonctionnalités sont mises en place par Amazon. C'est un point important qu'il faut prendre en compte dans le choix de l'outil, car on peut avoir des régressions du à ces points sur des environnements productifs!

Enfin, Terraform nécessite une machine pour fonctionner, là ou CloudFormation est un simple service d'Amazon. Ce qui signifie qu'il y a un coût de MCO et de run supplémentaire à prendre en compte.

CloudFormation : Service d'Infrastructure as Code d'Amazon

CloudFormation est un service d'Amazon, maintenu entièrement par ce dernier.

Il permet de déployer facilement des ressources dans Amazon, entièrement maintenu et mis à jour par Amazon, il permet de se passer du MCO de la solution.

De plus l'utilisation de CloudFormation est gratuite (seule les ressources deployées via CloudFormation sont facturées). CloudFormation permet d'exploiter des templates au format YAML ou JSON, de manière identiques. L'utilisation de ces formats standardisés permet de prendre en main l'outil rapidement. CloudFormation est mis à jour par Amazon, de manière transparente, et sans interruption de service.

Tout comme Terraform, CloudFormation a aussi des défauts. Par exemple je trouve l'interpolation de variables moins poussée que Terraform et moins lisible, les formats YAML/JSON ne s'y prêtent pas forcément aussi bien que le HCL. CloudFormation créé aussi une adhérence forte avec AWS, qui n'est pas forcément voulue, et pousse à aller toujours plus dans AWS, et uniquement AWS. Le fait que CloudFormation soit mis à jour uniquement par Amazon peut aussi créé des régressions non gérées, puisqu'on dépend entièrement d'Amazon. Je prends pour exemple un bug actuellement présent lors de la destruction de lambda déployée dans un VPC, qui peuvent restée bloquées en destruction durant plusieurs minutes (voire plusieurs heures).

Terraform VS CloudFormation : David contre Goliath?

Sur le papier, on pourrait croire qu'une entreprise de taille faible par rapport à Amazon part directement perdantes (comme se battre contre n'importe lequel des GAFAM). Néanmoins, HashiCorp à su au fil des années fédérer beaucoup d'utilisateurs et a derrière elle une énorme communauté. Cette communauté permet d'avoir une forte réactivité sur les bugs ou ajouts de nouvelles fonctionnalités. De plus, le fait d'avoir su interfacer ses outils entre eux permet à des outils comme Consul ou Vault de se connecter naturellement à Terraform. HashiCorp est maintenant présente dans le paysage DevOps depuis plusieurs années, ce qui peut aussi être rassurant, d'autant plus avec leur solution commerciale, Atlas, dont je ne parlerais pas ici.

En face, CloudFormation à l'avantage d'être maintenu par AWS, dont l'expertise dans le domaine du cloud n'est plus à prouver. De plus, comme je l'ai indiqué, CloudFormation à l'avantage d'être mis à jour par AWS, souvent en mode "shadow" à l'avance, puisqu'Amazon connait ses propres annonces en avance. En cas de soucis de déploiement, c'est aussi l'assurance de pouvoir directement traité le point avec le support AWS, plutôt qu'avec une communauté, qui aussi efficace soit elle n'a pas de SLA à assurer.

En conclusion

Comme j'en ai parlé, les deux outils n'adressent pas forcément les mêmes besoins et nécessite au préalable une réflexion pour éviter de choisir un outil qui restreint trop les DevOps. De mon point de vue, les deux outils sont très bons, et permettent tout les deux de déployer de manière fiable sur des environnements productifs sur AWS. J'ai néanmoins une préférence pour Terraform, qui est plus polyvalent que CloudFormation, de mon point de vue.