De forma simples, Terraform é uma ferramenta de IaC comumente usada para abstrair o provisionamento (criação) de recursos de infraestrutura, a partir de arquivos de configuração declarativos (também chamada apenas de configuração).
No geral, esse é o formato de um arquivo terraform. Ele inclui algumas meta-configurações do Terraform no bloco terraform
, um módulo para provisionar máquinas virtuais e um recurso para provisionar bancos de dados.
terraform {
backend "remote" {
organization = "empresa_do_meu_chefe_e_nao_minha"
workspaces {
name = "app_da_empresa_e_nao_meu"
}
}
required_providers {
milkloud_provider = {
version = ">= 1.0.0"
source = "clouddemilhoes/milcloud"
}
}
}
resource "milcloud_database" "banco_de_dev_com_dado_de_prod" {
}
module "modulo_da_empresa_criar_vm" {
source = ""
version = ""
}
É responsável por configurar o comportamento do Terraform, como as dependências da configuração e onde o Terraform armazenará o estado resultante do provisionamento. Nesse exemplo, o estado será salvo na Terraform Cloud, no workspace app_da_empresa_e_nao_meu
dentro da organização empresa_do_meu_chefe_e_nao_minha
, devido ao uso do backend remote
.
terraform {
backend "remote" {
organization = "empresa_do_meu_chefe_e_nao_minha"
workspaces {
name = "app_da_empresa_e_nao_meu"
}
}
required_providers {
milkloud_provider = {
version = ">= 1.0.0"
source = "clouddemilhoes/milcloud"
}
}
}
O bloco de recurso é, no final das contas, o mais importante da configuração Terraform. Ele é constituído de 4 partes:
resource
, para indicar que um recurso será criado."milcloud_database"
.provider
.resource "milcloud_database" "banco_de_dev_com_dados_de_prod" {
instance_name = "o_banco"
size = "40G"
allow_deletion = false
}
Os módulos de Terraform são como funções ou classes em linguagens de programação modernas. Eles permitem abstrair diversos recursos e provisioná-los de uma vez só ou com padrões e boas-práticas pré-configurados.
Parecido com o bloco de recurso, ele é composto pelas seguintes partes:
module
, para indicar que um módulo será utilizado.provider
.Dois destes parâmetros são usados para o setup do módulo:
source
: obrigatório. indica onde código do módulo está, pode ser um repositório Git externo, uma pasta dentro do projeto…version
: opcional. indica qual versão do módulo utilizar.module "modulo_da_empresa_criar_vm" {
source = "clouddemilhoes/milcloud/vm"
version = ">= v1.2.3"
}
Após criar um arquivo de configuração, com extensão .tf
(por exemplo, main.tf
), descrevendo o estado desejado da sua infraestrutura, e executa-se os comandos para provisioná-la. Os comandos mais importantes são:
terraform plan
Exibe quais alterações irão ocorrer quando você provisionar os recursos.
terraform apply
Além de mostrar as alterações que vão ocorrer, efetivamente provisiona os recursos desejados.
terraform destroy
Destrói permanentemente os recursos provisionados anteriormente.