Providers¶
Providers são plugins que permitem ao Terraform se comunicar com APIs externas — AWS, Azure, GCP, GitHub, Datadog, e centenas de outros. Sem um provider, o Terraform não sabe como criar nenhum recurso.
Como Funcionam os Providers¶
graph LR
TF[Terraform Core] -->|chama| P[AWS Provider]
P -->|API calls| AWS[AWS API]
AWS -->|resposta| P
P -->|resultado| TF
- Você declara qual provider usar e em qual versão
terraform initbaixa o plugin do provider- O provider traduz seus blocos
resourceem chamadas de API
Declarando o AWS Provider¶
Em qualquer projeto Terraform com AWS, você precisa de dois blocos:
# Declara a dependência do provider e sua versão
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
# Configura o provider (região, autenticação, etc.)
provider "aws" {
region = "us-east-1"
}
O que significa ~> 5.0?
O operador ~> (pessimistic constraint) significa "qualquer versão >= 5.0 e < 6.0". Isso garante compatibilidade com patches e minor releases sem aceitar breaking changes de uma versão major.
Autenticação com AWS¶
O AWS Provider usa a cadeia de credenciais padrão da AWS. Ele busca credenciais nesta ordem:
- Variáveis de ambiente (
AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY) - Perfil do AWS CLI (
~/.aws/credentials) - IAM Role (quando rodando em EC2, Lambda, ECS, etc.)
NUNCA faça isso
Credenciais hardcodadas vão parar no git e são um risco de segurança gravíssimo.Modo correto — variável de ambiente:
Ou especificar o perfil no provider (sem segredos no código):
Provider para LocalStack¶
Nas Fases 1–4, usamos o tflocal que configura os endpoints automaticamente. Mas para entender o que acontece por baixo, o provider ficaria assim:
provider "aws" {
region = "us-east-1"
access_key = "test" # LocalStack aceita qualquer valor
secret_key = "test"
# Redireciona todas as chamadas para o LocalStack local
endpoints {
s3 = "http://localhost:4566"
ec2 = "http://localhost:4566"
iam = "http://localhost:4566"
# ... e assim por diante
}
# Desativa verificações desnecessárias para ambiente local
skip_credentials_validation = true
skip_metadata_api_check = true
skip_requesting_account_id = true
}
O tflocal faz exatamente isso automaticamente. Você escreve código como se fosse AWS real, e o wrapper redireciona para o LocalStack.
O Arquivo .terraform.lock.hcl¶
Quando você roda terraform init, o Terraform cria um arquivo .terraform.lock.hcl:
provider "registry.terraform.io/hashicorp/aws" {
version = "5.31.0"
constraints = "~> 5.0"
hashes = [
"h1:abc123...",
]
}
Este arquivo deve ser commitado no git. Ele garante que todos no time (e o CI/CD) usem exatamente a mesma versão do provider, assim como um package-lock.json no Node.js.
Múltiplos Providers¶
É possível usar múltiplos providers em um mesmo projeto, inclusive duas instâncias do mesmo provider com aliases:
# Provider padrão — us-east-1
provider "aws" {
region = "us-east-1"
}
# Provider alternativo — eu-west-1
provider "aws" {
alias = "europe"
region = "eu-west-1"
}
# Usar o provider alternativo em um recurso específico
resource "aws_s3_bucket" "backup_europe" {
provider = aws.europe
bucket = "meu-backup-eu"
}
Próximo¶
➡️ Ciclo de Vida — agora vamos colocar a mão na massa e executar nosso primeiro terraform apply.