terraform - unindo configurações de infraestrutura e aplicativo

1

Eu tenho 2 scripts para terraform: 1. usei para lançar os servidores de infra-estrutura (VPC, grupos de segurança, MySQL, Redis, Cassandra) e o segundo é iniciar o aplicativo (grupos de dimensionamento automático, balanceadores de carga, registros DNS).

Minha pergunta é qual é a melhor prática no gerenciamento desses arquivos de configuração. Desejo que os dois aplicativos estejam no mesmo AWS VPC (que será criado a partir do arquivo .tf da infraestrutura)

EDITAR : Para esclarecer melhor o meu ponto, eu tenho essa configuração em relação ao Terraform:

  • git repo infra
    • infra.tf
    • vpc.tf
  • aplicação reit git
    • app.tf
    • load_balancers.tf

Eu quero que toda a configuração * .tf seja implantada no mesmo AWS VPC, em 2 fases: primeiro os arquivos infra .tf e depois o aplicativo .tf

    
por koby meir 05.09.2016 / 13:48

1 resposta

0

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.

    
por 04.04.2017 / 00:50