2017-07-18 1 views
1

J'utilise Terraform pour déployer une architecture VPC en étoile où un VPC de transit/gestion/infrastructure sert de concentrateur de communication.AWS avec Terraform: comment mapper des ID VPC pour le peering lorsque chaque VPC est un fichier .tf distinct?

L'organisation du projet est divisée en modules & l'environnement en direct, et l'environnement en direct est divisé de sorte que chaque VPC possède son propre sous-répertoire. Le problème que je rencontre est de récupérer dynamiquement les ID VPC quand je veux créer une ressource d'appairage VPC - évidemment, ce ne serait pas un problème si j'instanciais tous mes modules dans un fichier plat principal.tf, cependant, c'est quelque chose que j'essaie d'éviter.

Est-il possible de résoudre ce problème avec Terraform? Il me semble qu'avec toute solution, je pense à l'exigence de fournir statiquement des données qui mappent deux VPC ensemble, mais le problème est que l'ID VPC est attribuée au moment de la création de la ressource et que je ne saurai pas à l'avance. Dois-je aplatir mes fichiers "live" .tf ou existe-t-il un autre moyen? Est-ce que je fais quelque chose de mal entièrement avec mon modèle de fichier?

Merci!

+1

Pouvez-vous préciser si vous utilisez des modules Terraform ou tout simplement des dossiers avec des fichiers 'tf'? Cela devrait être possible avec des références aux sorties de ressources. La réponse est légèrement différente selon que vous utilisez des modules. Mais si vous utilisez simplement des fichiers 'tf' dans des dossiers, vous pouvez les traiter comme" plats ". Les fichiers sont chargés par ordre alphabétique selon https://www.terraform.io/docs/configuration/load.html. –

+1

Oui, j'utilise des modules. Les fichiers "environnement réel" les fournissent et transmettent les variables nécessaires. Le problème est que si j'utilise le module VPC et instancie "Foo" et "Bar", puis instancie le module d'appairage VPC "Baz" entre "Foo" et "Bar" alors je dois essentiellement avoir tous les VPC instancié dans le même fichier qui est ce que j'essaie d'éviter. Merci pour votre réponse! – tellof

Répondre

1

Nous créons notre environnement en "couches", nous construisons une couche réseau de base de VPC et de sous-réseaux, puis une couche d'infrastructure partagée, puis des tranches d'application individuelles qui font partie de la couche application. Le code terraform de chaque couche se trouve maintenant dans son propre dossier et possède son propre fichier d'état. Cela nous permet de mettre à jour les couches supérieures sans avoir à parcourir le monde entier de l'infrastructure gérée par terraform.

Maintenant, les couches supérieures ont souvent besoin de valeurs provenant des couches inférieures. La création d'un ec2 dans une couche d'application nécessite des informations sur vpc et sous-réseau à partir de la couche de base. Nous faisons cela par data.terraform_remote_state. Tous nos fichiers d'état pour un environnement vit dans un compartiment S3 avec des noms de fichiers prévisibles. Ainsi, dans une tranche d'application, nous ferions:

data "terraform_remote_state" "base" { 
    backend = "s3" 
    config { 
     bucket = "remote-state-bucket" 
     key = "environment-staging/base-layer.tfstate" 
     region = "some-region" 
    } 
} 

et nous pouvons saisir les propriétés que la couche de base définie comme sorties comme celle-ci:

value = "${data.terraform_remote_state.base.some_output}" 
+0

Je n'ai pas considéré la partie "noms de fichiers prévisibles". Merci! – tellof