06 de março de 2026 • 12 min de leitura
AWS Secrets Manager vs Parameter Store : Quando Usar Cada Um
No universo da AWS, escolher a ferramenta certa para gerenciar segredos e configurações pode impactar diretamente a segurança, a escalabilidade e o custo da sua aplicação. Neste artigo, exploramos as principais diferenças entre o AWS Secrets Manager e o AWS Systems Manager Parameter Store, destacando seus casos de uso ideais, vantagens, limitações e implicações de custo.
Ao projetar aplicações na Cloud, é comum surgir a dúvida sobre qual serviço utilizar para armazenar informações sensíveis e parâmetros de configuração. Escolher corretamente entre essas duas soluções pode impactar diretamente a segurança, a governança e a eficiência operacional do seu ambiente em nuvem.
O Cenário
"Onde vamos guardar as credenciais do banco de dados?"
"Parameter Store!" - disse o desenvolvedor júnior.
"Secrets Manager!" - disse o arquiteto sênior.
E começou a discussão. 30 minutos depois, ninguém tinha certeza de qual usar.
Spoiler: ambos estavam certos. E ambos estavam errados.
Deixa eu te contar o que aprendi depois de alguns anos trabalhando com AWS e gerenciamento de segredos.
Porque você precisa se preocupar?
Essa decisão não é trivial. Aqui está o que está em jogo:
O Custo da Escolha Errada:
Cenário Real 1 (Empresa que escolheu errado):
- 5.000 secrets no Secrets Manager
- Custo: $2.000/mês
- Problema: 80% eram configs simples (não secrets)
- Solução: Migrar para Parameter Store
- Economia: $1.600/mês = $19.200/ano
Cenário Real 2 (Empresa que escolheu certo):
- Credenciais de banco RDS no Secrets Manager
- Rotação automática habilitada
- Incidentes de segurança: 0 em 2 anos
- Compliance: Passou em todas as auditorias
O Problema:
Muitos times escolhem baseado em:
- "É mais barato" (sem considerar features)
- "Todo mundo usa" (sem entender o caso de uso)
- "Já conhecemos" (sem avaliar alternativas)
A Realidade:
Você precisa de AMBOS. A questão é: quando usar cada um?
AWS Secrets Manager
O Que É?
Secrets Manager é o serviço premium da AWS para gerenciar informações sensíveis. Pense nele como um cofre digital com superpoderes.
Principais Features
1. Rotação Automática de Secrets
Isso é ENORME. Vou mostrar um exemplo real:
# Criar secret com rotação automática para RDS
$ aws secretsmanager create-secret \
--name prod/db/mysql \
--description "MySQL master credentials" \
--secret-string '{"username":"admin","password":"MySecureP@ss123"}'
{
"ARN": "arn:aws:secretsmanager:us-east-1:123456789012:secret:prod/db/mysql-AbCdEf",
"Name": "prod/db/mysql",
"VersionId": "EXAMPLE1-90ab-cdef-fedc-ba987EXAMPLE"
}
# Habilitar rotação automática (a cada 30 dias)
$ aws secretsmanager rotate-secret \
--secret-id prod/db/mysql \
--rotation-lambda-arn arn:aws:lambda:us-east-1:123456789012:function:SecretsManagerRDSRotation \
--rotation-rules AutomaticallyAfterDays=30
{
"ARN": "arn:aws:secretsmanager:us-east-1:123456789012:secret:prod/db/mysql-AbCdEf",
"Name": "prod/db/mysql",
"VersionId": "EXAMPLE2-90ab-cdef-fedc-ba987EXAMPLE"
}O que acontece nos bastidores:
- Lambda é invocada automaticamente a cada 30 dias
- Cria nova senha no banco
- Testa a nova senha
- Atualiza o secret
- Marca a versão antiga como deprecated
- Suas aplicações pegam a nova senha automaticamente
Resultado: Zero downtime. Zero intervenção manual.
2. Versionamento Automático
Cada vez que você atualiza um secret, uma nova versão é criada:
# Atualizar secret
$ aws secretsmanager update-secret \
--secret-id prod/db/mysql \
--secret-string '{"username":"admin","password":"NewSecureP@ss456"}'
# Listar versões
$ aws secretsmanager list-secret-version-ids \
--secret-id prod/db/mysql
{
"Versions": [
{
"VersionId": "EXAMPLE2-90ab-cdef-fedc-ba987EXAMPLE",
"VersionStages": ["AWSCURRENT"],
"CreatedDate": 1609459200.0
},
{
"VersionId": "EXAMPLE1-90ab-cdef-fedc-ba987EXAMPLE",
"VersionStages": ["AWSPREVIOUS"],
"CreatedDate": 1606780800.0
}
]
}
# Recuperar versão anterior (rollback)
$ aws secretsmanager get-secret-value \
--secret-id prod/db/mysql \
--version-stage AWSPREVIOUSPor que isso importa:
Imagine que você rotacionou a senha e algo quebrou. Com versionamento, você faz rollback em segundos.
3. Integração Nativa com RDS, Redshift, DocumentDB
Esse é a feature diferencial do serviço:
# Criar secret vinculado ao RDS
$ aws secretsmanager create-secret \
--name prod/rds/postgres \
--secret-string '{"username":"postgres","password":"InitialP@ss"}' \
--tags Key=Database,Value=PostgreSQL
# Vincular ao RDS instance
$ aws rds modify-db-instance \
--db-instance-identifier my-postgres-db \
--master-user-password $(aws secretsmanager get-secret-value \
--secret-id prod/rds/postgres \
--query SecretString \
--output text | jq -r .password)Agora, quando você habilita rotação, o Secrets Manager:
- Conecta no RDS
- Cria novo usuário/senha
- Testa conexão
- Atualiza o secret
- Remove credenciais antigas
Tudo automaticamente. Sem Lambda customizada.
4. Auditoria Completa com CloudTrail
Toda operação é logada:
# Ver quem acessou o secret
$ aws cloudtrail lookup-events \
--lookup-attributes AttributeKey=ResourceName,AttributeValue=prod/db/mysql \
--max-results 10
{
"Events": [
{
"EventTime": "2026-03-06T10:30:00Z",
"Username": "api-service-role",
"EventName": "GetSecretValue",
"Resources": [{
"ResourceName": "prod/db/mysql"
}]
}
]
}Perfeito para compliance (SOC2, PCI-DSS, HIPAA).
Quando Usar Secrets Manager?
Use quando você tem:
-
Credenciais de banco de dados
- RDS, Aurora, Redshift, DocumentDB
- Precisa de rotação automática
- Compliance exige rotação periódica
-
API Keys de terceiros
- Stripe, Twilio, SendGrid
- Precisa rotacionar periodicamente
- Quer auditoria de acesso
-
Tokens OAuth/JWT
- Refresh tokens
- Service account tokens
- Precisa invalidar versões antigas
-
Requisitos de Compliance
- SOC2, PCI-DSS, HIPAA
- Auditoria obrigatória
- Rotação documentada
Custos do Secrets Manager
Aqui está a realidade dos custos:
Preço (us-east-1):
- $0.40 por secret por mês
- $0.05 por 10.000 API calls
Exemplo Real:
- 100 secrets
- 1 milhão de API calls/mês
- Custo: (100 × $0.40) + (1.000.000 / 10.000 × $0.05)
- Total: $40 + $5 = $45/mêsParece caro? Vamos comparar com o custo de um incidente de segurança:
- Vazamento de credenciais: R$20.000 - R$500.000
- Downtime por rotação manual: R$5.000 - R$50.000/hora
- Multa de compliance: R$10.000 - R$1.000.000
$45/mês parece barato agora, né?
AWS Systems Manager Parameter Store
O Que É?
Parameter Store é o canivete suíço da AWS para configurações. Ele guarda secrets, mas também configs, feature flags, e muito mais.
Principais Features
1. Três Tipos de Parâmetros
# Standard (grátis, até 10.000 parâmetros)
$ aws ssm put-parameter \
--name /app/config/api-url \
--value "https://api.example.com" \
--type String
# SecureString (criptografado com KMS)
$ aws ssm put-parameter \
--name /app/secrets/api-key \
--value "sk_live_abc123xyz" \
--type SecureString \
--key-id alias/aws/ssm
# Advanced (features extras, pago)
$ aws ssm put-parameter \
--name /app/config/feature-flags \
--value '{"new_ui":true,"beta_features":false}' \
--type String \
--tier Advanced \
--policies '[{"Type":"Expiration","Version":"1.0","Attributes":{"Timestamp":"2026-12-31T23:59:59Z"}}]'2. Hierarquia de Parâmetros
Organize por ambiente, aplicação, componente:
# Estrutura hierárquica
/production/
/api/
/database/
host
port
username
password
/redis/
host
port
/frontend/
/config/
api-url
cdn-url
# Buscar todos os parâmetros de um path
$ aws ssm get-parameters-by-path \
--path /production/api/database \
--recursive \
--with-decryption
{
"Parameters": [
{
"Name": "/production/api/database/host",
"Value": "prod-db.cluster-abc.us-east-1.rds.amazonaws.com",
"Type": "String"
},
{
"Name": "/production/api/database/password",
"Value": "MySecurePassword123",
"Type": "SecureString"
}
]
}3. Versionamento Manual
# Criar parâmetro
$ aws ssm put-parameter \
--name /app/config/max-connections \
--value "100" \
--type String
# Atualizar (cria nova versão)
$ aws ssm put-parameter \
--name /app/config/max-connections \
--value "200" \
--type String \
--overwrite
# Ver histórico
$ aws ssm get-parameter-history \
--name /app/config/max-connections
{
"Parameters": [
{
"Name": "/app/config/max-connections",
"Value": "200",
"Version": 2,
"LastModifiedDate": "2026-03-06T15:30:00Z"
},
{
"Name": "/app/config/max-connections",
"Value": "100",
"Version": 1,
"LastModifiedDate": "2026-03-01T10:00:00Z"
}
]
}
# Recuperar versão específica
$ aws ssm get-parameter \
--name /app/config/max-connections:14. Políticas de Expiração e Notificação
# Parâmetro com expiração (Apenas no Advanced)
$ aws ssm put-parameter \
--name /app/temp/beta-token \
--value "temp_token_xyz" \
--type SecureString \
--tier Advanced \
--policies '[
{
"Type":"Expiration",
"Version":"1.0",
"Attributes":{
"Timestamp":"2026-04-01T00:00:00Z"
}
},
{
"Type":"ExpirationNotification",
"Version":"1.0",
"Attributes":{
"Before":"7",
"Unit":"Days"
}
}
]'Você recebe notificação 7 dias antes de expirar!
Quando Usar Parameter Store?
Use quando você tem:
-
Configurações de Aplicação
- URLs de APIs
- Feature flags
- Timeouts, limites
- Configurações por ambiente
-
Secrets Simples (sem rotação)
- API keys que você rotaciona manualmente
- Tokens de integração
- Chaves de criptografia
-
Parâmetros de Infraestrutura
- AMI IDs
- VPC IDs
- Security Group IDs
- Subnet IDs
-
Valores Compartilhados
- Configurações usadas por múltiplos serviços
- Constantes do sistema
- Endpoints internos
-
Orçamento Limitado
- Standard tier é GRÁTIS
- Até 10.000 parâmetros
- Throughput: 1.000 TPS
Custos do Parameter Store
Standard Tier (GRÁTIS):
- Até 10.000 parâmetros
- Até 4KB por parâmetro
- 1.000 TPS (transactions per second)
- Sem políticas avançadas
Advanced Tier:
- $0.05 por parâmetro por mês
- Até 8KB por parâmetro
- 10.000 TPS
- Políticas de expiração/notificação
API Calls:
- Standard: GRÁTIS (primeiros 1 milhão/mês)
- Advanced: $0.05 por 10.000 API calls
Exemplo Real:
- 500 parâmetros standard (configs)
- 50 parâmetros advanced (secrets)
- 500.000 API calls/mês
- Custo: $0 + (50 × $0.05) + $0 = $2.50/mêsMuito mais barato que Secrets Manager!
Comparação Lado a Lado
| Feature | Secrets Manager | Parameter Store |
|---|---|---|
| Rotação Automática | Sim (built-in) | Não (manual) |
| Versionamento | Automático | Manual |
| Integração RDS | Nativa | Via Lambda |
| Custo | $0.40/secret/mês | GRÁTIS (standard) |
| Limite de tamanho | 64KB | 4KB (standard), 8KB (advanced) |
| Auditoria | CloudTrail | CloudTrail |
| Criptografia | KMS (obrigatório) | KMS (opcional) |
| Cross-region replication | Sim | Não |
| Políticas de expiração | Não | Sim (advanced) |
| Hierarquia | Via naming | Nativa |
| API throughput | Ilimitado | 1.000 TPS (standard) |
Cenários Reais de Uso
Vou mostrar 3 arquiteturas fictícias.
Cenário 1: E-commerce com Microserviços
Arquitetura:
Application Stack:
├── API Gateway
├── 15 microserviços (ECS Fargate)
├── RDS PostgreSQL (master + 2 replicas)
├── ElastiCache Redis
├── S3 + CloudFront
└── Integrações: Stripe, SendGrid, TwilioDecisão:
# Secrets Manager (rotação automática)
/prod/secrets/
├── rds/postgres-master # $0.40/mês
├── stripe/api-key # $0.40/mês
├── sendgrid/api-key # $0.40/mês
└── twilio/auth-token # $0.40/mês
# Parameter Store (configs)
/prod/config/
├── api/
│ ├── base-url # GRÁTIS
│ ├── timeout # GRÁTIS
│ └── max-connections # GRÁTIS
├── redis/
│ ├── host # GRÁTIS
│ └── port # GRÁTIS
└── feature-flags/
├── new-checkout # GRÁTIS
└── beta-features # GRÁTISCusto Total:
- Secrets Manager: 4 secrets × $0.40 = $1.60/mês
- Parameter Store: GRÁTIS
- Total: $1.60/mês
Benefício:
- Rotação automática de credenciais críticas
- Configs flexíveis sem custo
- Compliance garantido
Cenário 2: SaaS Multi-tenant
Arquitetura:
Multi-tenant SaaS:
├── 500 clientes
├── 1 banco por cliente (RDS)
├── Shared services (auth, billing, analytics)
└── Tenant-specific configsDecisão:
# Secrets Manager (1 secret por tenant)
/tenants/
├── tenant-001/rds-credentials # $0.40/mês
├── tenant-002/rds-credentials # $0.40/mês
└── ... (500 tenants)
# Parameter Store (configs por tenant)
/tenants/
├── tenant-001/
│ ├── plan # GRÁTIS
│ ├── features # GRÁTIS
│ └── limits # GRÁTIS
└── tenant-002/
├── plan # GRÁTIS
└── ...Custo Total:
- Secrets Manager: 500 × $0.40 = $200/mês
- Parameter Store: GRÁTIS (1.500 parâmetros)
- Total: $200/mês
Alternativa (se custo for problema):
# Usar Parameter Store SecureString para tudo
/tenants/
├── tenant-001/
│ ├── rds-credentials (SecureString) # GRÁTIS
│ ├── plan # GRÁTIS
│ └── features # GRÁTIS
# Implementar rotação manual via Lambda + EventBridge
# Custo: ~$5/mês (Lambda + EventBridge)
# Economia: $195/mêsTrade-off:
- Economia de $195/mês
- Mas: rotação manual, mais complexidade
- Decisão: depende do seu orçamento e requisitos de compliance
Cenário 3: Startup com Budget Apertado
Arquitetura:
MVP Stack:
├── 1 aplicação monolítica (ECS)
├── RDS PostgreSQL
├── Redis
└── 3 integrações externasDecisão (Budget-conscious):
# Parameter Store para TUDO (inicialmente)
/prod/
├── database/
│ ├── host # GRÁTIS
│ ├── port # GRÁTIS
│ ├── username # GRÁTIS
│ └── password (SecureString) # GRÁTIS
├── redis/
│ ├── host # GRÁTIS
│ └── port # GRÁTIS
└── integrations/
├── stripe-key (SecureString) # GRÁTIS
├── sendgrid-key (SecureString) # GRÁTIS
└── analytics-key (SecureString) # GRÁTISCusto Total: $0/mês 🎉
Plano de Migração (quando crescer):
# Fase 1: Startup (0-10k usuários)
- Tudo no Parameter Store
- Rotação manual trimestral
- Custo: $0/mês
# Fase 2: Growth (10k-100k usuários)
- Migrar DB credentials para Secrets Manager
- Manter configs no Parameter Store
- Custo: $0.40/mês
# Fase 3: Scale (100k+ usuários)
- Secrets Manager para todos os secrets críticos
- Parameter Store para configs
- Rotação automática habilitada
- Custo: $5-10/mêsLição: Comece simples, escale conforme necessário.
Implementação Prática
Para interagir com os serviços da AWS, precisamos utilizar o SDK para interagir. Vamos ver uma implementação de código com Python utilizando o Boto3.
Python (Boto3)
import boto3
import json
from botocore.exceptions import ClientError
# Clients
secrets_client = boto3.client('secretsmanager')
ssm_client = boto3.client('ssm')
# 1. Buscar secret do Secrets Manager
def get_secret(secret_name):
try:
response = secrets_client.get_secret_value(SecretId=secret_name)
return json.loads(response['SecretString'])
except ClientError as e:
print(f"Error: {e}")
raise
# 2. Buscar parâmetro do Parameter Store
def get_parameter(parameter_name, decrypt=True):
try:
response = ssm_client.get_parameter(
Name=parameter_name,
WithDecryption=decrypt
)
return response['Parameter']['Value']
except ClientError as e:
print(f"Error: {e}")
raise
# 3. Buscar múltiplos parâmetros por path
def get_parameters_by_path(path):
try:
response = ssm_client.get_parameters_by_path(
Path=path,
Recursive=True,
WithDecryption=True
)
return {p['Name']: p['Value'] for p in response['Parameters']}
except ClientError as e:
print(f"Error: {e}")
raise
# Uso
if __name__ == "__main__":
# Database credentials (Secrets Manager)
db_creds = get_secret('prod/db/postgres')
print(f"DB Host: {db_creds['host']}")
print(f"DB User: {db_creds['username']}")
# API URL (Parameter Store)
api_url = get_parameter('/prod/config/api-url')
print(f"API URL: {api_url}")
# Todas as configs de um ambiente
configs = get_parameters_by_path('/prod/config')
print(f"Configs: {configs}")Porque Nem Tudo Funciona de Primeira
Problema 1: Esqueci de Dar Permissão IAM
Primeira vez que tentei usar Secrets Manager:
db_creds = get_secret('prod/db/postgres')
# Error: AccessDeniedException
# User: arn:aws:iam::123456789012:user/developer is not authorized
# to perform: secretsmanager:GetSecretValue on resource: prod/db/postgresEsqueci de adicionar a policy IAM!
Solução:
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": [
"secretsmanager:GetSecretValue",
"secretsmanager:DescribeSecret"
],
"Resource": "arn:aws:secretsmanager:us-east-1:123456789012:secret:prod/*"
}]
}Problema 2: KMS Key Não Configurada
Tentei criar SecureString no Parameter Store:
$ aws ssm put-parameter \
--name /prod/secrets/api-key \
--value "secret123" \
--type SecureString
# Error: InvalidKeyId
# The request contains an invalid key identifierO que aconteceu: Por padrão, usa alias/aws/ssm, mas eu não tinha permissão.
Solução:
# Criar KMS key própria
$ aws kms create-key --description "SSM Parameters"
# Ou usar a key padrão com permissão correta
$ aws ssm put-parameter \
--name /prod/secrets/api-key \
--value "secret123" \
--type SecureString \
--key-id alias/aws/ssmProblema 3: Rotação Automática Quebrou a Aplicação
Habilitei rotação automática no Secrets Manager:
$ aws secretsmanager rotate-secret \
--secret-id prod/db/postgres \
--rotation-rules AutomaticallyAfterDays=302 semanas depois: aplicação começou a falhar intermitentemente.
O que aconteceu:
A aplicação estava cacheando as credenciais por 24 horas. Quando a rotação aconteceu, metade dos pods tinha credenciais antigas (que foram revogadas).
Solução:
import boto3
from datetime import datetime, timedelta
class SecretCache:
def __init__(self, secret_name, ttl_seconds=300): # 5 min cache
self.secret_name = secret_name
self.ttl_seconds = ttl_seconds
self.cached_secret = None
self.cached_at = None
self.client = boto3.client('secretsmanager')
def get_secret(self):
now = datetime.now()
# Cache expirado ou não existe
if (self.cached_secret is None or
self.cached_at is None or
(now - self.cached_at).seconds > self.ttl_seconds):
response = self.client.get_secret_value(
SecretId=self.secret_name
)
self.cached_secret = json.loads(response['SecretString'])
self.cached_at = now
return self.cached_secret
# Uso
cache = SecretCache('prod/db/postgres', ttl_seconds=300)
db_creds = cache.get_secret() # Revalida a cada 5 minutosLição: Sempre use cache com TTL curto ( de poucos minutos, até 10 ) para secrets que rotacionam.
Boas práticas
1. Naming Conventions
Use hierarquia consistente:
# Bom
/production/api/database/host
/production/api/database/password
/production/frontend/config/api-url
# Ruim
/prod-api-db-host
/api_database_password
/frontend-api-url2. Separação por Ambiente
# Estrutura recomendada
/{environment}/{application}/{component}/{parameter}
# Exemplos
/production/api/database/host
/staging/api/database/host
/development/api/database/host3. Tags para Organização
# Secrets Manager
$ aws secretsmanager tag-resource \
--secret-id prod/db/postgres \
--tags Key=Environment,Value=production \
Key=Application,Value=api \
Key=CostCenter,Value=engineering \
Key=Compliance,Value=pci-dss
# Parameter Store
$ aws ssm add-tags-to-resource \
--resource-type Parameter \
--resource-id /prod/config/api-url \
--tags Key=Environment,Value=production \
Key=Application,Value=api4. Least Privilege IAM
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"secretsmanager:GetSecretValue"
],
"Resource": [
"arn:aws:secretsmanager:us-east-1:123456789012:secret:prod/api/*"
]
},
{
"Effect": "Allow",
"Action": [
"ssm:GetParameter",
"ssm:GetParameters",
"ssm:GetParametersByPath"
],
"Resource": [
"arn:aws:ssm:us-east-1:123456789012:parameter/prod/api/*"
]
},
{
"Effect": "Allow",
"Action": [
"kms:Decrypt"
],
"Resource": [
"arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012"
]
}
]
}Nunca use "Resource": "*"!
Como decidir qual usar?
Indico fortemente que utilizem este fluxo para decidir:
Você precisa armazenar algo?
│
├─ É uma credencial que precisa rotacionar automaticamente?
│ │
│ ├─ SIM → Secrets Manager
│ │ └─ Exemplos: RDS, Redshift, DocumentDB credentials
│ │
│ └─ NÃO → Continue...
│
├─ É um secret crítico (API key, token, certificado)?
│ │
│ ├─ SIM → Precisa de compliance/auditoria rigorosa?
│ │ │
│ │ ├─ SIM → Secrets Manager
│ │ │ └─ Exemplos: PCI-DSS, HIPAA, SOC2
│ │ │
│ │ └─ NÃO → Orçamento é limitado?
│ │ │
│ │ ├─ SIM → Parameter Store (SecureString)
│ │ │ └─ Rotação manual via Lambda
│ │ │
│ │ └─ NÃO → Secrets Manager
│ │ └─ Melhor UX, menos manutenção
│ │
│ └─ NÃO → Continue...
│
└─ É uma configuração (não secret)?
│
└─ SIM → Parameter Store (Standard)
└─ Exemplos: URLs, feature flags, configsConclusão
A escolha entre Secrets Manager e Parameter Store não é "um ou outro". É "quando usar cada um".
Regra de Ouro:
Secrets Manager = Secrets críticos com rotação automática
Parameter Store = Configs + Secrets simples sem rotaçãoMinha Recomendação:
- Comece com Parameter Store (é grátis!)
- Migre secrets críticos para Secrets Manager conforme necessário
- Habilite rotação automática para DB credentials
- Monitore custos e otimize
E lembre-se: segurança não é custo, é investimento. Se você ainda tem secrets hardcoded no código, pare tudo e migre agora. Sério. Não espere acontecer um incidente.