web-dev-qa-db-fra.com

Définir les dépendances de module dans Terraform

Comment s'assurer que le premier module "frontend_1" est exécuté avant les autres?

module "frontend_1" {
  source = "/modules/frontend-app"
}
module "frontend_2" {
  source = "/modules/frontend-app"
}
module "frontend_3" {
  source = "/modules/frontend-app"
}

De plus, il y a quelques Gitissues enregistrés concernant ce problème, mais aucune bonne solution de contournement n'a été présentée dans aucun d'entre eux. Pour commencer - vous pouvez vérifier celui-ci afin de vous familiariser avec l'essence de ma question - https://github.com/hashicorp/terraform/issues/10462

Et comment créer un externe pour une ressource de module avant que le module ne soit exécuté - afin que le "nombre" puisse être calculé s'il dépend d'une valeur calculée à partir d'une telle ressource externe? Par exemple - si vous devez utiliser l'ID d'un VPC nouvellement créé dans le "nombre" d'un module qui crée plusieurs groupes de sécurité AWS au sein de ce VPC?

8
Xtigyro

Comme mentionné dans la question, j'ai pu trouver une solution de contournement pour vous en utilisant le depends on variable.

Reportez-vous ici: https://www.terraform.io/intro/getting-started/dependencies.html

Supposons que nous ayons 2 modules, l'un qui définit le vpc et les sous-réseaux, le second pour définir les différentes gammes de groupes de sécurité à utiliser dans l'infrastructure.

Puisque nous avons la dépendance telle que tous les groupes de sécurité ne doivent être créés qu'après la création réussie de vpc dans le module VPC, elle peut être satisfaite par la stratégie suivante.

variable "vpc_arn" {
   description = "The ARN of the VPC which is created in the VPC module"
}

resource "null_resource" "vpc_found" {
  triggers = {
    vpc_name = "${var.vpc_arn}"
  }
}

resource "aws_security_group" "allow_all" {

  depends_on = ["null_resource.vpc_found"]

  name        = "allow_all"
  description = "Allow all inbound traffic"
  vpc_id      = "${var.vpc_arn}"
  ......
}

Ressource nulle: https://www.terraform.io/docs/provisioners/null_resource.html

9
kisHoR

Les modules ne sont pas un ensemble de ressources qui sont toutes créées ou détruites comme une seule unité, il n'y a donc aucun sens dans lequel un module est exécuté avant ou après un autre. Si vous regardez la sortie de graphique terraform , vous verrez que les ressources individuelles au sein d'un module apparaissent sous forme de nœuds dans le graphique de plan que le moteur d'exécution traverse simultanément. Cela signifie qu'il est tout à fait possible d'avoir une dépendance bidirectionnelle entre deux modules (le module A prend les entrées de la sortie du module B et fournit également des sorties qui sont utilisées pour l'entrée du module B), tant que le graphique de plan ne contient pas de cycle.

Une chose à observer avec Terraform est que le graphe du plan est construit en regardant quels attributs de ressource, variables, entrées sorties, etc. dépendent de ceux-là par interpolation, en combinaison avec toutes les dépendances explicitement déclarées utilisant depend_on (qui n'est pas disponible pour les modules ). La conséquence de cela pour votre exemple ci-dessus est que s'il n'y a pas de références d'interpolation qui relient les valeurs de la sortie d'un module à l'entrée d'un autre, il ne peut y avoir aucun chemin construit dans le graphique de plan qui indique une dépendance entre les ressources.