Parlons de certaines des meilleures pratiques à suivre lors de l'utilisation de Terraform.
Terraform est un open-source très populaire IaC (infrastructure as code) outil pour définir et provisionner l'infrastructure complète.
Bien que Terraform ait été lancé en 2014, l'adoption de cet outil s'est développée à l'échelle mondiale. De plus en plus de développeurs apprendre Terraform déployer une infrastructure dans leur organisation.
Si vous avez commencé à utiliser Terraform, vous devez adopter les meilleures pratiques pour un meilleur provisionnement de l'infrastructure de production.
Si vous êtes un débutant, regardez ceci Terraform pour les débutants l'article.
Structuring
Lorsque vous travaillez sur un grand projet d'infrastructure de production en utilisant Terraform, vous devez suivre une structure de répertoires appropriée pour prendre en charge les complexités pouvant survenir dans le projet. Il serait préférable que vous disposiez de répertoires distincts à des fins différentes.
Par exemple, si vous utilisez terraform dans des environnements de développement, de préparation et de production, ayez des répertoires séparés pour chacun d'eux.
geekflare@geekflare:~$ tree terraform_project/
terraform_project/
├── dev
│ ├── main.tf
│ ├── outputs.tf
│ └── variables.tf
├── modules
│ ├── ec2
│ │ ├── ec2.tf
│ │ └── main.tf
│ └── vpc
│ ├── main.tf
│ └── vpc.tf
├── prod
│ ├── main.tf
│ ├── outputs.tf
│ └── variables.tf
└── stg
├── main.tf
├── outputs.tf
└── variables.tf
6 directories, 13 files
Même les configurations de terraform devraient être séparées car, après un certain temps, les configurations d'une infrastructure en croissance deviendront complexes.
Par exemple - vous pouvez écrire tous vos codes terraform (modules, ressources, variables, sorties) dans le main.tf
lui-même, mais avoir des codes terraform séparés pour les variables et les sorties le rend plus lisible et plus facile à comprendre.
Naming Convention
Les conventions de dénomination sont utilisées dans Terraform pour rendre les choses facilement compréhensibles.
Par exemple, supposons que vous souhaitiez créer trois espaces de travail différents pour différents environnements dans un projet. Donc, plutôt que de les nommer env1, en2, env3, vous devriez les appeler comme dev, étape, poussée. D'après le nom lui-même, il devient assez clair qu'il existe trois espaces de travail différents pour chaque environnement.
Des conventions similaires pour les ressources, les variables, les modules, etc. doivent également être suivies. Le nom de la ressource dans Terraform doit commencer par un nom de fournisseur suivi d'un trait de soulignement et d'autres détails.
Par exemple, le nom de la ressource pour créer un objet terraform pour une table de routage dans AWS serait aws_route_table
.
Donc, si vous suivez correctement les conventions de dénomination, il sera plus facile de comprendre même les codes complexes.
Il est fortement recommandé d'utiliser les modules officiels Terraform disponibles. Pas besoin de réinventer un module qui existe déjà. Cela économise beaucoup de temps et de douleur. Registre Terraform a beaucoup de modules facilement disponibles. Apportez des modifications aux modules existants selon les besoins.
En outre, chaque module doit se concentrer sur un seul aspect de l'infrastructure, comme la création d'un Instance AWS EC2, configuration de la base de données MySQL, etc.
Par exemple, si vous souhaitez utiliser AWS VPC dans votre code terraform, vous pouvez utiliser - VPC simple
module "vpc_example_simple-vpc" {
source
= "terraform-aws-modules/vpc/aws//examples/simple-vpc"
version = "2.48.0"
}
Latest Version
La communauté de développement Terraform est très active et la publication de nouvelles fonctionnalités est fréquente. Il est recommandé de rester sur la dernière version de Terraform comme dans le cas d'une nouvelle version majeure. Vous pouvez facilement passer à la dernière version.
Si vous sautez plusieurs versions majeures, la mise à niveau deviendra très complexe.
cours terraform -v
commande pour vérifier une nouvelle mise à jour.
geekflare@geekflare:~$ terraform -v
Terraform v0.11.14
Your version of Terraform is out of date! The latest version
is 0.12.0. You can update by downloading from www.terraform.io/downloads.html
Backup System State
Sauvegardez toujours les fichiers d'état de Terraform.
Ces fichiers gardent une trace des métadonnées et des ressources de l'infrastructure. Par défaut, ces fichiers appelés comme terraform.tfstate
sont stockés localement dans le répertoire de l'espace de travail.
Sans ces fichiers, Terraform ne pourra pas déterminer quelles ressources sont déployées sur l'infrastructure. Il est donc essentiel d'avoir une sauvegarde du fichier d'état. Par défaut, un fichier avec un nom terraform.tfstate.backup
sera créé pour conserver une sauvegarde du fichier d'état.
geekflare@geekflare:~$ tree terraform_demo/
terraform_demo/
├── awsec2.tf
├── terraform.tfstate
└── terraform.tfstate.backup
0 directories, 3 files
Si vous souhaitez stocker un fichier d'état de sauvegarde dans un autre emplacement, utilisez -backup
flag dans la commande terraform et indiquez le chemin de l'emplacement.
La plupart du temps, plusieurs développeurs travailleront sur un projet. Ainsi, pour leur donner accès au fichier d'état, il doit être stocké à un emplacement distant à l'aide d'un terraform_remote_state
la source de données.
L'exemple suivant effectuera une sauvegarde sur S3.
data "terraform_remote_state" "vpc" {
backend = "s3"
config = {
bucket = “s3-terraform-bucket”
key = “vpc/terraform.tfstate"
region = “us-east-1”
}
}
Lock State File
Il peut y avoir plusieurs scénarios dans lesquels plusieurs développeurs essaient d'exécuter la configuration terraform en même temps. Cela peut entraîner la corruption du fichier d'état terraform ou même la perte de données. Le mécanisme de verrouillage permet d'éviter de tels scénarios. Il s'assure qu'à la fois, une seule personne exécute les configurations terraform et qu'il n'y a pas de conflit.
Voici un exemple de verrouillage du fichier d'état, qui se trouve à un emplacement distant à l'aide de DynamoDB.
resource “aws_dynamodb_table” “terraform_state_lock” {
name = “terraform-locking”
read_capacity = 3
write_capacity = 3
hash_key = “LockingID”
attribute {
name = “LockingID”
type = “S”
}
}
terraform {
backend “s3” {
bucket = “s3-terraform-bucket”
key = “vpc/terraform.tfstate”
region = “us-east-2”
dynamodb_table = “terraform-locking”
}
}
Lorsque plusieurs utilisateurs tentent d'accéder au fichier d'état, le nom de la base de données DynamoDB et la clé primaire seront utilisés pour le verrouillage de l'état et le maintien de la cohérence.
Notes: pas tous le verrouillage du support backend.
Use self Variable
self
variable est un type spécial de variable qui est utilisé lorsque vous ne connaissez pas la valeur de la variable avant de déployer une infrastructure.
Supposons que vous souhaitiez utiliser l'adresse IP d'une instance qui ne sera déployée qu'après la commande terraform apply, afin que vous ne connaissiez pas l'adresse IP tant qu'elle n'est pas opérationnelle.
Dans de tels cas, vous utilisez des variables self et la syntaxe pour les utiliser est self.ATTRIBUTE
. Donc, dans ce cas, vous utiliserez self.ipv4_address
en tant que variable auto pour obtenir l'adresse IP de l'instance. Ces variables ne sont autorisées que sur les blocs de connexion et d'approvisionnement de la configuration de terraform.
connection {
host = self.ipv4_address
type = "ssh"
user = var.users[2]
private_key = file(var.private_key_path)
}
Minimize Blast Radius
Le rayon de l'explosion n'est rien d'autre que la mesure des dégâts qui peuvent survenir si les choses ne se passent pas comme prévu.
Par exemple, si vous déployez certaines configurations terraform sur l'infrastructure et que la configuration n'est pas appliquée correctement, quel sera le montant des dommages causés à l'infrastructure.
Ainsi, pour minimiser le rayon de souffle, il est toujours suggéré de pousser quelques configurations sur l'infrastructure à la fois. Ainsi, si quelque chose ne va pas, les dommages à l'infrastructure seront minimes et peuvent être corrigés rapidement. Déployer de nombreuses configurations à la fois est très risqué.
Use var-file
Dans terraform, vous pouvez créer un fichier avec l'extension <em>.</em>tfvars
et passez ce fichier à la commande terraform apply en utilisant -var-file
drapeau. Cela vous aide à transmettre les variables que vous ne souhaitez pas mettre dans le code de configuration de terraform.
Il est toujours suggéré de passer des variables pour un mot de passe, une clé secrète, etc. localement via -var-fichier plutôt que de l'enregistrer dans des configurations terraform ou sur un système de contrôle de version à distance.
Par exemple, si vous souhaitez lancer une instance ec2 à l'aide de terraform, vous pouvez passer la clé d'accès et la clé secrète à l'aide de -var-fichier
Créer un fichier terraform.tfvars et mettez les clés dans ce fichier.
geekflare@geekflare:~$ gedit terraform.tfvars
access_key = "AKIATYWSDFYU5DUDJI5F"
secret_key = "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"
Maintenant, utilisez ce fichier var dans la commande terraform.
geekflare@geekflare:~$ terraform apply -var-file=/home/geekflare/terraform.tfvars
User Docker
Lorsque vous exécutez une tâche de génération de pipeline CI / CD, il est suggéré d'utiliser docker conteneurs. Terraform fournit des conteneurs Docker officiels qui peuvent être utilisés. Si vous changez le CI / CD serveur, vous pouvez facilement passer l'infrastructure à l'intérieur d'un conteneur.
Avant de déployer l'infrastructure sur l'environnement de production, vous pouvez également tester l'infrastructure sur les conteneurs docker, qui sont très faciles à déployer. En combinant Terraform et Docker, vous obtenez une infrastructure portable, réutilisable et répétable.
Conclusion
J'espère que ces bonnes pratiques vous aideront à écrire de meilleures configurations Terraform. Allez-y et commencez à les implémenter dans vos projets terraform pour de meilleurs résultats.