Je loue des Virtual Private Server (VPS) chez Scaleway depuis 2016 et j'en ai toujours été globalement satisfait. Les performances sont correctes et c'est un hébergeur qui malgré ses tarifs lowcost a su prendre le virage du Cloud en ajoutant toujours plus de services indépendants, et en proposant une bonne intégration avec Terraform.
Et puis les choses ont changé:
- L'été 2020, Scaleway a augmenté ses tarifs. Moi qui utilisait les instances DEV1-S, cela se traduisit par +40% !
- A l'automne 2020, Scaleway a mis fin à la limite mensuelle. De base, la facturation se faisait à l'heure, mais au delà d'un certain seuil le tarif était bloqué à une valeur fixe (comme une sorte de forfait au mois). Ce n'est désormais plus le cas.
Au final, le DEV1-S que je payais 2,99€ HT / mois me coûte maintenant 7,30€ HT / mois soit une augmentation de +144%, aïe.
Puisque mes besoins sont croissants (deux nouveaux VPS à venir) j'ai décidé de regarder ce qui se faisait à côté, et je suis tombé sur Hetzner qui jouit d'une réputation plutôt correcte tout en proposant des tarifs lowcost. Comparons les prix :
- 2 vcpu, 2GB de RAM, 20GB stockage: Hetzner CX11 (2,96€ / month), Scaleway DEV1-S (7,30€ / month).
- 4 vcpu, 8GB de RAM, 80GB stockage: Hetzner CPX31 (14,76€ / month), Scaleway DEV1-L (29,20€ / month).
La migration a donc commencé, le blog est maintenant hébergé chez Hetzner (toujours en Kubernetes) à Helsinki.
J'ai une relation d'amour et de haine avec Terraform. Cet outil est formidable pour discuter avec les providers de cloud et faire de la remédiation, en revanche je me casse régulièrement les dents sur le langage hcl que je trouve extrêmement limité et frustrant. Trois exemples :
- Les variables : Toute variable doit être déclarée, typée et contenir une valeur, même si on ne s'en sert pas. Une variable ne peut pas être égale à une autre. Pas de dictionnaire.
- Pas de if, pas de loop : On doit ruser avec count mais on perd grandement en souplesse et en lisibilité.
- pas DRY: (Don't Repeat Yourself) on ne peut pas utiliser du code commun et envoyer des variables en fonction de l'environnement, donc on duplique pas mal de code. Ce problème est réglé par Terragrunt que je recommande.
C'est principalement pour ces deux raisons que je considère qu'il est très difficile voire impossible de faire du code générique sur Terraform. On ne peut pas créer un module qui gère tous les cas possibles à l'aide des variables, on devra obligatoirement imposer des choix.
Terraform 0.12 est une version qui était très attendue depuis près de 1 an car promettant de lever pas mal de limitations du hcl. Et en effet la nouvelle version du langage nous apporte des nouveautés très appréciables. Mes 3 préférées sont :
- First-class expression syntax :
${var.foo}
devient var.foo
-
${var.foo["key"]}
devient var.foo.key
${var.foo[count.index]}
devient var.foo
(mon préféré)
- Generalized type system :Les variables peuvent être des "object" composés de clés de différents types. Les objets eux-mêmes peuvent faire partie d'une liste: exemple. C'est peut-être le plus gros progrès de cette version.
- Iteration constructs : Arrivée des boucles for et des boucles dynamiques, semble en pratique plus limité que ce qu'on pourrait croire mais c'est bon à prendre. Exemple.
Terraform 0.12 couplé à Terragrunt offre une plus grande souplesse et évite de se répéter. J'ai entamé la migration de mes projets pour profiter de ces nouveautés, et j'en suis très content. Merci Terraform :)