Kiro: Transformando DevOps com Agentes de IA

Você é um especialista em DevOps fazendo malabarismos com pipelines de integração e deployment contínuo (CI/CD), provisionamento de infraestrutura e serviços de produtividade do desenvolvedor em um ambiente Amazon Web Services (AWS). Provavelmente já se perguntou: “Com todas essas ofertas de inteligência artificial generativa, existe um serviço que pode realmente tornar meu trabalho mais eficiente?” A resposta é sim. Neste post, apresento o Kiro, um serviço de desenvolvimento de IA agêntica, e mostro como ele pode economizar horas em suas tarefas diárias de automação. Aprenda como a interface de linha de comando (CLI) do Kiro transforma a automação DevOps com agentes alimentados por IA que instalam, configuram e fazem deploy de infraestrutura usando comandos em linguagem natural em minutos. ...

December 16, 2025 · 11 min · 2156 words · Matheus Costa

Top Announcements of AWS re:Invent 2025

🚀 Introdução O AWS re:Invent 2025 aconteceu em Las Vegas e trouxe uma série de anúncios revolucionários que vão transformar como trabalhamos com cloud computing. Como especialista em AWS, vou compartilhar os principais lançamentos e seu impacto prático. Este evento é sempre um marco para a comunidade tech, e este ano não foi diferente. Vamos explorar os anúncios mais importantes e como eles podem beneficiar seus projetos. 📊 Analytics AWS Clean Rooms - Geração de Datasets com Privacidade Treine modelos de ML em dados colaborativos sensíveis gerando datasets sintéticos que preservam padrões estatísticos enquanto protegem a privacidade individual através de níveis configuráveis de ruído e proteção contra re-identificação. ...

December 16, 2025 · 8 min · 1587 words · Matheus Costa

DevSecOps vs. O Caos: Testando a Amazon Q em um Mundo Real (e Nada Perfeito)

DevSecOps vs. O Caos: Testando a Amazon Q em um Mundo Real (e Nada Perfeito) Evento: Evento Técnico DevSecOps Data: 29 de Setembro de 2025 Local: Online Duração: 45 minutos Público: DevOps Engineers, Security Engineers, Desenvolvedores 📋 Sobre a Palestra 💡 O que acontece quando colocamos a Amazon Q para resolver problemas reais em ambientes bagunçados? Nesta apresentação, mostro na prática como a Amazon Q se comporta quando confrontada com a realidade: pipelines quebrados, configurações malfeitas e riscos de segurança. Com humor, demos ao vivo e aprendizados reais, exploramos os limites e possibilidades da IA em cenários DevSecOps do mundo real. ...

September 29, 2025 · 3 min · 463 words · Matheus Costa

IA e Automação na AWS: Implementando Soluções Inteligentes

Introdução A AWS oferece um ecossistema completo de serviços de IA que permite implementar soluções inteligentes sem a necessidade de expertise profunda em machine learning. Este guia explora como usar esses serviços para automatizar processos e criar aplicações mais inteligentes. Serviços de IA da AWS 1. Amazon Comprehend - Análise de Texto Análise de Sentimento import boto3 import json def analyze_sentiment(text): """Analisar sentimento de texto usando Comprehend""" comprehend = boto3.client('comprehend') response = comprehend.detect_sentiment( Text=text, LanguageCode='pt' ) return { 'sentiment': response['Sentiment'], 'confidence': response['SentimentScore'] } # Exemplo de uso text = "Estou muito satisfeito com o atendimento da empresa!" result = analyze_sentiment(text) print(f"Sentimento: {result['sentiment']}") print(f"Confiança: {result['confidence']}") Extração de Entidades def extract_entities(text): """Extrair entidades nomeadas do texto""" comprehend = boto3.client('comprehend') response = comprehend.detect_entities( Text=text, LanguageCode='pt' ) entities = [] for entity in response['Entities']: entities.append({ 'text': entity['Text'], 'type': entity['Type'], 'confidence': entity['Score'] }) return entities # Exemplo text = "João Silva trabalha na Amazon em São Paulo desde 2020" entities = extract_entities(text) for entity in entities: print(f"{entity['text']} - {entity['type']} ({entity['confidence']:.2f})") 2. Amazon Rekognition - Análise de Imagens Detecção de Objetos def detect_objects_in_image(bucket_name, image_key): """Detectar objetos em imagem do S3""" rekognition = boto3.client('rekognition') response = rekognition.detect_labels( Image={ 'S3Object': { 'Bucket': bucket_name, 'Name': image_key } }, MaxLabels=10, MinConfidence=80 ) objects = [] for label in response['Labels']: objects.append({ 'name': label['Name'], 'confidence': label['Confidence'], 'instances': len(label.get('Instances', [])) }) return objects Reconhecimento Facial def detect_faces(bucket_name, image_key): """Detectar faces em imagem""" rekognition = boto3.client('rekognition') response = rekognition.detect_faces( Image={ 'S3Object': { 'Bucket': bucket_name, 'Name': image_key } }, Attributes=['ALL'] ) faces = [] for face in response['FaceDetails']: faces.append({ 'age_range': face['AgeRange'], 'gender': face['Gender']['Value'], 'emotions': [ { 'type': emotion['Type'], 'confidence': emotion['Confidence'] } for emotion in face['Emotions'] if emotion['Confidence'] > 50 ] }) return faces 3. Amazon Polly - Text-to-Speech def text_to_speech(text, output_bucket, output_key): """Converter texto em áudio usando Polly""" polly = boto3.client('polly') s3 = boto3.client('s3') # Sintetizar fala response = polly.synthesize_speech( Text=text, OutputFormat='mp3', VoiceId='Camila', # Voz em português brasileiro LanguageCode='pt-BR' ) # Salvar no S3 s3.put_object( Bucket=output_bucket, Key=output_key, Body=response['AudioStream'].read(), ContentType='audio/mpeg' ) return f"s3://{output_bucket}/{output_key}" # Exemplo audio_url = text_to_speech( "Olá! Este é um exemplo de síntese de voz usando Amazon Polly.", "my-audio-bucket", "speech/example.mp3" ) Casos de Uso Práticos 1. Análise Automática de Feedback de Clientes import boto3 from datetime import datetime import json class FeedbackAnalyzer: def __init__(self): self.comprehend = boto3.client('comprehend') self.dynamodb = boto3.resource('dynamodb') self.sns = boto3.client('sns') self.table = self.dynamodb.Table('customer-feedback') def process_feedback(self, feedback_text, customer_id): """Processar feedback do cliente""" # Análise de sentimento sentiment_response = self.comprehend.detect_sentiment( Text=feedback_text, LanguageCode='pt' ) # Extração de tópicos-chave key_phrases_response = self.comprehend.detect_key_phrases( Text=feedback_text, LanguageCode='pt' ) # Preparar dados para armazenamento feedback_data = { 'feedback_id': f"{customer_id}_{int(datetime.now().timestamp())}", 'customer_id': customer_id, 'text': feedback_text, 'sentiment': sentiment_response['Sentiment'], 'sentiment_scores': sentiment_response['SentimentScore'], 'key_phrases': [ phrase['Text'] for phrase in key_phrases_response['KeyPhrases'] if phrase['Score'] > 0.8 ], 'timestamp': datetime.now().isoformat(), 'processed': True } # Salvar no DynamoDB self.table.put_item(Item=feedback_data) # Alertar se feedback negativo if sentiment_response['Sentiment'] == 'NEGATIVE': self.send_alert(feedback_data) return feedback_data def send_alert(self, feedback_data): """Enviar alerta para feedback negativo""" message = { 'alert_type': 'negative_feedback', 'customer_id': feedback_data['customer_id'], 'sentiment_score': feedback_data['sentiment_scores']['Negative'], 'key_issues': feedback_data['key_phrases'][:3], 'timestamp': feedback_data['timestamp'] } self.sns.publish( TopicArn='arn:aws:sns:region:account:customer-alerts', Message=json.dumps(message), Subject='Feedback Negativo Detectado' ) # Uso da classe analyzer = FeedbackAnalyzer() result = analyzer.process_feedback( "O produto chegou com defeito e o atendimento foi péssimo!", "customer_123" ) 2. Moderação Automática de Conteúdo class ContentModerator: def __init__(self): self.rekognition = boto3.client('rekognition') self.comprehend = boto3.client('comprehend') self.s3 = boto3.client('s3') def moderate_image(self, bucket_name, image_key): """Moderar conteúdo de imagem""" # Detectar conteúdo inadequado moderation_response = self.rekognition.detect_moderation_labels( Image={ 'S3Object': { 'Bucket': bucket_name, 'Name': image_key } }, MinConfidence=60 ) inappropriate_content = [] for label in moderation_response['ModerationLabels']: inappropriate_content.append({ 'category': label['Name'], 'confidence': label['Confidence'], 'parent_category': label.get('ParentName', '') }) # Detectar texto na imagem text_response = self.rekognition.detect_text( Image={ 'S3Object': { 'Bucket': bucket_name, 'Name': image_key } } ) detected_text = ' '.join([ text['DetectedText'] for text in text_response['TextDetections'] if text['Type'] == 'LINE' ]) # Analisar sentimento do texto detectado text_sentiment = None if detected_text: sentiment_response = self.comprehend.detect_sentiment( Text=detected_text, LanguageCode='pt' ) text_sentiment = sentiment_response['Sentiment'] return { 'image_key': image_key, 'inappropriate_content': inappropriate_content, 'detected_text': detected_text, 'text_sentiment': text_sentiment, 'approved': len(inappropriate_content) == 0, 'confidence_score': min([label['confidence'] for label in inappropriate_content]) if inappropriate_content else 100 } def moderate_text(self, text_content): """Moderar conteúdo de texto""" # Detectar linguagem tóxica usando Comprehend sentiment_response = self.comprehend.detect_sentiment( Text=text_content, LanguageCode='pt' ) # Lista de palavras proibidas (exemplo simplificado) prohibited_words = ['spam', 'golpe', 'fraude'] contains_prohibited = any( word.lower() in text_content.lower() for word in prohibited_words ) return { 'text': text_content, 'sentiment': sentiment_response['Sentiment'], 'sentiment_scores': sentiment_response['SentimentScore'], 'contains_prohibited_words': contains_prohibited, 'approved': not contains_prohibited and sentiment_response['Sentiment'] != 'NEGATIVE' } # Exemplo de uso moderator = ContentModerator() # Moderar imagem image_result = moderator.moderate_image('content-bucket', 'user-uploads/image.jpg') print(f"Imagem aprovada: {image_result['approved']}") # Moderar texto text_result = moderator.moderate_text("Este é um comentário normal sobre o produto.") print(f"Texto aprovado: {text_result['approved']}") 3. Chatbot Inteligente com Lex class IntelligentChatbot: def __init__(self): self.lex = boto3.client('lexv2-runtime') self.comprehend = boto3.client('comprehend') self.dynamodb = boto3.resource('dynamodb') self.conversation_table = self.dynamodb.Table('chatbot-conversations') def process_message(self, user_id, message, session_id=None): """Processar mensagem do usuário""" if not session_id: session_id = f"{user_id}_{int(datetime.now().timestamp())}" # Analisar intenção com Lex lex_response = self.lex.recognize_text( botId='your-bot-id', botAliasId='your-bot-alias-id', localeId='pt_BR', sessionId=session_id, text=message ) # Analisar sentimento da mensagem sentiment_response = self.comprehend.detect_sentiment( Text=message, LanguageCode='pt' ) # Preparar resposta baseada na intenção intent_name = lex_response.get('sessionState', {}).get('intent', {}).get('name', 'Unknown') bot_response = lex_response.get('messages', [{}])[0].get('content', 'Desculpe, não entendi.') # Personalizar resposta baseada no sentimento if sentiment_response['Sentiment'] == 'NEGATIVE': bot_response = f"Percebo que você está frustrado. {bot_response} Posso transferir você para um atendente humano?" # Salvar conversa conversation_data = { 'conversation_id': f"{session_id}_{int(datetime.now().timestamp())}", 'user_id': user_id, 'session_id': session_id, 'user_message': message, 'bot_response': bot_response, 'intent': intent_name, 'sentiment': sentiment_response['Sentiment'], 'confidence': lex_response.get('sessionState', {}).get('intent', {}).get('confirmationState', 'None'), 'timestamp': datetime.now().isoformat() } self.conversation_table.put_item(Item=conversation_data) return { 'response': bot_response, 'intent': intent_name, 'sentiment': sentiment_response['Sentiment'], 'session_id': session_id } def get_conversation_analytics(self, user_id): """Obter analytics da conversa""" response = self.conversation_table.query( IndexName='user-id-index', KeyConditionExpression='user_id = :user_id', ExpressionAttributeValues={':user_id': user_id} ) conversations = response['Items'] # Calcular métricas total_messages = len(conversations) sentiments = [conv['sentiment'] for conv in conversations] intents = [conv['intent'] for conv in conversations] return { 'total_messages': total_messages, 'sentiment_distribution': { 'positive': sentiments.count('POSITIVE'), 'negative': sentiments.count('NEGATIVE'), 'neutral': sentiments.count('NEUTRAL') }, 'top_intents': list(set(intents)), 'last_interaction': max([conv['timestamp'] for conv in conversations]) if conversations else None } # Exemplo de uso chatbot = IntelligentChatbot() # Processar mensagem response = chatbot.process_message( user_id="user_123", message="Preciso cancelar meu pedido", session_id="session_456" ) print(f"Resposta do bot: {response['response']}") print(f"Intenção detectada: {response['intent']}") Automação com Step Functions Workflow de Processamento de Documentos { "Comment": "Workflow de processamento automático de documentos", "StartAt": "ExtractText", "States": { "ExtractText": { "Type": "Task", "Resource": "arn:aws:states:::aws-sdk:textract:startDocumentTextDetection", "Parameters": { "DocumentLocation": { "S3Object": { "Bucket.$": "$.bucket", "Name.$": "$.key" } } }, "Next": "WaitForExtraction" }, "WaitForExtraction": { "Type": "Wait", "Seconds": 10, "Next": "GetExtractionResults" }, "GetExtractionResults": { "Type": "Task", "Resource": "arn:aws:states:::aws-sdk:textract:getDocumentTextDetection", "Parameters": { "JobId.$": "$.JobId" }, "Next": "AnalyzeText" }, "AnalyzeText": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "Parameters": { "FunctionName": "analyze-extracted-text", "Payload.$": "$" }, "Next": "ClassifyDocument" }, "ClassifyDocument": { "Type": "Task", "Resource": "arn:aws:states:::aws-sdk:comprehend:detectSentiment", "Parameters": { "Text.$": "$.extractedText", "LanguageCode": "pt" }, "Next": "StoreResults" }, "StoreResults": { "Type": "Task", "Resource": "arn:aws:states:::dynamodb:putItem", "Parameters": { "TableName": "processed-documents", "Item": { "documentId": {"S.$": "$.documentId"}, "extractedText": {"S.$": "$.extractedText"}, "sentiment": {"S.$": "$.Sentiment"}, "processedAt": {"S.$": "$$.State.EnteredTime"} } }, "End": true } } } Monitoramento e Otimização CloudWatch Metrics para IA Services def monitor_ai_services(): """Monitorar uso e performance dos serviços de IA""" cloudwatch = boto3.client('cloudwatch') # Métricas customizadas metrics = [ { 'MetricName': 'ComprehendRequests', 'Value': 1, 'Unit': 'Count', 'Dimensions': [ { 'Name': 'Service', 'Value': 'Comprehend' } ] }, { 'MetricName': 'RekognitionRequests', 'Value': 1, 'Unit': 'Count', 'Dimensions': [ { 'Name': 'Service', 'Value': 'Rekognition' } ] } ] cloudwatch.put_metric_data( Namespace='AI/Services', MetricData=metrics ) # Dashboard para monitoramento dashboard_config = { "widgets": [ { "type": "metric", "properties": { "metrics": [ ["AI/Services", "ComprehendRequests"], ["AI/Services", "RekognitionRequests"] ], "period": 300, "stat": "Sum", "region": "us-east-1", "title": "AI Services Usage" } } ] } Conclusão Os serviços de IA da AWS democratizam o acesso à inteligência artificial, permitindo que desenvolvedores implementem soluções sofisticadas sem expertise profunda em ML. As principais vantagens incluem: ...

July 16, 2025 · 7 min · 1312 words · Matheus Costa

Infrastructure as Code com Terraform na AWS: Melhores Práticas e Automação

Introdução Infrastructure as Code (IaC) revolucionou a forma como gerenciamos infraestrutura na nuvem. O Terraform, combinado com a AWS, oferece uma solução poderosa para criar, modificar e versionar infraestrutura de forma declarativa e reproduzível. Por que Terraform + AWS? Vantagens do Terraform ✅ Multi-cloud - Suporte a múltiplos provedores ✅ Declarativo - Descreve o estado desejado ✅ Planejamento - Preview das mudanças antes da aplicação ✅ State Management - Controle de estado centralizado ✅ Modularidade - Reutilização de código Benefícios na AWS 🚀 Escalabilidade - Infraestrutura que cresce com demanda 🔒 Segurança - Controles integrados de segurança 💰 Custo-efetivo - Otimização automática de recursos 🔄 Automação - Deploy e gestão automatizados Estrutura de Projeto Terraform Organização de Diretórios terraform-aws-infrastructure/ ├── environments/ │ ├── dev/ │ │ ├── main.tf │ │ ├── variables.tf │ │ ├── outputs.tf │ │ └── terraform.tfvars │ ├── staging/ │ └── production/ ├── modules/ │ ├── vpc/ │ ├── ec2/ │ ├── rds/ │ ├── s3/ │ └── security-groups/ ├── shared/ │ ├── backend.tf │ └── providers.tf └── scripts/ ├── deploy.sh └── destroy.sh Configuração Base Provider Configuration # providers.tf terraform { required_version = ">= 1.0" required_providers { aws = { source = "hashicorp/aws" version = "~> 5.0" } random = { source = "hashicorp/random" version = "~> 3.1" } } backend "s3" { bucket = "terraform-state-bucket" key = "infrastructure/terraform.tfstate" region = "us-east-1" encrypt = true dynamodb_table = "terraform-locks" } } provider "aws" { region = var.aws_region default_tags { tags = { Environment = var.environment Project = var.project_name ManagedBy = "Terraform" Owner = var.owner CostCenter = var.cost_center } } } Variables Configuration # variables.tf variable "aws_region" { description = "AWS region for resources" type = string default = "us-east-1" } variable "environment" { description = "Environment name" type = string validation { condition = contains(["dev", "staging", "production"], var.environment) error_message = "Environment must be dev, staging, or production." } } variable "project_name" { description = "Name of the project" type = string } variable "vpc_cidr" { description = "CIDR block for VPC" type = string default = "10.0.0.0/16" } variable "availability_zones" { description = "List of availability zones" type = list(string) default = ["us-east-1a", "us-east-1b", "us-east-1c"] } Módulos Terraform Reutilizáveis Módulo VPC # modules/vpc/main.tf resource "aws_vpc" "main" { cidr_block = var.cidr_block enable_dns_hostnames = true enable_dns_support = true tags = { Name = "${var.name}-vpc" } } resource "aws_internet_gateway" "main" { vpc_id = aws_vpc.main.id tags = { Name = "${var.name}-igw" } } resource "aws_subnet" "public" { count = length(var.public_subnets) vpc_id = aws_vpc.main.id cidr_block = var.public_subnets[count.index] availability_zone = var.availability_zones[count.index] map_public_ip_on_launch = true tags = { Name = "${var.name}-public-${count.index + 1}" Type = "Public" } } resource "aws_subnet" "private" { count = length(var.private_subnets) vpc_id = aws_vpc.main.id cidr_block = var.private_subnets[count.index] availability_zone = var.availability_zones[count.index] tags = { Name = "${var.name}-private-${count.index + 1}" Type = "Private" } } resource "aws_route_table" "public" { vpc_id = aws_vpc.main.id route { cidr_block = "0.0.0.0/0" gateway_id = aws_internet_gateway.main.id } tags = { Name = "${var.name}-public-rt" } } resource "aws_route_table_association" "public" { count = length(aws_subnet.public) subnet_id = aws_subnet.public[count.index].id route_table_id = aws_route_table.public.id } # NAT Gateway para subnets privadas resource "aws_eip" "nat" { count = var.enable_nat_gateway ? length(var.public_subnets) : 0 domain = "vpc" tags = { Name = "${var.name}-nat-eip-${count.index + 1}" } depends_on = [aws_internet_gateway.main] } resource "aws_nat_gateway" "main" { count = var.enable_nat_gateway ? length(var.public_subnets) : 0 allocation_id = aws_eip.nat[count.index].id subnet_id = aws_subnet.public[count.index].id tags = { Name = "${var.name}-nat-${count.index + 1}" } } resource "aws_route_table" "private" { count = var.enable_nat_gateway ? length(var.private_subnets) : 0 vpc_id = aws_vpc.main.id route { cidr_block = "0.0.0.0/0" nat_gateway_id = aws_nat_gateway.main[count.index].id } tags = { Name = "${var.name}-private-rt-${count.index + 1}" } } resource "aws_route_table_association" "private" { count = var.enable_nat_gateway ? length(aws_subnet.private) : 0 subnet_id = aws_subnet.private[count.index].id route_table_id = aws_route_table.private[count.index].id } Módulo Security Groups # modules/security-groups/main.tf resource "aws_security_group" "web" { name_prefix = "${var.name}-web-" vpc_id = var.vpc_id description = "Security group for web servers" ingress { description = "HTTP" from_port = 80 to_port = 80 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } ingress { description = "HTTPS" from_port = 443 to_port = 443 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] } tags = { Name = "${var.name}-web-sg" } lifecycle { create_before_destroy = true } } resource "aws_security_group" "database" { name_prefix = "${var.name}-db-" vpc_id = var.vpc_id description = "Security group for database servers" ingress { description = "MySQL/Aurora" from_port = 3306 to_port = 3306 protocol = "tcp" security_groups = [aws_security_group.web.id] } ingress { description = "PostgreSQL" from_port = 5432 to_port = 5432 protocol = "tcp" security_groups = [aws_security_group.web.id] } tags = { Name = "${var.name}-db-sg" } lifecycle { create_before_destroy = true } } Módulo EC2 com Auto Scaling # modules/ec2/main.tf data "aws_ami" "amazon_linux" { most_recent = true owners = ["amazon"] filter { name = "name" values = ["amzn2-ami-hvm-*-x86_64-gp2"] } } resource "aws_launch_template" "web" { name_prefix = "${var.name}-web-" image_id = data.aws_ami.amazon_linux.id instance_type = var.instance_type vpc_security_group_ids = var.security_group_ids user_data = base64encode(templatefile("${path.module}/user_data.sh", { environment = var.environment })) iam_instance_profile { name = aws_iam_instance_profile.web.name } block_device_mappings { device_name = "/dev/xvda" ebs { volume_size = var.root_volume_size volume_type = "gp3" encrypted = true } } tag_specifications { resource_type = "instance" tags = { Name = "${var.name}-web-instance" } } lifecycle { create_before_destroy = true } } resource "aws_autoscaling_group" "web" { name = "${var.name}-web-asg" vpc_zone_identifier = var.subnet_ids target_group_arns = var.target_group_arns health_check_type = "ELB" health_check_grace_period = 300 min_size = var.min_size max_size = var.max_size desired_capacity = var.desired_capacity launch_template { id = aws_launch_template.web.id version = "$Latest" } tag { key = "Name" value = "${var.name}-web-asg" propagate_at_launch = false } instance_refresh { strategy = "Rolling" preferences { min_healthy_percentage = 50 } } } # IAM Role para instâncias EC2 resource "aws_iam_role" "web" { name = "${var.name}-web-role" assume_role_policy = jsonencode({ Version = "2012-10-17" Statement = [ { Action = "sts:AssumeRole" Effect = "Allow" Principal = { Service = "ec2.amazonaws.com" } } ] }) } resource "aws_iam_instance_profile" "web" { name = "${var.name}-web-profile" role = aws_iam_role.web.name } resource "aws_iam_role_policy_attachment" "web_ssm" { role = aws_iam_role.web.name policy_arn = "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore" } Implementação de Ambientes Ambiente de Desenvolvimento # environments/dev/main.tf module "vpc" { source = "../../modules/vpc" name = "${var.project_name}-${var.environment}" cidr_block = var.vpc_cidr availability_zones = var.availability_zones public_subnets = ["10.0.1.0/24", "10.0.2.0/24"] private_subnets = ["10.0.10.0/24", "10.0.20.0/24"] enable_nat_gateway = false # Economia de custos em dev } module "security_groups" { source = "../../modules/security-groups" name = "${var.project_name}-${var.environment}" vpc_id = module.vpc.vpc_id } module "web_servers" { source = "../../modules/ec2" name = "${var.project_name}-${var.environment}" environment = var.environment instance_type = "t3.micro" min_size = 1 max_size = 2 desired_capacity = 1 subnet_ids = module.vpc.public_subnet_ids security_group_ids = [module.security_groups.web_sg_id] } Ambiente de Produção # environments/production/main.tf module "vpc" { source = "../../modules/vpc" name = "${var.project_name}-${var.environment}" cidr_block = var.vpc_cidr availability_zones = var.availability_zones public_subnets = ["10.1.1.0/24", "10.1.2.0/24", "10.1.3.0/24"] private_subnets = ["10.1.10.0/24", "10.1.20.0/24", "10.1.30.0/24"] enable_nat_gateway = true } module "security_groups" { source = "../../modules/security-groups" name = "${var.project_name}-${var.environment}" vpc_id = module.vpc.vpc_id } module "web_servers" { source = "../../modules/ec2" name = "${var.project_name}-${var.environment}" environment = var.environment instance_type = "t3.medium" min_size = 2 max_size = 10 desired_capacity = 3 subnet_ids = module.vpc.private_subnet_ids security_group_ids = [module.security_groups.web_sg_id] } module "database" { source = "../../modules/rds" name = "${var.project_name}-${var.environment}" engine = "mysql" engine_version = "8.0" instance_class = "db.t3.medium" allocated_storage = 100 subnet_ids = module.vpc.private_subnet_ids security_group_ids = [module.security_groups.database_sg_id] backup_retention = 7 multi_az = true } Automação e CI/CD Pipeline GitLab CI # .gitlab-ci.yml stages: - validate - plan - apply - destroy variables: TF_ROOT: ${CI_PROJECT_DIR} TF_ADDRESS: ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/terraform/state/${CI_ENVIRONMENT_NAME} cache: key: "${TF_ROOT}" paths: - ${TF_ROOT}/.terraform before_script: - cd ${TF_ROOT}/environments/${CI_ENVIRONMENT_NAME} - terraform --version - terraform init -backend-config="address=${TF_ADDRESS}" -backend-config="lock_address=${TF_ADDRESS}/lock" -backend-config="unlock_address=${TF_ADDRESS}/lock" -backend-config="username=${CI_USERNAME}" -backend-config="password=${CI_JOB_TOKEN}" -backend-config="lock_method=POST" -backend-config="unlock_method=DELETE" -backend-config="retry_wait_min=5" validate: stage: validate script: - terraform validate - terraform fmt -check only: - merge_requests - main plan: stage: plan script: - terraform plan -out="planfile" artifacts: name: plan paths: - ${TF_ROOT}/environments/${CI_ENVIRONMENT_NAME}/planfile only: - merge_requests - main apply: stage: apply script: - terraform apply -input=false "planfile" dependencies: - plan when: manual only: - main environment: name: ${CI_ENVIRONMENT_NAME} destroy: stage: destroy script: - terraform destroy -auto-approve when: manual only: - main environment: name: ${CI_ENVIRONMENT_NAME} action: stop Scripts de Automação #!/bin/bash # scripts/deploy.sh set -e ENVIRONMENT=${1:-dev} ACTION=${2:-plan} echo "🚀 Deploying to $ENVIRONMENT environment" cd "environments/$ENVIRONMENT" # Inicializar Terraform terraform init # Validar configuração terraform validate # Formatar código terraform fmt -recursive case $ACTION in "plan") echo "📋 Planning infrastructure changes..." terraform plan -var-file="terraform.tfvars" ;; "apply") echo "🔨 Applying infrastructure changes..." terraform plan -var-file="terraform.tfvars" -out=tfplan terraform apply tfplan rm tfplan ;; "destroy") echo "💥 Destroying infrastructure..." terraform plan -destroy -var-file="terraform.tfvars" -out=tfplan terraform apply tfplan rm tfplan ;; *) echo "❌ Invalid action. Use: plan, apply, or destroy" exit 1 ;; esac echo "✅ Operation completed successfully!" Monitoramento e Observabilidade CloudWatch Integration # modules/monitoring/main.tf resource "aws_cloudwatch_dashboard" "main" { dashboard_name = "${var.name}-infrastructure" dashboard_body = jsonencode({ widgets = [ { type = "metric" x = 0 y = 0 width = 12 height = 6 properties = { metrics = [ ["AWS/EC2", "CPUUtilization", "AutoScalingGroupName", var.asg_name], ["AWS/ApplicationELB", "TargetResponseTime", "LoadBalancer", var.alb_name] ] period = 300 stat = "Average" region = var.aws_region title = "Infrastructure Metrics" } } ] }) } resource "aws_cloudwatch_metric_alarm" "high_cpu" { alarm_name = "${var.name}-high-cpu" comparison_operator = "GreaterThanThreshold" evaluation_periods = "2" metric_name = "CPUUtilization" namespace = "AWS/EC2" period = "300" statistic = "Average" threshold = "80" alarm_description = "This metric monitors ec2 cpu utilization" dimensions = { AutoScalingGroupName = var.asg_name } alarm_actions = [aws_sns_topic.alerts.arn] } resource "aws_sns_topic" "alerts" { name = "${var.name}-infrastructure-alerts" } Segurança e Compliance Terraform Security Scanning # .github/workflows/security-scan.yml name: Security Scan on: pull_request: branches: [main] jobs: security-scan: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Run Checkov uses: bridgecrewio/checkov-action@master with: directory: . framework: terraform output_format: sarif output_file_path: reports/results.sarif - name: Run TFSec uses: aquasecurity/[email protected] with: soft_fail: true - name: Run Terrascan uses: accurics/terrascan-action@main with: iac_type: terraform iac_version: v14 policy_type: aws State File Security # Backend configuration with encryption terraform { backend "s3" { bucket = "terraform-state-secure-bucket" key = "infrastructure/terraform.tfstate" region = "us-east-1" encrypt = true kms_key_id = "arn:aws:kms:us-east-1:account:key/key-id" dynamodb_table = "terraform-locks" # Versioning enabled on S3 bucket versioning = true # Server-side encryption server_side_encryption_configuration { rule { apply_server_side_encryption_by_default { sse_algorithm = "aws:kms" kms_master_key_id = "arn:aws:kms:us-east-1:account:key/key-id" } } } } } Melhores Práticas 1. Organização de Código ✅ Use módulos reutilizáveis ✅ Separe ambientes em diretórios ✅ Mantenha arquivos pequenos e focados ✅ Use naming conventions consistentes ✅ Documente módulos e variáveis 2. Gestão de Estado ✅ Use backend remoto (S3 + DynamoDB) ✅ Habilite versionamento do state ✅ Configure locks para evitar conflitos ✅ Criptografe state files ✅ Faça backup regular do estado 3. Segurança ✅ Use least privilege principle ✅ Criptografe dados em trânsito e repouso ✅ Implemente resource tagging ✅ Use secrets management ✅ Faça security scanning regular 4. Performance e Custos ✅ Use data sources para recursos existentes ✅ Implemente lifecycle rules ✅ Monitore custos com tags ✅ Use spot instances quando apropriado ✅ Otimize storage classes Troubleshooting Comum 1. State Lock Issues # Forçar unlock (use com cuidado) terraform force-unlock LOCK_ID # Verificar estado atual terraform show # Importar recursos existentes terraform import aws_instance.example i-1234567890abcdef0 2. Dependency Issues # Explicit dependencies resource "aws_instance" "web" { # ... configuration ... depends_on = [ aws_security_group.web, aws_subnet.public ] } 3. Provider Version Conflicts # Lock provider versions terraform { required_providers { aws = { source = "hashicorp/aws" version = "= 5.0.1" # Exact version } } } Conclusão O Terraform oferece uma plataforma robusta para implementar Infrastructure as Code na AWS. Seguindo as melhores práticas apresentadas, você pode: ...

July 16, 2025 · 9 min · 1908 words · Matheus Costa

Segurança Avançada no Amazon S3: Prevenindo Vazamentos de Dados

Introdução O Amazon S3 é um dos serviços mais utilizados da AWS, armazenando trilhões de objetos globalmente. Com essa popularidade, vem a responsabilidade de implementar segurança robusta para proteger dados sensíveis contra vazamentos e acessos não autorizados. Principais Ameaças ao S3 1. Configurações Inseguras Buckets públicos não intencionais Políticas de acesso permissivas Falta de criptografia Logs de acesso desabilitados 2. Ataques Comuns Data Exfiltration - Extração não autorizada de dados Privilege Escalation - Elevação de privilégios Insider Threats - Ameaças internas Credential Compromise - Credenciais comprometidas Arquitetura de Segurança em Camadas Camada 1: Controle de Acesso IAM Policies Granulares { "Version": "2012-10-17", "Statement": [ { "Sid": "RestrictToSpecificBucket", "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject" ], "Resource": "arn:aws:s3:::secure-data-bucket/*", "Condition": { "StringEquals": { "s3:x-amz-server-side-encryption": "aws:kms" }, "StringLike": { "s3:x-amz-server-side-encryption-context:project": "sensitive-project" } } }, { "Sid": "DenyUnencryptedUploads", "Effect": "Deny", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::secure-data-bucket/*", "Condition": { "StringNotEquals": { "s3:x-amz-server-side-encryption": "aws:kms" } } } ] } Bucket Policies com Condições Restritivas { "Version": "2012-10-17", "Statement": [ { "Sid": "RestrictToVPCEndpoint", "Effect": "Deny", "Principal": "*", "Action": "s3:*", "Resource": [ "arn:aws:s3:::secure-data-bucket", "arn:aws:s3:::secure-data-bucket/*" ], "Condition": { "StringNotEquals": { "aws:sourceVpce": "vpce-1234567890abcdef0" } } }, { "Sid": "RequireSSLRequestsOnly", "Effect": "Deny", "Principal": "*", "Action": "s3:*", "Resource": [ "arn:aws:s3:::secure-data-bucket", "arn:aws:s3:::secure-data-bucket/*" ], "Condition": { "Bool": { "aws:SecureTransport": "false" } } } ] } Camada 2: Criptografia Server-Side Encryption com KMS # Criar chave KMS dedicada aws kms create-key \ --description "S3 encryption key for sensitive data" \ --key-usage ENCRYPT_DECRYPT \ --key-spec SYMMETRIC_DEFAULT # Configurar criptografia padrão no bucket aws s3api put-bucket-encryption \ --bucket secure-data-bucket \ --server-side-encryption-configuration '{ "Rules": [ { "ApplyServerSideEncryptionByDefault": { "SSEAlgorithm": "aws:kms", "KMSMasterKeyID": "arn:aws:kms:region:account:key/key-id" }, "BucketKeyEnabled": true } ] }' Client-Side Encryption import boto3 from botocore.client import Config import io # Configurar cliente S3 com criptografia s3_client = boto3.client( 's3', config=Config( signature_version='s3v4', s3={ 'addressing_style': 'virtual' } ) ) def upload_encrypted_object(bucket, key, data, kms_key_id): """Upload objeto com criptografia KMS""" response = s3_client.put_object( Bucket=bucket, Key=key, Body=data, ServerSideEncryption='aws:kms', SSEKMSKeyId=kms_key_id, Metadata={ 'classification': 'confidential', 'encrypted': 'true' } ) return response # Exemplo de uso upload_encrypted_object( bucket='secure-data-bucket', key='sensitive/document.pdf', data=open('document.pdf', 'rb'), kms_key_id='arn:aws:kms:region:account:key/key-id' ) Camada 3: Monitoramento e Auditoria CloudTrail para S3 Data Events { "Trail": { "Name": "S3DataEventsTrail", "S3BucketName": "audit-logs-bucket", "EventSelectors": [ { "ReadWriteType": "All", "IncludeManagementEvents": false, "DataResources": [ { "Type": "AWS::S3::Object", "Values": [ "arn:aws:s3:::secure-data-bucket/*" ] } ] } ] } } S3 Access Logging # Habilitar access logging aws s3api put-bucket-logging \ --bucket secure-data-bucket \ --bucket-logging-status '{ "LoggingEnabled": { "TargetBucket": "access-logs-bucket", "TargetPrefix": "secure-data-bucket-logs/" } }' Implementação de Controles Avançados 1. S3 Object Lock Configuração de Retenção Legal # Habilitar Object Lock no bucket aws s3api create-bucket \ --bucket immutable-data-bucket \ --object-lock-enabled-for-bucket # Configurar retenção padrão aws s3api put-object-lock-configuration \ --bucket immutable-data-bucket \ --object-lock-configuration '{ "ObjectLockEnabled": "Enabled", "Rule": { "DefaultRetention": { "Mode": "GOVERNANCE", "Years": 7 } } }' Upload com Retenção Específica def upload_with_retention(bucket, key, data, retention_days): """Upload objeto com retenção específica""" from datetime import datetime, timedelta retention_date = datetime.utcnow() + timedelta(days=retention_days) response = s3_client.put_object( Bucket=bucket, Key=key, Body=data, ObjectLockMode='GOVERNANCE', ObjectLockRetainUntilDate=retention_date, Metadata={ 'retention-period': str(retention_days), 'legal-hold': 'active' } ) return response 2. S3 Intelligent Tiering Configuração Automática de Classes de Armazenamento { "Id": "IntelligentTieringConfig", "Status": "Enabled", "Filter": { "Prefix": "sensitive-data/" }, "Tierings": [ { "Days": 90, "AccessTier": "ARCHIVE_ACCESS" }, { "Days": 180, "AccessTier": "DEEP_ARCHIVE_ACCESS" } ] } 3. Cross-Region Replication para DR Configuração de Replicação Segura { "Role": "arn:aws:iam::account:role/replication-role", "Rules": [ { "ID": "SecureReplication", "Status": "Enabled", "Filter": { "Prefix": "critical-data/" }, "Destination": { "Bucket": "arn:aws:s3:::backup-bucket-dr", "StorageClass": "STANDARD_IA", "EncryptionConfiguration": { "ReplicaKmsKeyID": "arn:aws:kms:region:account:key/backup-key-id" } } } ] } Detecção de Anomalias 1. CloudWatch Metrics Customizadas import boto3 import json from datetime import datetime, timedelta def analyze_s3_access_patterns(): """Analisar padrões de acesso suspeitos""" cloudwatch = boto3.client('cloudwatch') s3 = boto3.client('s3') # Métricas de acesso por hora end_time = datetime.utcnow() start_time = end_time - timedelta(hours=24) # Buscar métricas de requests response = cloudwatch.get_metric_statistics( Namespace='AWS/S3', MetricName='NumberOfObjects', Dimensions=[ { 'Name': 'BucketName', 'Value': 'secure-data-bucket' } ], StartTime=start_time, EndTime=end_time, Period=3600, Statistics=['Sum'] ) # Detectar picos anômalos values = [point['Sum'] for point in response['Datapoints']] avg = sum(values) / len(values) for point in response['Datapoints']: if point['Sum'] > avg * 3: # 3x acima da média send_alert(f"Anomalous S3 access detected: {point['Sum']} requests at {point['Timestamp']}") def send_alert(message): """Enviar alerta via SNS""" sns = boto3.client('sns') sns.publish( TopicArn='arn:aws:sns:region:account:security-alerts', Message=message, Subject='S3 Security Alert' ) 2. GuardDuty para S3 Configuração de Proteção S3 # Habilitar proteção S3 no GuardDuty aws guardduty create-s3-protection \ --detector-id detector-id \ --enable Resposta Automatizada a Findings def handle_guardduty_s3_finding(event, context): """Responder automaticamente a findings do GuardDuty""" finding = json.loads(event['Records'][0]['Sns']['Message']) if 'S3' in finding['type']: bucket_name = finding['service']['resourceRole']['bucketName'] # Ações baseadas no tipo de finding if 'Exfiltration' in finding['type']: # Bloquear acesso público imediatamente block_public_access(bucket_name) elif 'Persistence' in finding['type']: # Revisar políticas de bucket audit_bucket_policies(bucket_name) # Notificar equipe de segurança notify_security_team(finding) def block_public_access(bucket_name): """Bloquear acesso público ao bucket""" s3 = boto3.client('s3') s3.put_public_access_block( Bucket=bucket_name, PublicAccessBlockConfiguration={ 'BlockPublicAcls': True, 'IgnorePublicAcls': True, 'BlockPublicPolicy': True, 'RestrictPublicBuckets': True } ) Compliance e Governança 1. AWS Config Rules Regra para Criptografia Obrigatória { "ConfigRuleName": "s3-bucket-server-side-encryption-enabled", "Source": { "Owner": "AWS", "SourceIdentifier": "S3_BUCKET_SERVER_SIDE_ENCRYPTION_ENABLED" }, "Scope": { "ComplianceResourceTypes": [ "AWS::S3::Bucket" ] } } Regra para Bloqueio de Acesso Público { "ConfigRuleName": "s3-bucket-public-access-prohibited", "Source": { "Owner": "AWS", "SourceIdentifier": "S3_BUCKET_PUBLIC_ACCESS_PROHIBITED" }, "Scope": { "ComplianceResourceTypes": [ "AWS::S3::Bucket" ] } } 2. Automação de Remediation def auto_remediate_s3_compliance(event, context): """Remediar automaticamente problemas de compliance""" config_item = event['configurationItem'] bucket_name = config_item['resourceName'] if config_item['resourceType'] == 'AWS::S3::Bucket': # Verificar se bucket está público if is_bucket_public(bucket_name): block_public_access(bucket_name) # Verificar criptografia if not is_bucket_encrypted(bucket_name): enable_bucket_encryption(bucket_name) # Verificar logging if not is_logging_enabled(bucket_name): enable_access_logging(bucket_name) def is_bucket_public(bucket_name): """Verificar se bucket tem acesso público""" s3 = boto3.client('s3') try: response = s3.get_public_access_block(Bucket=bucket_name) config = response['PublicAccessBlockConfiguration'] return not all([ config.get('BlockPublicAcls', False), config.get('IgnorePublicAcls', False), config.get('BlockPublicPolicy', False), config.get('RestrictPublicBuckets', False) ]) except: return True # Assume público se não conseguir verificar Melhores Práticas de Implementação 1. Princípios de Segurança Defense in Depth # Exemplo de stack CloudFormation com múltiplas camadas Resources: SecureBucket: Type: AWS::S3::Bucket Properties: BucketName: !Sub "${AWS::StackName}-secure-data" BucketEncryption: ServerSideEncryptionConfiguration: - ServerSideEncryptionByDefault: SSEAlgorithm: aws:kms KMSMasterKeyID: !Ref S3KMSKey PublicAccessBlockConfiguration: BlockPublicAcls: true BlockPublicPolicy: true IgnorePublicAcls: true RestrictPublicBuckets: true LoggingConfiguration: DestinationBucketName: !Ref AccessLogsBucket LogFilePrefix: access-logs/ NotificationConfiguration: CloudWatchConfigurations: - Event: s3:ObjectCreated:* CloudWatchConfiguration: LogGroupName: !Ref S3LogGroup 2. Monitoramento Contínuo Dashboard de Segurança S3 { "widgets": [ { "type": "metric", "properties": { "metrics": [ ["AWS/S3", "BucketRequests", "BucketName", "secure-data-bucket", "FilterId", "EntireBucket"], ["AWS/S3", "AllRequests", "BucketName", "secure-data-bucket", "FilterId", "EntireBucket"] ], "period": 300, "stat": "Sum", "region": "us-east-1", "title": "S3 Request Volume" } }, { "type": "log", "properties": { "query": "SOURCE '/aws/s3/access-logs' | fields @timestamp, remote_ip, request_uri, http_status\n| filter http_status >= 400\n| stats count() by remote_ip\n| sort count desc\n| limit 10", "region": "us-east-1", "title": "Top Error Sources" } } ] } Custos e Otimização Análise de Custo-Benefício Controle de Segurança Custo Mensal Benefício ROI KMS Encryption $1-10 Alto 1000%+ CloudTrail Data Events $10-50 Médio 500% GuardDuty S3 Protection $5-25 Alto 800% Config Rules $2-10 Médio 300% Cross-Region Replication $20-100 Alto 400% Otimização de Custos def optimize_s3_security_costs(): """Otimizar custos de segurança S3""" # 1. Usar Intelligent Tiering para dados menos acessados # 2. Configurar lifecycle policies # 3. Comprimir dados antes do upload # 4. Usar S3 Transfer Acceleration apenas quando necessário # 5. Monitorar uso de KMS keys lifecycle_config = { 'Rules': [ { 'ID': 'SecurityOptimization', 'Status': 'Enabled', 'Filter': {'Prefix': 'logs/'}, 'Transitions': [ { 'Days': 30, 'StorageClass': 'STANDARD_IA' }, { 'Days': 90, 'StorageClass': 'GLACIER' } ] } ] } return lifecycle_config Conclusão A segurança do Amazon S3 requer uma abordagem holística que combine: ...

July 16, 2025 · 6 min · 1273 words · Matheus Costa

Proteção Avançada contra Ransomware na AWS: Estratégias e Implementação

Introdução Ataques de ransomware representam uma das maiores ameaças à segurança corporativa atualmente. Na AWS, implementar uma estratégia robusta de proteção é essencial para manter a continuidade dos negócios e proteger dados críticos. Entendendo a Ameaça O que é Ransomware? Ransomware é um tipo de malware que: Criptografa dados e sistemas Exige pagamento para descriptografia Paralisa operações empresariais Causa perdas financeiras significativas Vetores de Ataque Comuns Phishing e engenharia social Vulnerabilidades em aplicações Credenciais comprometidas Acesso privilegiado inadequado Configurações inseguras Estratégias de Proteção na AWS 1. Backup e Recovery AWS Backup { "BackupPlan": { "BackupPlanName": "RansomwareProtection", "Rules": [ { "RuleName": "DailyBackups", "TargetBackupVault": "SecureVault", "ScheduleExpression": "cron(0 2 ? * * *)", "Lifecycle": { "DeleteAfterDays": 90, "MoveToColdStorageAfterDays": 30 } } ] } } Configuração de Backup Vault # Criar backup vault com criptografia aws backup create-backup-vault \ --backup-vault-name SecureVault \ --encryption-key-arn arn:aws:kms:region:account:key/key-id \ --backup-vault-tags Key=Purpose,Value=RansomwareProtection 2. Controle de Acesso (IAM) Princípio do Menor Privilégio { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject" ], "Resource": "arn:aws:s3:::secure-bucket/*", "Condition": { "StringEquals": { "s3:x-amz-server-side-encryption": "AES256" } } } ] } MFA para Operações Críticas { "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "*", "Resource": "*", "Condition": { "BoolIfExists": { "aws:MultiFactorAuthPresent": "false" } } } ] } 3. Monitoramento e Detecção CloudTrail para Auditoria { "Trail": { "Name": "SecurityAuditTrail", "S3BucketName": "security-logs-bucket", "IncludeGlobalServiceEvents": true, "IsMultiRegionTrail": true, "EnableLogFileValidation": true, "EventSelectors": [ { "ReadWriteType": "All", "IncludeManagementEvents": true, "DataResources": [ { "Type": "AWS::S3::Object", "Values": ["arn:aws:s3:::critical-data/*"] } ] } ] } } GuardDuty para Detecção de Ameaças # Habilitar GuardDuty aws guardduty create-detector \ --enable \ --finding-publishing-frequency FIFTEEN_MINUTES 4. Segmentação de Rede VPC com Isolamento VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 EnableDnsHostnames: true EnableDnsSupport: true Tags: - Key: Name Value: SecureVPC PrivateSubnet: Type: AWS::EC2::Subnet Properties: VpcId: !Ref VPC CidrBlock: 10.0.1.0/24 AvailabilityZone: !Select [0, !GetAZs ''] Tags: - Key: Name Value: PrivateSubnet Security Groups Restritivos { "GroupDescription": "Secure access only", "SecurityGroupRules": [ { "IpProtocol": "tcp", "FromPort": 443, "ToPort": 443, "CidrIp": "10.0.0.0/16" } ] } Implementação de Controles Específicos 1. S3 Bucket Protection Versionamento e MFA Delete # Habilitar versionamento aws s3api put-bucket-versioning \ --bucket critical-data-bucket \ --versioning-configuration Status=Enabled,MfaDelete=Enabled \ --mfa "arn:aws:iam::account:mfa/user serial-number" # Configurar lifecycle para versões antigas aws s3api put-bucket-lifecycle-configuration \ --bucket critical-data-bucket \ --lifecycle-configuration file://lifecycle.json Object Lock para Imutabilidade { "ObjectLockEnabled": "Enabled", "Rule": { "DefaultRetention": { "Mode": "GOVERNANCE", "Days": 30 } } } 2. RDS Protection Backup Automatizado # Configurar backup automático aws rds modify-db-instance \ --db-instance-identifier production-db \ --backup-retention-period 30 \ --preferred-backup-window "03:00-04:00" \ --delete-automated-backups false Snapshot Manual # Criar snapshot manual aws rds create-db-snapshot \ --db-instance-identifier production-db \ --db-snapshot-identifier manual-snapshot-$(date +%Y%m%d) 3. EBS Volume Protection Snapshots Automatizados import boto3 from datetime import datetime def create_ebs_snapshots(): ec2 = boto3.client('ec2') # Listar volumes volumes = ec2.describe_volumes() for volume in volumes['Volumes']: volume_id = volume['VolumeId'] # Criar snapshot snapshot = ec2.create_snapshot( VolumeId=volume_id, Description=f'Automated snapshot - {datetime.now().isoformat()}', TagSpecifications=[ { 'ResourceType': 'snapshot', 'Tags': [ {'Key': 'Purpose', 'Value': 'RansomwareProtection'}, {'Key': 'CreatedBy', 'Value': 'AutomatedBackup'} ] } ] ) print(f"Snapshot {snapshot['SnapshotId']} created for volume {volume_id}") Monitoramento e Alertas 1. CloudWatch Alarms Detecção de Atividade Suspeita { "AlarmName": "SuspiciousS3Activity", "MetricName": "NumberOfObjects", "Namespace": "AWS/S3", "Statistic": "Sum", "Period": 300, "EvaluationPeriods": 2, "Threshold": 1000, "ComparisonOperator": "GreaterThanThreshold", "AlarmActions": [ "arn:aws:sns:region:account:security-alerts" ] } 2. EventBridge Rules Monitoramento de Eventos Críticos { "Name": "RansomwareDetection", "EventPattern": { "source": ["aws.guardduty"], "detail-type": ["GuardDuty Finding"], "detail": { "type": [ "Trojan:EC2/BlackholeTraffic", "Backdoor:EC2/C&CActivity.B", "CryptoCurrency:EC2/BitcoinTool.B" ] } }, "Targets": [ { "Id": "1", "Arn": "arn:aws:lambda:region:account:function:IncidentResponse" } ] } Resposta a Incidentes 1. Plano de Resposta Automatizada import boto3 import json def incident_response_handler(event, context): """ Função Lambda para resposta automática a incidentes """ # Parse do evento GuardDuty finding = json.loads(event['Records'][0]['Sns']['Message']) if finding['severity'] >= 7.0: # Alta severidade # 1. Isolar instância comprometida isolate_instance(finding['service']['resourceRole']) # 2. Criar snapshot forense create_forensic_snapshot(finding['service']['resourceRole']) # 3. Notificar equipe de segurança notify_security_team(finding) # 4. Iniciar backup de emergência trigger_emergency_backup() def isolate_instance(resource_info): """Isolar instância suspeita""" ec2 = boto3.client('ec2') instance_id = resource_info['instanceDetails']['instanceId'] # Criar security group restritivo sg_response = ec2.create_security_group( GroupName=f'quarantine-{instance_id}', Description='Quarantine security group' ) # Aplicar à instância ec2.modify_instance_attribute( InstanceId=instance_id, Groups=[sg_response['GroupId']] ) 2. Recovery Procedures Restauração de Dados #!/bin/bash # Script de recuperação de dados BACKUP_VAULT="SecureVault" RECOVERY_POINT_ARN="$1" # Restaurar RDS aws backup start-restore-job \ --recovery-point-arn $RECOVERY_POINT_ARN \ --metadata DBInstanceIdentifier=recovered-db \ --iam-role-arn arn:aws:iam::account:role/BackupRole # Restaurar EBS aws backup start-restore-job \ --recovery-point-arn $RECOVERY_POINT_ARN \ --metadata VolumeType=gp3,VolumeSize=100 \ --iam-role-arn arn:aws:iam::account:role/BackupRole echo "Recovery jobs initiated" Melhores Práticas 1. Prevenção ✅ Implementar MFA em todas as contas ✅ Usar princípio do menor privilégio ✅ Manter sistemas atualizados ✅ Treinar equipes sobre phishing ✅ Segmentar redes adequadamente 2. Detecção ✅ Monitorar logs continuamente ✅ Configurar alertas em tempo real ✅ Usar ferramentas de threat intelligence ✅ Implementar honeypots ✅ Analisar comportamento anômalo 3. Resposta ✅ Ter plano de resposta documentado ✅ Praticar simulações regulares ✅ Manter backups testados ✅ Definir canais de comunicação ✅ Documentar lições aprendidas Custos e ROI Investimento em Segurança Serviço Custo Mensal Estimado Benefício AWS Backup $50-200 Recuperação rápida GuardDuty $30-100 Detecção precoce CloudTrail $20-50 Auditoria completa Config $40-80 Compliance ROI da Proteção Custo médio de ransomware: $4.45 milhões Investimento em proteção: $10-50k/ano ROI: 8,900% - 44,500% Conclusão A proteção contra ransomware na AWS requer uma abordagem em camadas que combine: ...

July 16, 2025 · 5 min · 909 words · Matheus Costa

Introdução ao AWS Lambda: Computação Serverless

O que é AWS Lambda? AWS Lambda é um serviço de computação serverless que permite executar código sem provisionar ou gerenciar servidores. Você paga apenas pelo tempo de computação que consome. Principais Características 1. Serverless Sem gerenciamento de infraestrutura Escalabilidade automática Alta disponibilidade integrada 2. Modelo de Preços Pay-per-use Cobrança por milissegundo 1 milhão de requests gratuitos por mês 3. Linguagens Suportadas Python Node.js Java C# Go Ruby Exemplo Prático Aqui está um exemplo simples de uma função Lambda em Python: ...

July 16, 2025 · 1 min · 207 words · Matheus Costa

Amazon Q Developer na Prática: Revolucionando o Desenvolvimento com IA

O Amazon Q Developer representa uma revolução na forma como desenvolvemos e operamos aplicações na AWS. Este assistente de IA generativa não apenas acelera o desenvolvimento, mas também otimiza operações e resolve problemas complexos em tempo real. 🚀 O que é Amazon Q Developer? Amazon Q Developer é um assistente de IA generativa especializado em desenvolvimento de software e operações AWS. Ele combina: Geração de código inteligente e contextual Análise e otimização de infraestrutura AWS Resolução automática de problemas operacionais Integração nativa com ferramentas de desenvolvimento Principais Capacidades 🤖 Code Generation: Gera código em múltiplas linguagens 🔍 Code Analysis: Analisa e otimiza código existente 🛠️ Infrastructure as Code: Cria e otimiza templates Terraform/CloudFormation 🔧 Troubleshooting: Identifica e resolve problemas automaticamente 📊 Cost Optimization: Sugere melhorias de custos AWS 🛠️ Configuração e Primeiros Passos 1. Instalação no VS Code # Instalar extensão Amazon Q code --install-extension amazonwebservices.amazon-q-vscode 2. Configuração de Credenciais AWS # Configurar AWS CLI aws configure # Ou usar AWS SSO aws configure sso 3. Ativação do Amazon Q Abra VS Code Pressione Ctrl+Shift+P (ou Cmd+Shift+P no Mac) Digite “Amazon Q: Sign In” Siga o processo de autenticação 💻 Casos de Uso Práticos 1. Geração de Código AWS Prompt: “Crie uma função Lambda em Python que processa mensagens SQS e salva no DynamoDB” ...

December 10, 2024 · 7 min · 1382 words · Matheus Costa

AWS - Primeiros Passos na Nuvem

AWS - Primeiros Passos na Nuvem Evento: Campus Party Goiás 2024 Data: Novembro 2024 Local: Goiânia, GO 📋 Sobre a Palestra Apresentação introdutória sobre Amazon Web Services (AWS) focada em iniciantes que querem dar os primeiros passos na computação em nuvem. Tópicos Abordados: ☁️ O que é Cloud Computing 🚀 Introdução à AWS 💰 Modelo de precificação 🔧 Principais serviços (EC2, S3, RDS) 🛡️ Segurança básica 📚 Recursos para aprendizado 🎯 Público-Alvo Estudantes de tecnologia Profissionais iniciantes em cloud Desenvolvedores interessados em AWS Entusiastas de tecnologia 📊 Apresentação 🔗 Ver Apresentação no Canva ...

July 15, 2024 · 1 min · 147 words · Matheus Costa