Gerenciamento de Credenciais AWS Bedrock¶
Guia de segurança para gerenciar credenciais AWS Bedrock no DestaquesGovbr.
🔒 Princípios de Segurança¶
- Nunca commitar credenciais no Git
- Usar IAM roles sempre que possível (em AWS)
- Rotacionar credenciais periodicamente (90 dias)
- Princípio de privilégio mínimo (apenas permissões necessárias)
- Monitorar uso com CloudTrail e CloudWatch
🎯 Modos de Autenticação¶
1. Desenvolvimento Local (Padrão)¶
Usa credenciais locais do AWS CLI.
Setup:
# Configurar via AWS CLI
aws configure
# Ou manualmente editar ~/.aws/credentials:
[default]
aws_access_key_id = AKIA...
aws_secret_access_key = ...
region = us-east-1
Uso no código:
from news_enrichment import BedrockLLMClient
# Usa ~/.aws/credentials automaticamente
client = BedrockLLMClient(
model_id="anthropic.claude-3-haiku-20240307-v1:0",
region="us-east-1"
)
2. Produção com Variáveis de Ambiente¶
Recomendado para: Cloud Run, containers, CI/CD.
Setup:
export AWS_ACCESS_KEY_ID="AKIA..."
export AWS_SECRET_ACCESS_KEY="..."
export AWS_DEFAULT_REGION="us-east-1"
Cloud Run:
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: enrichment-worker
spec:
template:
spec:
containers:
- image: gcr.io/.../enrichment:latest
env:
- name: AWS_ACCESS_KEY_ID
valueFrom:
secretKeyRef:
name: aws-credentials
key: access_key_id
- name: AWS_SECRET_ACCESS_KEY
valueFrom:
secretKeyRef:
name: aws-credentials
key: secret_access_key
Criar Secret:
gcloud secrets create aws-credentials \
--data-file=aws-credentials.json \
--replication-policy=automatic
3. IAM Roles (MAIS SEGURO) ⭐¶
Recomendado para: EC2, ECS, Lambda.
Vantagens: - ✅ Sem credenciais no código ou variáveis de ambiente - ✅ Rotação automática - ✅ Mais seguro (princípio de privilégio mínimo)
Setup:
-
Criar IAM Policy:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "bedrock:InvokeModel", "bedrock:InvokeModelWithResponseStream" ], "Resource": [ "arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-haiku-20240307-v1:0" ] } ] } -
Criar IAM Role:
aws iam create-role \ --role-name BedrockEnrichmentWorker \ --assume-role-policy-document file://trust-policy.json aws iam put-role-policy \ --role-name BedrockEnrichmentWorker \ --policy-name BedrockAccess \ --policy-document file://bedrock-policy.json -
Anexar role à instância EC2/ECS:
aws ec2 associate-iam-instance-profile \ --instance-id i-xxx \ --iam-instance-profile Name=BedrockEnrichmentWorker -
Código permanece o mesmo (boto3 detecta automaticamente):
client = BedrockLLMClient() # Sem credenciais!
4. AWS Secrets Manager¶
Recomendado para: Rotação automática, multi-ambiente.
Setup:
# Criar secret
aws secretsmanager create-secret \
--name bedrock-credentials \
--description "AWS credentials for Bedrock" \
--secret-string '{"access_key_id":"AKIA...","secret_access_key":"..."}'
Uso no código:
import boto3
import json
def get_bedrock_credentials():
"""Busca credenciais do Secrets Manager."""
secrets_client = boto3.client('secretsmanager', region_name='us-east-1')
response = secrets_client.get_secret_value(SecretId='bedrock-credentials')
credentials = json.loads(response['SecretString'])
return credentials
# Usar credenciais
creds = get_bedrock_credentials()
client = BedrockLLMClient(
model_id="anthropic.claude-3-haiku-20240307-v1:0",
region="us-east-1",
aws_access_key_id=creds['access_key_id'],
aws_secret_access_key=creds['secret_access_key']
)
5. Airflow Connection URI¶
Para integração com Airflow.
Formato:
aws://ACCESS_KEY:SECRET_KEY@/?region_name=REGION
Parser automático no worker:
# Em worker/handler.py (linhas 37-61)
def parse_aws_connection_uri(uri: str) -> Dict[str, str]:
"""
Parseia connection URI do Airflow.
Exemplo:
uri = "aws://AKIA...:SECRET@/?region_name=us-east-1"
→ {"access_key_id": "AKIA...", "secret_access_key": "SECRET", "region": "us-east-1"}
"""
from urllib.parse import urlparse, parse_qs
parsed = urlparse(uri)
query = parse_qs(parsed.query)
return {
"access_key_id": parsed.username,
"secret_access_key": parsed.password,
"region": query.get('region_name', ['us-east-1'])[0]
}
Configurar no Airflow:
# Via Airflow UI ou CLI
airflow connections add aws_bedrock \
--conn-type aws \
--conn-login AKIA... \
--conn-password SECRET \
--conn-extra '{"region_name": "us-east-1"}'
🔍 Ordem de Precedência¶
O boto3 busca credenciais nesta ordem:
- Parâmetros explícitos (
aws_access_key_id,aws_secret_access_key) - Variáveis de ambiente (
AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY) - Arquivo local (
~/.aws/credentials) - IAM role (se rodando em EC2/ECS/Lambda)
- Container credentials (ECS task role)
- Instance metadata (EC2 instance profile)
Isso garante flexibilidade sem alteração de código.
✅ Validação e Testes¶
Verificar Credenciais Ativas¶
# Verificar identidade
aws sts get-caller-identity
# Esperado:
# {
# "UserId": "AIDAI...",
# "Account": "123456789012",
# "Arn": "arn:aws:iam::123456789012:user/enrichment-worker"
# }
Verificar Acesso ao Bedrock¶
# Listar modelos disponíveis
aws bedrock list-foundation-models --region us-east-1 | grep claude
# Esperado:
# "modelId": "anthropic.claude-3-haiku-20240307-v1:0"
# "modelId": "anthropic.claude-3-sonnet-20240229-v1:0"
# "modelId": "anthropic.claude-3-opus-20240229-v1:0"
Testar Cliente Python¶
from news_enrichment import BedrockLLMClient
try:
client = BedrockLLMClient()
print("✅ Cliente Bedrock inicializado com sucesso")
print(f"Região: {client.region}")
print(f"Modelo: {client.model_id}")
except Exception as e:
print(f"❌ Erro: {e}")
🚨 Troubleshooting¶
Erro: "Unable to locate credentials"¶
Causa: Nenhuma credencial configurada.
Solução:
# 1. Verificar variáveis de ambiente
echo $AWS_ACCESS_KEY_ID
# 2. Verificar arquivo
cat ~/.aws/credentials
# 3. Configurar
aws configure
Erro: "AccessDeniedException"¶
Causa: Credenciais sem permissão para Bedrock.
Solução:
# Verificar permissões do usuário
aws iam get-user-policy --user-name enrichment-worker --policy-name BedrockAccess
# Adicionar política manualmente
aws iam put-user-policy \
--user-name enrichment-worker \
--policy-name BedrockAccess \
--policy-document file://bedrock-policy.json
Erro: "InvalidSignatureException"¶
Causa: Secret key incorreta ou expirada.
Solução:
# Rotacionar credenciais
aws iam create-access-key --user-name enrichment-worker
# Atualizar .env ou secret
export AWS_ACCESS_KEY_ID="nova-key"
export AWS_SECRET_ACCESS_KEY="nova-secret"
# Deletar credencial antiga (após validação)
aws iam delete-access-key --user-name enrichment-worker --access-key-id AKIA_OLD
🔄 Rotação de Credenciais¶
Rotação Manual (Recomendado: 90 dias)¶
# 1. Criar nova access key
aws iam create-access-key --user-name enrichment-worker > new-key.json
# 2. Atualizar secrets
gcloud secrets versions add aws-credentials --data-file=new-key.json
# 3. Deploy nova versão do worker
gcloud run deploy enrichment-worker --update-secrets=AWS_ACCESS_KEY_ID=aws-credentials:latest
# 4. Validar que funciona
curl https://enrichment-worker-xxx.a.run.app/health
# 5. Deletar credencial antiga
aws iam delete-access-key --user-name enrichment-worker --access-key-id AKIA_OLD
Rotação Automática (AWS Secrets Manager)¶
# Configurar rotação automática (90 dias)
aws secretsmanager rotate-secret \
--secret-id bedrock-credentials \
--rotation-lambda-arn arn:aws:lambda:us-east-1:123456789012:function:SecretsManagerRotation \
--rotation-rules AutomaticallyAfterDays=90
📊 Monitoramento¶
CloudTrail Events¶
Monitore chamadas à API Bedrock:
# Ver invocações recentes
aws cloudtrail lookup-events \
--lookup-attributes AttributeKey=ResourceType,AttributeValue=AWS::Bedrock::Model \
--max-results 10
CloudWatch Metrics¶
# Monitorar throttling
aws cloudwatch get-metric-statistics \
--namespace AWS/Bedrock \
--metric-name ThrottledRequests \
--dimensions Name=ModelId,Value=anthropic.claude-3-haiku-20240307-v1:0 \
--start-time 2026-05-05T00:00:00Z \
--end-time 2026-05-05T23:59:59Z \
--period 3600 \
--statistics Sum
Alertas Recomendados¶
| Métrica | Threshold | Ação |
|---|---|---|
InvalidSignature errors |
> 1 | Verificar credenciais |
AccessDenied errors |
> 1 | Verificar permissões |
ThrottledRequests |
> 10/hour | Reduzir paralelização |
UnauthorizedAccess attempts |
> 0 | Investigar segurança |
📝 Checklist de Segurança¶
- [ ] Credenciais NUNCA commitadas no Git
- [ ]
.envno.gitignore - [ ] Secrets armazenados em GCP Secret Manager ou AWS Secrets Manager
- [ ] IAM policy com princípio de privilégio mínimo
- [ ] Rotação de credenciais configurada (90 dias)
- [ ] CloudTrail logging habilitado
- [ ] Alertas de segurança configurados
- [ ] Teste de acesso realizado
- [ ] Documentação atualizada
📚 Referências¶
Interna¶
Externa¶
Última atualização: 05/05/2026
Responsável: Equipe DevSecOps - DestaquesGovbr
Revisão: Trimestral