Terraform e Azure¶
Este projeto inclui configurações Terraform para provisionar infraestrutura na Azure, criando um ambiente completo de Data Lake com Azure Storage e Azure Databricks.
Visão Geral da Infraestrutura¶
O Terraform cria os seguintes recursos na Azure:
Recursos Principais¶
- Resource Group:
rgdata{company}{env}01
- Storage Account:
stacdata{company}{env}01
- Storage Containers:
landingzone
,bronze
,silver
,gold
- Azure Databricks Workspace: Para processamento de big data
- Key Vault: Para gerenciamento seguro de credenciais
Organização por Camadas¶
Azure Storage Account
├── landingzone/ # Dados brutos ingeridos
├── bronze/ # Dados estruturados
├── silver/ # Dados limpos e validados
└── gold/ # Dados agregados e prontos para análise
Arquivos Terraform¶
main.tf¶
Contém a definição dos recursos principais:
# Resource Group
resource "azurerm_resource_group" "rgdata01" {
name = "rgdata${var.company}${var.env}01"
location = var.default_location
}
# Storage Account
resource "azurerm_storage_account" "stacdata01" {
name = local.stgaccname
resource_group_name = azurerm_resource_group.rgdata01.name
location = azurerm_resource_group.rgdata01.location
account_tier = "Standard"
account_replication_type = "LRS"
is_hns_enabled = true
}
variables.tf¶
Define as variáveis configuráveis:
variable "env" {
type = string
default = ""
description = "Ambiente (dev, prod, etc.)"
}
variable "company" {
default = "trabalhoed"
type = string
description = "Nome da empresa/projeto"
}
variable "default_location" {
default = "Brazil South"
type = string
description = "Região do Azure"
}
providers.tf¶
Configura os provedores necessários:
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~>3.0"
}
azuread = {
source = "hashicorp/azuread"
version = "~>2.0"
}
}
}
provider "azurerm" {
features {}
}
Configuração e Deploy¶
1. Pré-requisitos¶
# Instalar Azure CLI
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
# Instalar Terraform
wget https://releases.hashicorp.com/terraform/1.6.0/terraform_1.6.0_linux_amd64.zip
unzip terraform_1.6.0_linux_amd64.zip
sudo mv terraform /usr/local/bin/
# Fazer login na Azure
az login
2. Configurar Variáveis¶
Crie um arquivo terraform.tfvars
:
3. Executar Terraform¶
# Navegar para a pasta terraform
cd terraform
# Inicializar Terraform
terraform init
# Validar configuração
terraform validate
# Ver plano de execução
terraform plan
# Aplicar mudanças
terraform apply
Recursos Criados¶
Storage Account¶
- Nome:
stacdatatrabalhoeddev01
(exemplo) - Tipo: Standard LRS
- Hierarquia: Habilitada (Data Lake Gen2)
- Containers: landingzone, bronze, silver, gold
Azure Databricks¶
- SKU: Standard
- Managed Resource Group: Criado automaticamente
- Integração: Key Vault para secrets
Key Vault¶
- Policies: Configuradas para Databricks
- Secrets: Conexões de banco e storage
- Acesso: Baseado em roles
Configuração de Secrets¶
Connection Strings¶
O Terraform configura automaticamente os secrets necessários:
resource "azurerm_key_vault_secret" "storage_connection" {
name = "storage-connection-string"
value = azurerm_storage_account.stacdata01.primary_connection_string
key_vault_id = azurerm_key_vault.kvdata01.id
}
Databricks Secrets¶
# Configurar CLI do Databricks
databricks configure --token
# Criar scope de secrets
databricks secrets create-scope --scope "azkvscope"
# Listar secrets
databricks secrets list --scope "azkvscope"
Customização¶
Ambientes Múltiplos¶
Para criar ambientes separados:
# Desenvolvimento
terraform workspace new dev
terraform apply -var="env=dev"
# Produção
terraform workspace new prod
terraform apply -var="env=prod"
Configurações Regionais¶
Para outras regiões:
Monitoramento e Gestão¶
Outputs Importantes¶
O Terraform expõe informações úteis:
output "storage_account_name" {
value = azurerm_storage_account.stacdata01.name
}
output "storage_connection_string" {
value = azurerm_storage_account.stacdata01.primary_connection_string
sensitive = true
}
output "databricks_workspace_url" {
value = azurerm_databricks_workspace.dbw01.workspace_url
}
Ver Outputs¶
# Ver todos os outputs
terraform output
# Ver output específico
terraform output storage_account_name
# Ver outputs sensíveis
terraform output -raw storage_connection_string
Integração com o Pipeline ETL¶
Atualizar .env¶
Após o deploy, atualize seu .env
:
# Usar outputs do Terraform
export STORAGE_NAME=$(terraform output -raw storage_account_name)
export CONNECTION_STRING=$(terraform output -raw storage_connection_string)
# Atualizar .env
echo "AZURE_STORAGE_CONNECTION_STRING=$CONNECTION_STRING" >> .env
echo "AZURE_CONTAINER_NAME=landingzone" >> .env
Configurar Databricks¶
- Acesse o workspace do Databricks
- Configure clusters para processamento
- Import notebooks do projeto
- Configure secrets para conexões
Troubleshooting¶
Erro de Autenticação¶
Erro de Recursos¶
# Verificar quotas da subscription
az vm list-usage --location "Brazil South" -o table
# Verificar providers registrados
az provider list --query "[?registrationState=='Registered']" -o table
Rollback¶
# Ver histórico de state
terraform show
# Rollback específico (cuidado!)
terraform import azurerm_storage_account.stacdata01 /subscriptions/.../resourceGroups/.../providers/Microsoft.Storage/storageAccounts/...
Limpeza de Recursos¶
Destruir Infraestrutura¶
# Ver o que será destruído
terraform plan -destroy
# Destruir recursos
terraform destroy
# Confirmar destruição
# Digite "yes" quando solicitado
Limpeza Manual¶
Se necessário, remova recursos manualmente:
# Listar resource groups
az group list -o table
# Deletar resource group (remove todos os recursos)
az group delete --name rgdatatrabalhoeddev01 --yes --no-wait
Melhores Práticas¶
- Versionamento: Use tags Git para versionar infraestrutura
- State Backend: Configure backend remoto para produção
- Terraform Cloud: Use para equipes maiores
- Modules: Modularize código para reutilização
- Security: Nunca commite
terraform.tfvars
com dados sensíveis