Ce document fournit des consignes et des recommandations à prendre en compte lors de l'utilisation de modules Terraform réutilisables.
Ce guide n'est pas une introduction à Terraform. Pour une présentation de l'utilisation de Terraform avec Google Cloud, consultez la page Premiers pas avec Terraform.
Activer les API requises dans les modules
Les modules Terraform peuvent activer tous les services requis en utilisant la ressource google_project_service
ou le module project_services
.
Inclure l'activation des API facilite les démonstrations.
- Si l'activation d'une API est incluse dans un module, elle doit pouvoir être désactivée en exposant une variable
enable_apis
dont la valeur par défaut esttrue
. Si l'activation d'une API est incluse dans un module, elle doit définir
disable_services_on_destroy
surfalse
, car cet attribut peut poser des problèmes lorsque vous utilisez plusieurs instances du module.Exemple :
module "project-services" { source = "terraform-google-modules/project-factory/google//modules/project_services" version = "~> 12.0" project_id = var.project_id enable_apis = var.enable_apis activate_apis = [ "compute.googleapis.com", "pubsub.googleapis.com", ] disable_services_on_destroy = false }
Inclure un fichier de propriétaires
Pour tous les modules partagés, incluez un fichier OWNERS
(ou CODEOWNERS
sur GitHub), qui indique qui est responsable du module. Avant toute demande d'extraction, un propriétaire doit l'approuver.
Publier des versions avec tags
Parfois, des modules nécessitent des modifications destructives et vous devez communiquer les effets aux utilisateurs afin qu'ils puissent rattacher leurs configurations à une version spécifique.
Assurez-vous que les modules partagés suivent SemVer 2.0.0 lorsque de nouvelles versions sont taguées ou publiées.
Lorsque vous référencez un module, utilisez une contrainte de version pour rattacher la version majeure. Exemple :
module "gke" {
source = "terraform-google-modules/kubernetes-engine/google"
version = "~> 20.0"
}
Ne pas configurer de fournisseurs ou de backends.
Les modules partagés ne doivent pas configurer de fournisseurs ou de backends. Configurez plutôt les fournisseurs et les backends dans les modules racine.
Pour les modules partagés, définissez les versions minimales requises du fournisseur dans un bloc required_providers
, comme suit :
terraform {
required_providers {
google = {
source = "hashicorp/google"
version = ">= 4.0.0"
}
}
}
Sauf indication contraire, supposez que les nouvelles versions du fournisseur fonctionneront normalement.
Exposer les libellés en tant que variable
Permet une flexibilité dans l'ajout de libellés aux ressources via l'interface du module.
Envisagez de fournir une variable labels
avec un mappage vide comme valeur par défaut :
variable "labels" {
description = "A map of labels to apply to contained resources."
default = {}
type = "map"
}
Exposer les sorties de toutes les ressources
Les variables et les sorties vous permettent de déduire les dépendances entre les modules et les ressources. Sans aucune sortie, les utilisateurs ne peuvent pas trier correctement votre module en fonction de leurs configurations Terraform.
Pour chaque ressource définie dans un module partagé, incluez au moins une sortie qui référence la ressource.
Utiliser des sous-modules intégrés pour les logiques complexes
- Les modules intégrés vous permettent d'organiser des modules Terraform complexes en unités plus petites et de dédupliquer les ressources communes.
- Placez les modules intégrés dans
modules/$modulename
. - Traitez les modules intégrés comme privés, ne devant pas être utilisés par des modules externes, sauf indication contraire dans la documentation du module partagé.
- Terraform ne suit pas les ressources refactorisées. Si vous commencez avec plusieurs ressources dans le module de premier niveau, puis que vous les transférez dans des sous-modules, Terraform tente de recréer toutes les ressources refactorisées. Pour atténuer ce comportement, utilisez des blocs
moved
lors de la refactorisation. - Les sorties définies par les modules internes ne sont pas automatiquement exposées. Pour partager les sorties des modules internes, réexportez-les.
Étapes suivantes
- Découvrez les bonnes pratiques générales concernant le style et la structure pour Terraform sur Google Cloud.
- Découvrez les bonnes pratiques concernant l'utilisation des modules racine Terraform.