Se você trabalha com mais de uma conta AWS — e se é SRE ou DevOps, provavelmente trabalha com várias — já deve ter sentido o medo de rodar um terraform destroy na conta errada. O aws-vault resolve esse problema e mais alguns.

O problema

O jeito padrão de configurar credenciais AWS é jogar access keys no ~/.aws/credentials. Funciona, mas tem problemas sérios:

  • As chaves ficam em texto puro no disco
  • É fácil confundir qual perfil está ativo
  • Não há rotação automática
  • Se alguém acessa seu home, tem suas chaves

Quando você gerencia 5, 10, 20 contas de clientes diferentes, isso vira uma bomba-relógio.

O que é o aws-vault

O aws-vault é uma ferramenta que armazena suas credenciais AWS no keychain do sistema operacional (ou em backends criptografados) e gera credenciais temporárias via STS quando você precisa.

Na prática:

  • Suas access keys nunca ficam em texto puro
  • Cada sessão usa credenciais temporárias com expiração
  • Você assume roles em contas diferentes de forma simples
  • Funciona com SSO, MFA e assume role

Instalação

Linux

1
2
3
4
5
6
7
8
9
# Download do binário
curl -L -o aws-vault https://github.com/99designs/aws-vault/releases/latest/download/aws-vault-linux-amd64
chmod +x aws-vault
sudo mv aws-vault /usr/local/bin/

# ARM (Raspberry Pi, Graviton, etc.)
curl -L -o aws-vault https://github.com/99designs/aws-vault/releases/latest/download/aws-vault-linux-arm64
chmod +x aws-vault
sudo mv aws-vault /usr/local/bin/

macOS

1
brew install aws-vault

Verificar

1
aws-vault --version

Configuração Inicial

Passo 1: Escolher o backend

No Linux sem interface gráfica (servidores, Termux, WSL), use o backend de arquivo criptografado:

1
export AWS_VAULT_BACKEND=file

Adicione ao seu ~/.bashrc ou ~/.zshrc para persistir:

1
echo 'export AWS_VAULT_BACKEND=file' >> ~/.bashrc

Na primeira vez que adicionar credenciais, ele vai pedir uma senha para criptografar o vault.

Passo 2: Adicionar credenciais

1
aws-vault add meu-perfil-pessoal

Ele vai pedir a Access Key ID e Secret Access Key. As chaves são armazenadas criptografadas — não no ~/.aws/credentials.

Passo 3: Configurar perfis com assume role

Aqui é onde a mágica acontece. No ~/.aws/config, você define perfis que assumem roles em outras contas:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# Conta principal (onde estão as chaves)
[profile meu-perfil-pessoal]
region = us-east-1
mfa_serial = arn:aws:iam::123456789012:mfa/meu-usuario

# Conta de desenvolvimento
[profile projeto-alpha-dev]
source_profile = meu-perfil-pessoal
role_arn = arn:aws:iam::111111111111:role/SRE-CrossAccountRole
region = us-east-1

# Conta de staging
[profile projeto-alpha-staging]
source_profile = meu-perfil-pessoal
role_arn = arn:aws:iam::222222222222:role/SRE-CrossAccountRole
region = us-east-1

# Conta de produção
[profile projeto-alpha-prod]
source_profile = meu-perfil-pessoal
role_arn = arn:aws:iam::333333333333:role/SRE-CrossAccountRole
region = sa-east-1
mfa_serial = arn:aws:iam::123456789012:mfa/meu-usuario

# Outro cliente
[profile projeto-beta-prod]
source_profile = meu-perfil-pessoal
role_arn = arn:aws:iam::444444444444:role/AdminRole
region = us-east-1

Uso no Dia a Dia

Executar comandos em uma conta específica

1
2
3
4
5
# Listar instâncias EC2 na conta de dev
aws-vault exec projeto-alpha-dev -- aws ec2 describe-instances

# Verificar quem eu sou nessa conta
aws-vault exec projeto-alpha-prod -- aws sts get-caller-identity

O aws-vault exec faz o assume role, gera credenciais temporárias e injeta como variáveis de ambiente no subprocesso. Quando o comando termina, as credenciais somem.

Abrir uma shell inteira na conta

1
aws-vault exec projeto-alpha-dev

Isso abre um subshell com as credenciais da conta. Tudo que você rodar ali dentro (aws cli, terraform, ansible) vai usar aquela conta. Para sair, exit.

Abrir o console AWS no navegador

1
aws-vault login projeto-alpha-prod

Abre o console web da AWS já autenticado na conta certa. Muito útil para verificações rápidas.

Listar perfis e sessões ativas

1
aws-vault list

Saída:

P=mppppr=errrro=uoooof=-jjjji=peeeel=etttte=roooof----iaaablllle-ppptphhhaeaaa-s---psdsproetroavaodlgdingC=mmmmmr=eeeeee=uuuuud=-----e=pppppn=eeeeet=rrrrri=fffffa=iiiiil=llllls=-----pppppeeeeessssssssssoooooaaaaalllllS=se=ts=ss=.i=Ao=sn=ss=umeRole:47m32s

Com MFA

Se a conta exige MFA (e deveria), o aws-vault pede o token automaticamente:

1
2
$ aws-vault exec projeto-alpha-prod -- aws s3 ls
Enter token for arn:aws:iam::123456789012:mfa/meu-usuario: 123456

Ele cacheia a sessão MFA, então você não precisa digitar o token a cada comando dentro da janela de validade (geralmente 1 hora).

Com AWS SSO (Identity Center)

Se sua organização usa AWS SSO:

1
2
3
4
5
6
[profile empresa-sso]
sso_start_url = https://minha-empresa.awsapps.com/start
sso_region = us-east-1
sso_account_id = 123456789012
sso_role_name = AdministratorAccess
region = us-east-1
1
2
3
4
5
# Login SSO
aws-vault login empresa-sso

# Executar comandos
aws-vault exec empresa-sso -- aws s3 ls

Dicas Práticas

1. Alias para contas frequentes

No ~/.bashrc:

1
2
3
alias aws-dev='aws-vault exec projeto-alpha-dev --'
alias aws-stg='aws-vault exec projeto-alpha-staging --'
alias aws-prd='aws-vault exec projeto-alpha-prod --'

Uso:

1
2
aws-dev aws ec2 describe-instances
aws-prd aws s3 ls

2. Duração da sessão

Por padrão, as credenciais temporárias duram 1 hora. Para ajustar:

1
2
3
4
[profile projeto-alpha-dev]
source_profile = meu-perfil-pessoal
role_arn = arn:aws:iam::111111111111:role/SRE-CrossAccountRole
duration_seconds = 3600

O máximo depende da configuração da role na conta destino (até 12 horas).

3. Usar com Terraform

1
2
aws-vault exec projeto-alpha-dev -- terraform plan
aws-vault exec projeto-alpha-dev -- terraform apply

Ou abra uma shell e trabalhe normalmente:

1
2
3
4
5
aws-vault exec projeto-alpha-dev
terraform init
terraform plan
terraform apply
exit  # sai da sessão

4. Usar com scripts

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#!/bin/bash
# deploy.sh - Deploy para staging e produção

echo "=== Deploy Staging ==="
aws-vault exec projeto-alpha-staging -- ./deploy-to-ecs.sh

echo "=== Testes de Smoke ==="
aws-vault exec projeto-alpha-staging -- ./smoke-tests.sh

read -p "Deploy para produção? (y/n) " confirm
if [ "$confirm" = "y" ]; then
    echo "=== Deploy Produção ==="
    aws-vault exec projeto-alpha-prod -- ./deploy-to-ecs.sh
fi

5. Prompt do terminal com conta ativa

Adicione ao ~/.bashrc para saber em qual conta você está:

1
2
3
4
5
6
aws_prompt() {
    if [ -n "$AWS_VAULT" ]; then
        echo " ☁️ $AWS_VAULT"
    fi
}
PS1='$(aws_prompt)\u@\h:\w\$ '

Resultado:

projeto-alpha-prodfabricio@deck:~$

Isso evita aquele momento de pânico: “em qual conta eu estou mesmo?”

O que NÃO fazer

❌ Nunca exporte credenciais permanentes

1
2
3
# NÃO FAÇA ISSO
export AWS_ACCESS_KEY_ID=AKIA...
export AWS_SECRET_ACCESS_KEY=wJalr...

Se você precisa de variáveis de ambiente, use:

1
2
# Isso gera credenciais temporárias
eval $(aws-vault exec meu-perfil -- env | grep AWS)

❌ Nunca commite o ~/.aws/credentials

Adicione ao .gitignore global:

1
2
echo '.aws/credentials' >> ~/.gitignore_global
git config --global core.excludesfile ~/.gitignore_global

❌ Nunca use a mesma access key para tudo

Uma key por finalidade. Se uma vazar, você revoga só aquela.

Troubleshooting

“NoCredentialProviders”

NoCredentialProviders:novalidprovidersinchain

Verifique se o source_profile no ~/.aws/config bate com o nome usado no aws-vault add.

“AccessDenied ao assumir role”

Anerroroccurred(AccessDenied)whencallingtheAssumeRoleoperation

Verifique:

  1. A role existe na conta destino
  2. A trust policy da role permite seu usuário
  3. O role_arn está correto no config

“Token expirado”

ExpiredToken:Thesecuritytokenincludedintherequestisexpired

Saia do subshell e entre novamente:

1
2
exit
aws-vault exec projeto-alpha-dev

Comparação: com e sem aws-vault

AspectoSem aws-vaultCom aws-vault
ArmazenamentoTexto puro em ~/.aws/credentialsCriptografado no keychain/vault
CredenciaisPermanentesTemporárias (STS)
Troca de contaEditar variáveis ou –profileaws-vault exec perfil
MFAManual a cada chamadaCacheado por sessão
Risco de vazamentoAltoBaixo
AuditoriaDifícil (mesma key sempre)Fácil (sessões distintas no CloudTrail)

Conclusão

O aws-vault é uma daquelas ferramentas que depois que você começa a usar, não entende como vivia sem. O investimento de configuração é de 15 minutos e o retorno é:

  • Segurança: credenciais nunca ficam expostas em texto puro
  • Praticidade: trocar entre contas é um comando
  • Auditoria: cada sessão aparece separada no CloudTrail
  • Tranquilidade: saber exatamente em qual conta você está antes de rodar qualquer coisa

Se você gerencia múltiplas contas AWS, pare de usar ~/.aws/credentials em texto puro. Seu eu do futuro agradece.


Links úteis: