Par dĂ©faut Terraform stocke l'Ă©tat (le state) de votre infrastructure dans un fichier local appelĂ© terraform.tfstate, vous comprendrez donc que ce fichier est trĂšs important et que ça destruction reviendrait Ă  avoir une infrastructure vierge. Ce fonctionnement est trĂšs bien pour des environnements de tests mais devient trop limitĂ© sur un environnement de production pour plusieurs raisons tel que la sauvegarde (oui oui), du versioning (encore mieux) mais aussi le fait qu'il peut ĂȘtre accessible aux membres d'une Ă©quipes (ça c'est encore mieux), bref des petites choses Ă  ne pas nĂ©gliger !

Terraform est capable de prendre en compte plusieurs types de backends (artifactory, azurerm, consul, etcd, gcs, http, manta, s3, swift) avec chacun ses avantages et ses inconvéniants. Vous trouverez beaucoup d'exemples avec S3 mais sachez que cela nécessite aussi une table DynamoDB pour la partie lock, chose que j'avais vraiment envi de me passer ici. C'est donc pour cela que j'ai choisi Consul (qui permet le stockage du tfstate (+ prise en charge des workspaces) et du lock) ! Le backend http était aussi sympa mais pas exploitable pour moi dans l'immédiat. J'ai développé une API en Python (avec Flask) en front couplé à du Redis derriÚre (standalone/cluster) pour la gestion du tfstate/lock, fonctionnelle à 95% mais ne premet pas de prendre en compte les workspaces... Chose que j'ai dans mon coin encore... (j'vais voir pour me mettre dans le Go) :)

Bref (revenons-en à nos moutons) pour l'utilisation de Consul j'ai mis en place un fichier tfstate.tf qui permet de définir le backend (peut importe le nom qu'il porte) avec ceci :

terraform {
    backend "consul" {}
}

Bien évidemment il n'y aucune information concernant le backend (identifiants, url, ...), chose que jé préfÚre définir lors de l'initialisation (recommandé aussi par la doc), pour faire simple, ça donne quelque chose comme ça :

terraform init \
    -backend=true \
    -backend-config="address=consul.domain.tld" \
    -backend-config="scheme=https" \
    -backend-config="datacenter=dc1" \
    -backend-config="http_auth=login:password" \
    -backend-config="access_token=XXXXX-XXXX-XXXXXXX" \
    -backend-config="path=scaleway-terraform/tfstate" \
    -backend-config="lock=true"

C'est terminé/initié (oui pas compliqué) ! Il ne vous reste plus qu'à déployer votre infrastructure maintenant avec un plan/apply. Si c'est déjà déployé, il faudra faire une migration de vos tfstates vers Consul (une piste). Voilà et n'hésitez pas à jouer aussi avec les workspaces, Consul le supporte (l'option est sympa, je m'en sert pour définir le datacenter pour les instances Scaleway par1/ams1).

2017-09-12_16h17_34

Enjoy!
XorHak