Conceitos Essenciais do Terraform
O Terraform é uma ferramenta de Infraestrutura como Código (IaC) desenvolvida pela HashiCorp, permitindo a definição, provisionamento e gerenciamento de infraestrutura de forma declarativa e automatizada.
Documentação oficial
Terraform Registry
Providers
Os providers são responsáveis por interagir com APIs de serviços de infraestrutura, como AWS, Azure, Google Cloud, entre outros. Eles permitem que o Terraform crie, modifique e destrua recursos nesses serviços.
provider "aws" {
region = "us-west-2"
}
Resources (Recursos)
Os resources representam os componentes da infraestrutura que você deseja criar ou gerenciar, como instâncias de máquinas virtuais, buckets de armazenamento, regras de firewall, etc.
resource "aws_instance" "example" {
ami = "ami-12345678"
instance_type = "t2.micro"
}
Variables (Variáveis)
As variáveis permitem parametrizar os recursos, tornando o código mais reutilizável e flexível.
variable "instance_type" {
type = string
default = "t2.micro"
}
Outputs
Os outputs são valores que o Terraform retorna após a execução, úteis para fornecer informações sobre os recursos criados, como endereços IP ou IDs de instâncias.
output "instance_ip" {
value = aws_instance.example.public_ip
}
State (Estado)
O state é o arquivo que mantém o mapeamento entre os recursos definidos no código e os recursos reais na infraestrutura. Ele é essencial para o Terraform determinar o que precisa ser criado, modificado ou destruído.
Plan / Apply / Destroy
terraform plan: Gera um plano de execução, mostrando o que será alterado na infraestrutura.terraform apply: Aplica as mudanças definidas no código à infraestrutura.terraform destroy: Remove todos os recursos gerenciados pelo Terraform.
Estrutura Recomendada de Arquivos
Uma boa estrutura de arquivos facilita a manutenção e escalabilidade do projeto. Abaixo está uma estrutura modularizada e organizada:
projeto_terraform/
│
├── modules/ # Módulos reutilizáveis
│ ├── webserver/ # Módulo para servidor web
│ │ ├── main.tf
│ │ ├── variables.tf
│ │ └── outputs.tf
│ └── database/ # Módulo para banco de dados
│ ├── main.tf
│ ├── variables.tf
│ └── outputs.tf
│
├── envs/ # Ambientes
│ ├── dev/ # Ambiente de desenvolvimento
│ │ ├── main.tf
│ │ └── terraform.tfvars
│ ├── staging/ # Ambiente de staging
│ │ └── terraform.tfvars
│ └── prod/ # Ambiente de produção
│ └── terraform.tfvars
│
├── main.tf # Arquivo principal de configuração
├── variables.tf # Declaração de variáveis
├── outputs.tf # Definição de outputs
├── providers.tf # Configuração dos providers
└── versions.tf # Versões do Terraform e dos providers
Descrição dos Arquivos
main.tf: Contém a definição dos recursos principais da infraestrutura.variables.tf: Declara as variáveis utilizadas nos arquivos de configuração.outputs.tf: Define os valores que serão retornados após a execução.providers.tf: Configura os providers necessários para o projeto.versions.tf: Especifica as versões mínimas do Terraform e dos providers a serem utilizados.
Módulos
Os módulos são unidades reutilizáveis de configuração. Eles permitem organizar o código de forma modular, facilitando a manutenção e reutilização em diferentes partes do projeto.
module "webserver" {
source = "./modules/webserver"
instance_type = var.instance_type
}
Ambientes
A estrutura de ambientes permite isolar configurações específicas para diferentes estágios do ciclo de vida do projeto, como desenvolvimento, staging e produção.
module "dev" {
source = "../modules/webserver"
instance_type = "t2.micro"
}