Chave de API no código ou em variável de ambiente em texto claro é um dos achados mais comuns em auditorias de segurança. Neste post de apoio ao vídeo, mostro como usar o AWS Secrets Manager para guardar credenciais e lê-las a partir de uma AWS Lambda, usando uma IAM Role com permissão mínima.
O exemplo é um projeto real e open source: uma Lambda que consulta diariamente as CVEs publicadas na NVD, filtra as críticas e envia alertas para o Telegram.
O projeto: CVE Lambda Notifier
A função roda todos os dias e:
- Consulta a API da NVD (National Vulnerability Database) pelas CVEs publicadas nas últimas 24 horas.
- Filtra por palavras-chave de tecnologias que você usa (ex.:
apache,nginx,docker,zabbix) e por criticidade, com CVSS maior ou igual a 7. - Envia cada CVE relevante para um canal do Telegram, com o score e o link da NVD.
Para isso, a Lambda precisa de três informações sensíveis: a API key da NVD, o token do bot do Telegram e o ID do chat. É aqui que entra o Secrets Manager.

Recursos AWS utilizados
| Recurso | Papel no projeto |
|---|---|
| AWS Lambda (Python 3.11) | Executa a consulta, o filtro e o envio |
| AWS Secrets Manager | Guarda NVD_API_KEY, TELEGRAM_BOT_TOKEN e TELEGRAM_CHAT_ID |
| IAM Role | Dá à Lambda permissão de ler apenas aquele segredo |
| Amazon EventBridge Scheduler | Dispara a função todos os dias às 8h (horário de Brasília) |
| Amazon CloudWatch Logs | Registra CVEs recebidas, filtradas, enviadas e erros |
Por que não usar só variáveis de ambiente
Variáveis de ambiente da Lambda são práticas, mas o valor fica visível para qualquer pessoa com acesso de leitura à função, e costuma acabar copiado em templates, pipelines e prints. O Secrets Manager resolve isso:
- Criptografia com AWS KMS.
- Acesso controlado por IAM, por segredo.
- Auditoria no CloudTrail de quem leu o segredo e quando.
- Rotação, automática ou manual, sem precisar republicar o código.
No projeto, a variável de ambiente guarda só o nome do segredo (SECRET_NAME), nunca o valor.
Passo a passo resumido
1. Criar o segredo
No console do Secrets Manager, crie um segredo do tipo outro tipo de segredo com três pares chave/valor:
| Chave | Conteúdo |
|---|---|
NVD_API_KEY | Chave de API da NVD |
TELEGRAM_BOT_TOKEN | Token do bot criado no BotFather |
TELEGRAM_CHAT_ID | ID do canal ou usuário que recebe os alertas |
2. Dar permissão à Lambda
Na IAM Role da função, adicione uma política que permite apenas secretsmanager:GetSecretValue e apenas no ARN do seu segredo:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["secretsmanager:GetSecretValue"],
"Resource": "arn:aws:secretsmanager:REGIAO:CONTA:secret:NOME-DO-SEGREDO-xxxxxx"
}
]
}
Evite "Resource": "*". Se a função for comprometida, ela só consegue ler o segredo de que realmente precisa.
3. Ler o segredo no código
Com o boto3, já disponível no runtime Python da Lambda, a leitura é curta:
import boto3, json, os
def carregar_segredo(nome_segredo):
client = boto3.client("secretsmanager")
response = client.get_secret_value(SecretId=nome_segredo)
return json.loads(response["SecretString"])
segredos = carregar_segredo(os.getenv("SECRET_NAME"))
token = segredos["TELEGRAM_BOT_TOKEN"]
Ao carregar o segredo fora do handler, ele é lido uma vez por ambiente de execução e reaproveitado nas invocações seguintes. Isso economiza chamadas à API do Secrets Manager.
4. Deploy e agendamento
- Empacote as dependências e o código em um
.zip(o repositório tem umbuild.shque faz isso) e publique na Lambda com o handlerlambda_handler.lambda_handler. - No EventBridge Scheduler, crie uma schedule com o fuso
America/Sao_Pauloe a expressãocron(0 8 * * ? *), tendo a função como destino. - Configure retentativas e, se quiser rastreabilidade de falhas, uma DLQ no SQS.
Boas práticas
- Um segredo por aplicação e ambiente (dev, homologação, produção), com políticas IAM separadas.
- Habilite a rotação sempre que o provedor da credencial permitir.
- Nunca registre o valor do segredo em log. Cuidado com
printde dicionários inteiros. - Custo: o Secrets Manager cobra por segredo armazenado por mês e por volume de chamadas à API. Para parâmetros não sensíveis, o Parameter Store do Systems Manager pode ser mais barato.
Material de apoio
- Vídeo completo no canal: Como usar o AWS Secrets Manager para armazenar segredos de uma AWS Lambda Function
- Código do projeto no GitHub: cve-lambda-notifier-telegram
- Documentação oficial: O que é o AWS Secrets Manager?
O mesmo princípio de “segredo fora do código” foi aplicado na arquitetura do Score Trust: Score Trust: arquitetura serverless na AWS.

Atualmente atua como Architecture Manager pela Atos Brasil, entusiasta Microsoft, FreeBSD e Debian, com mais de 20 anos de experiência em infraestrutura de T.I com ambientes heterogêneos, possuí o título de Microsoft Certified Trainer, AWS Community Builder, FinOps Member Foundation, Membro do comitê público do IDCIBER e especialista em segurança de perímetro, tendo atuado com soluções como Isa Server, iptables, IPFW, Cisco ASA, SonicWall, Fortigate, pfSense e soluções de Web Application Firewall.
