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