Terraform – join l'infrastructure et les configurations d'applications

J'ai 2 scripts pour terraform: 1.utilisé pour lancer les servers d'infrastructure (VPC, Security groups, MySQL, Redis, Cassandra) et le second pour lancer l'application (Auto scale groups, Load Balancers, DNS Records).

Ma question est la meilleure pratique sur la gestion de ces files de configuration. Je souhaite que les deux applications soient dans le même VPC AWS (qui sera créé à partir du file .tf de l'infrastructure)

EDIT : Pour clarifier davantage mon sharepoint vue, j'ai cette configuration en ce qui concerne Terraform:

  • Git repo infra
    • infra.tf
    • vpc.tf
  • application git repo
    • app.tf
    • load_balancers.tf

Je souhaite que toute la configuration * .tf soit déployée dans le même VPC AWS, en 2 phases: d'abord, les files .tf suivants, puis l'application .tf

One Solution collect form web for “Terraform – join l'infrastructure et les configurations d'applications”

Ce type de configuration en couches est possible avec Terraform, mais il nécessite un magasin intermédiaire pour conserver les informations à partir de la première configuration (infrastructure, dans votre cas) afin qu'elle puisse être récupérée lors de l'application de la deuxième configuration (application).

La façon la plus simple de le faire est d'utiliser le mécanisme construit dans l'état "à distance" de Terraform comme magasin intermédiaire. Pour ce faire, vous devez d'abord configurer un backend à distance (en supposant Terraform 0.9 ou ultérieur) dans la configuration de l'infrastructure. Par exemple, en utilisant Amazon S3 pour le stockage:

terraform { backend "s3" { bucket = "example-state-bucket" key = "infrastructure.tfstate" region = "us-east-1" } } 

Chaque fois que la configuration du backend change, il est nécessaire d'exécuter la terraform init pour synchroniser l'état avec le nouvel location.

Toute information que vous souhaitez exposer à la configuration de l'application doit être déclarée comme une "sortie" de la configuration de l'infrastructure:

 output "aws_vpc_id" { value = "${aws_vpc.example.id}" } output "aws_subnet_a_id" { value = "${aws_subnet.a.id}" } output "aws_subnet_b_id" { value = "${aws_subnet.b.id}" } 

Après avoir ajouté une nouvelle sortie, exécutez du terraform apply pour s'assurer que sa valeur est calculée et écrite dans l'état.

Enfin, nous sums prêts à lire cette valeur à partir de la configuration de l'application en utilisant la source de données terraform_remote_state :

 data "terraform_remote_state" "infrastructure" { backend = "s3" config { # Config values should match that of the infrastructure backend settings # as shown above. bucket = "example-state-bucket" key = "infrastructure.tfstate" region = "us-east-1" } } # For example, to create an EC2 instance in one of the subnets resource "aws_instance" "example" { # ... subnet_id = "${data.terraform_remote_state.infrastructure.aws_subnet_a_id}" } 

Un exemple plus élaboré de ce model, en utilisant Consul comme le magasin de données intermédiaire plutôt que l'état distant de Terraform, peut être vu dans ma série d'articles sur le model d'application Terraform Environment + . Tout magasin de données que Terraform peut à la fois écrire et lire depuis peut, en principe, être utilisé pour transmettre des données d'une configuration à une autre.

  • Est-ce que Terraform s'occupe de «renvois connus» lors de l'évolution de l'infrastructure? Si c'est le cas, comment?
  • Comment se connecter à Azure en utilisant Terraform?
  • TERRAFORM Comment puis-je avoir 1 cluster ecs avec 2 ou plus de définitions de services / tâches ecs?
  • Les astuces du serveur de linux et windows, tels que ubuntu, centos, apache, nginx, debian et des sujets de rĂ©seau.