Vault do ward
TLDR: Todo secret deste repo vive em vaults criptografados do ward, commitados no git; a chave privada nunca é. Todo comando de Terraform roda sob
ward exec. SOPS foi removido por completo.
Pré-requisitos
A chave de decriptação:
| Onde | Como |
|---|---|
| local | .ward/.key — gitignored, obtida com alguém de devops no config/access.yml |
| CI | o GitHub Secret WARD_KEY |
Passos
Rodar Terraform com os secrets injetados
bash
ward exec -- terraform plan
ward exec -- terraform apply
Os targets de make já embrulham o Terraform em ward exec — na prática você usa make shared.kubernetes.plan.
Editar um vault
bash
ward edit .ward/vaults/infrastructure/core.ward
ward edit .ward/vaults/infrastructure/shared/messagebroker.ward
ward edit .ward/vaults/bootstrap/accounts.ward
Adicionar um secret novo
ward edit <arquivo>.ward- Adicionar a chave no formato
KEY: value - Salvar — o ward re-encripta sozinho
- Referenciar no Terraform como
var.<key>; o ward injetaTF_VAR_*automaticamente
⚠️ Um override de ward substitui o arquivo inteiro, não faz merge por chave. Ao sobrescrever, leve todas as chaves existentes junto.
Inspecionar o que está sendo injetado
bash
ward envs # variáveis de ambiente resolvidas
ward tree # estrutura dos vaults
Vaults
Configurados em .ward/config.yaml:
| Vault | Caminho | Chave |
|---|---|---|
commons |
$COMMONS_DIR/.ward/vaults/commons |
WARD_KEY_COMMONS |
infrastructure |
.ward/vaults/infrastructure |
chave default |
bootstrap |
.ward/vaults/bootstrap |
chave default |
infrastructure/core.ward
Credenciais globais, compartilhadas por todos os stacks.
| Chave | Descrição |
|---|---|
TF_VAR_cloudflare_api_token |
token de API do Cloudflare |
TF_VAR_cloudflare_zone_id |
zone ID do Cloudflare |
TF_VAR_github_token |
PAT do GitHub — precisa de admin:org |
TF_VAR_dd_api_key |
chave de API do Datadog |
TF_VAR_domain |
domínio principal |
TF_VAR_kubernetes_version |
versão do Kubernetes do cluster compartilhado |
| credenciais da conta AWS | chaves da conta de management, usadas para assumir a TerraformRole |
| identificadores AWS | ID da conta shared, ID da conta de management, ID da Organization, região |
| credencial do backend de state | acesso ao bucket de state do Terraform |
O
TF_VAR_github_tokenprecisa do escopoadmin:orgenquanto o stackshared/githubgerir organization secrets —write:orgnão basta. Ver stack github precisa de token com admin:org.
infrastructure/shared/messagebroker.ward
| Chave | Descrição |
|---|---|
TF_VAR_shared_messagebroker_admin_password |
senha do admin do RabbitMQ no Amazon MQ |
O Amazon MQ tem restrição de senha: mínimo de 12 caracteres, sem vírgula.
bootstrap/accounts.ward
IDs de conta AWS e ARNs de role criados no bootstrap (make aws.account.create). Escrito
automaticamente pelo Terraform — raramente editado à mão.
| Chave | Descrição |
|---|---|
TF_VAR_aws_management_account_id |
ID da conta de management (12 dígitos) |
TF_VAR_aws_shared_account_id |
ID da conta shared--production (12 dígitos) |
TF_VAR_organization_id |
ID da AWS Organization — formato o-xxxxxxxxxx |
TF_VAR_aws_region |
região dos recursos compartilhados |
| credenciais da conta de management | chaves usadas pelo Terraform |
A
TerraformRolena conta shared precisa existir antes de qualquer outro stack compartilhado — ela é criada pelo bootstrap da conta.
Troubleshooting
terraform plan trava esperando entrada
Uma variável declarada no Terraform não existe no vault. ward envs | grep TF_VAR_ mostra o que está
sendo injetado. Causa clássica: divergência de caixa entre o nome da variável e a chave do vault — os
stacks deste repo usam nome minúsculo, e o ward mapeia TF_VAR_<name> direto.
O CI falha na decriptação
O GitHub Secret WARD_KEY está ausente ou desatualizado. Ele é o único secret de que o CI precisa
além das credenciais do próprio GitHub.
Referências
- Migração dos secrets para ward — a decisão original.
- Migração completa do repo para ward — a remoção final do SOPS.