Le déploiement d’infrastructure est pendant longtemps resté une opération manuelle avec tous les risques que cela engendre :
C’est alors que sont apparus les outils d’Infrastructure As Code, nous permettant de définir notre infrastructure à l’aide d’un langage déclaratif relativement simple. Parmi ces outils, nous pouvons citer CloudFormation, salt-cloud, ansible-aws ou encore Terraform, que nous vous avions déjà présenté ici ou là.
Comme nous l’avions indiqué, il est possible de stocker vos tfstates
en local, ce qui n’est pas souhaitable dans le cadre d’un projet en équipe, ou sur un backend au choix (S3, Google Cloud Storage, Consul, Etcd, …). Le module Terraform, sujet de cet article, s’intéressera à l’utilisation d’un backend S3.
Vous avez donc un projet incluant le déploiement de stacks Terraform sur AWS et vous souhaitez stocker vos tfstates
sur S3 afin de pouvoir travailler en équipe et partager l’état de votre infrastructure avec vos collègues. C’est une première étape mais des contraintes supplémentaires existent :
Ces 2 points sont pris en charge par le module.
C’est grâce à deux services AWS que nous allons répondre à ces besoins.
En ce qui concerne le chiffrement, nous utilisons KMS, service de chiffrement fourni par AWS. Le chiffrement réalisé est symétrique, c’est à dire que la même clé sera utilisée dans le cadre du chiffrement et du déchiffrement. Ce service est fortement intégré dans l’écosystème AWS, puisque AWS vous fournira par défaut des clés utilisables sur un certain nombre de services (EBS, RDS, Lambda, ACM pour ne citer qu’eux) avec une clé différente par service et par région. Vous pouvez aussi créer des CMK (Customer Managed Key), qui vous permettent de définir la politique d’accès à ces clés.
Le but étant de donner le moins de privilèges possible à nos utilisateurs, nous allons donc créer une CMK qui nous permettra de chiffrer nos tfstates
présents sur S3 avec un accès très fortement réduit. En effet, un utilisateur qui aurait les droits sur le bucket S3 (erreur, politique trop large) mais pas sur la clé KMS ne pourra pas accéder aux données.
Le coût d’une CMK KMS est de 1$/mois.
Une fois le bucket S3 chiffré, il faut désormais empêcher de multiples déploiements des mêmes ressources au même moment. Pour cela, DynamoDB viendra à notre rescousse. DynamoDB est un service de base de données NoSQL sur lequel Terraform déposera les informations concernant le déploiement d’une stack. Sur ce service, nous pouvons configurer les performances souhaitées, non pas par une capacité CPU/RAM/disque, mais en choisissant une capacité en lecture et en écriture. De ce fait, une valeur basse (5 dans les deux cas) est amplement suffisante afin de répondre à notre besoin. Ceci implique un coût quasi nul de l’utilisation de ce service même avec plusieurs milliers de terraform plan
ou terraform apply
mensuels.
L’utilisation de ce module est relativement simple. Celui-ci est disponible sur Github ou sur le Terraform registry. Il faut donc le définir en tant que source dans votre code Terraform :
module "tfbackend" {
source = "github.com/claque2000/terraform-aws-tfbackend"
version = "1.0.0"
}
pour la version Github et
module "tfbackend" {
source = "claque2000/tfbackend/aws"
version = "1.0.0"
}
pour la version actuelle sur le Terraform registry.
Il ne vous reste plus qu’à définir les variables suivantes :
Le module propose les outputs suivants, que vous pouvez aussi exporter lors de l’appel :
Une fois le module déployé et son output utilisé, le fonctionnement de vos déploiements sera le suivant :
Au lancement d’une commande plan ou apply, Terraform va donc interroger DynamoDB afin de savoir si un lock est posé par une autre opération en cours. Dans le cas où la réponse est non, il va pouvoir demander à S3 de lui fournir le tfstate
représentant le dernier état connu de l’infrastructure. De par les droits d’utilisation de la clé KMS de l’utilisateur, S3 va demander la clé permettant de déchiffrer les données. Une fois celle-ci obtenue, les données non chiffrées sont renvoyées à l’utilisateur, tout cela bien évidemment au travers d’appels API utilisant le protocole HTTPS.
Nous vous avons présenté ici un module Terraform permettant d’abstraire la création d’un backend S3 sécurisé et permettant des déploiements unitaires. N’hésitez pas à contribuer sur le repo Github, vos pull requests sont les bienvenues.