Esse tipo de configuração em camadas é possível com o Terraform, mas requer um armazenamento intermediário para reter as informações da primeira configuração (infraestrutura, no seu caso) para que possa ser recuperado ao aplicar a segunda configuração (aplicativo).
A maneira mais simples de fazer isso é usar o mecanismo "estado remoto" incorporado do Terraform como armazenamento intermediário. Para fazer isso, você deve primeiro configurar um back-end remoto (assumindo o Terraform 0.9 ou posterior) na configuração da infraestrutura. Por exemplo, usando o Amazon S3 para armazenamento:
terraform {
backend "s3" {
bucket = "example-state-bucket"
key = "infrastructure.tfstate"
region = "us-east-1"
}
}
Cada vez que a configuração de back-end é alterada, é necessário executar terraform init
para sincronizar o estado com o novo local.
Qualquer informação que você queira expor na configuração do aplicativo deve ser declarada como uma "saída" da configuração da infraestrutura:
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}"
}
Após adicionar uma nova saída, execute terraform apply
para garantir que seu valor seja computado e gravado no estado.
Finalmente, estamos prontos para ler esse valor a partir da configuração do aplicativo usando a fonte de dados 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}"
}
Um exemplo mais elaborado desse padrão, usando o Consul como armazenamento intermediário de dados em vez do estado remoto Terraform, pode ser visto em minha série de artigos sobre Terraform Environment + Padrão de Aplicação . Qualquer armazenamento de dados que o Terraform possa gravar e ler pode, em princípio, ser usado para passar dados de uma configuração para outra.