Cloud
Curs Complet de Cloud Engineering¶
De la fundamente la arhitecturi avansate — AWS, Azure, GCP¶
Cuprins¶
Partea I — Fundamente Cloud
- Introducere în cloud computing
- Modele de servicii: IaaS, PaaS, SaaS, FaaS
- Principii de arhitectură cloud (Well-Architected Framework)
- Regiuni, zone de disponibilitate și edge
Partea II — Compute
5. Mașini virtuale (EC2, Azure VMs, GCE)
6. Containere în cloud (ECS, EKS, AKS, GKE, Fargate)
7. Serverless / Functions-as-a-Service (Lambda, Azure Functions, Cloud Functions)
8. Auto Scaling și elasticitate
Partea III — Networking
9. Virtual Private Cloud (VPC) și rețele virtuale
10. Load balancing și distribuția traficului
11. DNS, CDN și accelerare globală
12. Conectivitate hibridă (VPN, Direct Connect, peering)
Partea IV — Stocare și baze de date
13. Object Storage (S3, Azure Blob, GCS)
14. Block Storage și File Storage (EBS, EFS, Azure Disks/Files)
15. Baze de date managed (RDS, Aurora, DynamoDB, CosmosDB, Cloud SQL)
16. Caching și baze de date in-memory
Partea V — Securitate și identitate
17. IAM — Identity and Access Management
18. Criptare, KMS și gestiunea secretelor
19. Securitatea rețelei (Security Groups, NACLs, Firewall rules)
20. Compliance, audit și logging (CloudTrail, GuardDuty, Security Hub)
Partea VI — Infrastructure as Code și automatizare
21. Terraform — de la baze la module avansate
22. CloudFormation, ARM Templates, Pulumi
23. Configuration Management (Ansible, SSM)
24. GitOps și pipeline-uri IaC
Partea VII — Observabilitate și operare
25. Monitorizare (CloudWatch, Azure Monitor, Cloud Monitoring)
26. Logging centralizat și analitică
27. Alertare, incident management și SRE
28. Optimizarea costurilor (FinOps)
Partea VIII — Arhitecturi avansate
29. Arhitecturi multi-tier și microservicii
30. Event-driven architecture și messaging
31. Data engineering în cloud
32. Disaster Recovery și Business Continuity
33. Multi-cloud și cloud-native design patterns
PARTEA I — FUNDAMENTE CLOUD¶
1. Introducere în cloud computing¶
1.1 Definiție și caracteristici esențiale (NIST)¶
Cloud computing este un model care oferă acces la cerere, prin rețea, la un pool partajat de resurse computaționale configurabile, care pot fi provizionate și eliberate rapid cu efort minim de management.
Cele 5 caracteristici esențiale (NIST SP 800-145):
1. On-demand self-service
Provizionezi resurse fără interacțiune umană cu provider-ul.
CLI: aws ec2 run-instances ... → mașină virtuală în 60 secunde.
2. Broad network access
Accesibil prin rețea de pe orice dispozitiv (laptop, telefon, API).
3. Resource pooling
Resursele fizice sunt partajate între clienți (multi-tenancy).
Nu știi (și nu trebuie să știi) pe ce server fizic rulezi.
4. Rapid elasticity
Scalare sus/jos automat, aproape instantaneu, aparent infinit.
5. Measured service
Plătești doar ce consumi (pay-as-you-go). Monitorizare și raportare transparentă.
1.2 Cloud vs. On-Premises¶
On-Premises Cloud
─────────────────────────────────────────────────────────────────
Investiție CapEx mare (cumperi hardware) OpEx (plătești lunar)
Provizionare Săptămâni-luni Minute-secunde
Scalare Manuală, limitată Automată, elastică
Mentenanță Tu (patching, hardware, DC) Provider-ul
Disponibilitate Tu construiești HA Built-in (multi-AZ, regiuni)
Securitate Control total Responsabilitate partajată
Cost predicibil Da (după investiția inițială) Variabil (risc de surprize)
Experimentare Costisitoare (risc) Ieftină (oprești, nu plătești)
1.3 Cei trei mari provideri¶
┌─────────────────────────────────────────────────────────────────┐
│ PIAȚA CLOUD (IaaS+PaaS) │
│ │
│ ┌─────────────────┐ ┌────────────────┐ ┌─────────────────┐ │
│ │ AWS │ │ Microsoft │ │ Google Cloud │ │
│ │ Amazon Web │ │ Azure │ │ Platform │ │
│ │ Services │ │ │ │ (GCP) │ │
│ │ │ │ │ │ │ │
│ │ ~31% market │ │ ~25% market │ │ ~11% market │ │
│ │ share │ │ share │ │ share │ │
│ │ │ │ │ │ │ │
│ │ 200+ servicii │ │ 200+ servicii │ │ 100+ servicii │ │
│ │ Cel mai matur │ │ Integrare │ │ ML/AI, data, │ │
│ │ ecosistem │ │ enterprise │ │ Kubernetes │ │
│ │ Startup-uri, │ │ Microsoft │ │ (GKE inventat │ │
│ │ tech companies │ │ (AD, Office) │ │ K8s) │ │
│ └─────────────────┘ └────────────────┘ └─────────────────┘ │
│ │
│ Alți provideri: Oracle Cloud, IBM Cloud, Alibaba Cloud, │
│ DigitalOcean, Linode/Akamai, Hetzner, OVH │
└─────────────────────────────────────────────────────────────────┘
2. Modele de servicii: IaaS, PaaS, SaaS, FaaS¶
2.1 Stiva de responsabilitate¶
CE GESTIONEZI TU vs. CE GESTIONEAZĂ PROVIDER-UL:
On-Prem IaaS PaaS FaaS/ SaaS
Serverless
──────────────────────────────────────────────────────────────────
Aplicație TU TU TU TU Provider
Date TU TU TU TU Provider
Runtime TU TU Provider Provider Provider
Middleware TU TU Provider Provider Provider
OS TU TU Provider Provider Provider
Virtualizare TU Provider Provider Provider Provider
Servere TU Provider Provider Provider Provider
Stocare TU Provider Provider Provider Provider
Networking TU Provider Provider Provider Provider
Datacenter fizic TU Provider Provider Provider Provider
Exemple concrete:
IaaS: EC2, Azure VMs, GCE
→ Tu gestionezi OS, patching, aplicația, middleware
PaaS: Elastic Beanstalk, Azure App Service, Google App Engine, Heroku
→ Tu gestionezi doar codul și datele
FaaS: Lambda, Azure Functions, Cloud Functions
→ Tu gestionezi doar funcția (codul), nimic altceva
SaaS: Gmail, Salesforce, Office 365, Slack
→ Tu doar folosești aplicația
2.2 Modelul de implementare¶
Public Cloud: Resurse partajate, operate de provider, acces prin internet.
(AWS, Azure, GCP)
Private Cloud: Infrastructură cloud dedicată unei singure organizații.
(VMware vSphere, OpenStack, Azure Stack)
Hybrid Cloud: Combinație public + private/on-prem, cu orchestrare unificată.
(AWS Outposts, Azure Arc, Anthos)
Multi-Cloud: Folosirea simultană a mai multor provideri publici.
(AWS + GCP, sau AWS + Azure — evitare vendor lock-in)
3. Principii de arhitectură cloud (Well-Architected Framework)¶
3.1 Cei 6 piloni AWS Well-Architected¶
1. OPERATIONAL EXCELLENCE
Automatizare operații, IaC, observabilitate, îmbunătățire continuă.
Practici: runbooks, playbooks, post-incident reviews.
2. SECURITY
Protecție date, identitate, detecție, răspuns la incidente.
Practici: least privilege, criptare everywhere, audit logging.
3. RELIABILITY
Recuperare din eșecuri, scalare la cerere, gestionare schimbări.
Practici: multi-AZ, health checks, chaos engineering, backup/restore testat.
4. PERFORMANCE EFFICIENCY
Resurse potrivite pentru cerințe, monitorizare performanță.
Practici: right-sizing, caching, CDN, alegere tip instanță corect.
5. COST OPTIMIZATION
Eliminare risipă, alegere model de pricing corect.
Practici: Reserved Instances, Spot, right-sizing, auto-scaling, cleanup.
6. SUSTAINABILITY
Minimizare impact de mediu, eficiență energetică.
Practici: regiuni cu energie verde, right-sizing, serverless.
3.2 Principii de design cloud-native¶
Design for Failure: Totul va pica eventual. Proiectează-te pentru asta.
Multi-AZ, retry cu backoff, circuit breaker, health checks.
Decouple Components: Componente independente, comunicare prin API/mesaje.
Căderea uneia nu afectează restul.
Elasticity over Capacity: Nu supradimensiona. Lasă auto-scaling să gestioneze.
Pay-for-what-you-use.
Automate Everything: IaC, CI/CD, auto-healing, auto-scaling.
Dacă faci ceva manual de 2 ori, automatizează-l.
Use Managed Services: Nu reinventa roata. RDS > self-managed PostgreSQL.
Concentrează-te pe business logic, nu pe infrastructură.
Think Stateless: Servere efemere (cattle, not pets).
Starea externalizată în S3, DynamoDB, Redis, EFS.
Secure by Default: Least privilege, criptare, zero trust.
Security nu e un layer adăugat, e fundament.
4. Regiuni, zone de disponibilitate și edge¶
AWS Global Infrastructure (exemplu):
┌─────────────────────────────────────────────────────────────────┐
│ AWS GLOBAL │
│ │
│ Region: eu-west-1 (Ireland) │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ AZ: eu-west-1a AZ: eu-west-1b AZ: eu-west-1c│ │
│ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐│ │
│ │ │ Datacenter(s)│ │ Datacenter(s)│ │ Datacenter(s)││ │
│ │ │ │ │ │ │ ││ │
│ │ │ EC2, RDS, │ │ EC2, RDS, │ │ EC2, RDS, ││ │
│ │ │ EBS, etc. │ │ EBS, etc. │ │ EBS, etc. ││ │
│ │ └──────────────┘ └──────────────┘ └──────────────┘│ │
│ │ │ │ │ │ │
│ │ └────── Rețea privată de mare viteză, ──┘ │ │
│ │ latență < 2ms între AZ-uri │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ Edge Locations (400+): CloudFront CDN, Route53 DNS, WAF │
│ Local Zones: extensii în orașe mari (pentru latență ultra-mică)│
│ Wavelength: compute la edge-ul rețelei 5G │
│ Outposts: hardware AWS în datacenter-ul TĂU │
└─────────────────────────────────────────────────────────────────┘
AZ (Availability Zone):
- Unul sau mai multe datacentere fizice, izolate de alte AZ-uri
- Alimentare independentă, cooling independent, networking independent
- Conectate între ele cu fibră optică de mare viteză (<2ms latență)
- Proiectare: un dezastru care afectează un AZ NU afectează celelalte
Region:
- Cluster de AZ-uri (tipic 3, uneori 2-6)
- Complet independentă de alte regiuni (date NU se replică automat)
- Alegere pe baza: latență la useri, conformitate juridică, disponibilitate servicii
PARTEA II — COMPUTE¶
5. Mașini virtuale (EC2, Azure VMs, GCE)¶
5.1 Concepte și tipuri de instanțe¶
AWS EC2 Azure VM GCE
────────────────────────────────────────────────────────────────────
General Purpose t3, m6i, m7g B, Dv5, Dav5 e2, n2, n2d
Compute Optimized c6i, c7g Fsv2 c2, c2d, h3
Memory Optimized r6i, x2idn Ev5, Mv2 m2, m3
Storage Optimized i3, d3, i4i Lsv3 z3
Accelerated (GPU) p4d, g5, inf2 NCv3, NDv2 a2, g2
Nomenclatură AWS EC2: m6i.xlarge
m = familie (general purpose)
6 = generație
i = procesor Intel (g=Graviton ARM, a=AMD)
xlarge = dimensiune (nano < micro < small < medium < large < xlarge < 2xl...)
5.2 Modele de pricing¶
On-Demand: Plătești per oră/secundă. Fără commitment.
Cel mai scump, dar cel mai flexibil.
Folosire: workloads impredictibile, dev/test, burst.
Reserved Instances: 1 sau 3 ani commitment. Discount 30-72% vs. on-demand.
(RI / Savings Plans) Folosire: workloads stabile, producție, baze de date.
Spot Instances: Capacitate neutilizată AWS, cu discount până la 90%.
POATE FI OPRIT cu 2 minute notificare!
Folosire: batch processing, CI/CD, ML training, HPC.
Dedicated Hosts: Server fizic dedicat ție. Compliance, licențiere.
Cel mai scump model.
Comparație (exemplu m6i.xlarge, eu-west-1):
On-Demand: ~$0.192/oră = ~$140/lună
1yr RI: ~$0.121/oră = ~$88/lună (37% economie)
3yr RI: ~$0.077/oră = ~$56/lună (60% economie)
Spot: ~$0.057/oră = ~$42/lună (70% economie, dar interruptibil)
5.3 Configurare practică EC2¶
# Creare instanță EC2 cu AWS CLI:
aws ec2 run-instances \
--image-id ami-0abcdef1234567890 \
--instance-type t3.medium \
--key-name my-keypair \
--security-group-ids sg-0123456789abcdef0 \
--subnet-id subnet-0123456789abcdef0 \
--iam-instance-profile Name=EC2-SSM-Role \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=web-server-1},{Key=Environment,Value=production}]' \
--user-data file://startup-script.sh \
--block-device-mappings '[{"DeviceName":"/dev/xvda","Ebs":{"VolumeSize":50,"VolumeType":"gp3","Encrypted":true}}]' \
--metadata-options "HttpTokens=required,HttpEndpoint=enabled"
# User data script (execut la prima pornire):
#!/bin/bash
yum update -y
yum install -y httpd
systemctl start httpd
systemctl enable httpd
echo "<h1>Hello from $(hostname)</h1>" > /var/www/html/index.html
5.4 Terraform EC2¶
resource "aws_instance" "web" {
ami = data.aws_ami.amazon_linux.id
instance_type = "t3.medium"
subnet_id = aws_subnet.private[0].id
vpc_security_group_ids = [aws_security_group.web.id]
iam_instance_profile = aws_iam_instance_profile.ec2.name
key_name = aws_key_pair.deployer.key_name
root_block_device {
volume_size = 50
volume_type = "gp3"
encrypted = true
}
metadata_options {
http_tokens = "required" # IMDSv2 obligatoriu (securitate)
}
user_data = base64encode(templatefile("${path.module}/userdata.sh", {
app_version = var.app_version
environment = var.environment
}))
tags = {
Name = "web-server-${count.index + 1}"
Environment = var.environment
}
lifecycle {
create_before_destroy = true
}
}
6. Containere în cloud¶
6.1 Opțiuni de orchestrare¶
┌─────────────────────────────────────────────────────────────────┐
│ CONTAINERE ÎN CLOUD │
│ │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ COMPUTE: Unde rulează containerele? │ │
│ │ │ │
│ │ EC2 / VMs Fargate / ACI App Runner / │ │
│ │ (self-managed) (serverless Cloud Run │ │
│ │ Tu gestionezi containers) (fully managed │ │
│ │ nodurile Fără servere PaaS pentru │ │
│ │ de gestionat containere) │ │
│ └────────────────────────────────────────────────────────────┘ │
│ │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ ORCHESTRARE: Cine gestionează containerele? │ │
│ │ │ │
│ │ ECS EKS / AKS / GKE Docker Compose │ │
│ │ (AWS-native, (Kubernetes (dev/test only, │ │
│ │ simplu) managed) nu producție) │ │
│ └────────────────────────────────────────────────────────────┘ │
│ │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ REGISTRY: Unde stocăm imaginile? │ │
│ │ │ │
│ │ ECR / ACR / GCR / Artifact Registry / Docker Hub │ │
│ └────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
6.2 ECS cu Fargate (Terraform)¶
# ECS Cluster
resource "aws_ecs_cluster" "main" {
name = "app-cluster"
setting {
name = "containerInsights"
value = "enabled"
}
}
# Task Definition
resource "aws_ecs_task_definition" "app" {
family = "app-task"
network_mode = "awsvpc"
requires_compatibilities = ["FARGATE"]
cpu = "512" # 0.5 vCPU
memory = "1024" # 1 GB
execution_role_arn = aws_iam_role.ecs_execution.arn
task_role_arn = aws_iam_role.ecs_task.arn
container_definitions = jsonencode([{
name = "app"
image = "${aws_ecr_repository.app.repository_url}:latest"
essential = true
portMappings = [{
containerPort = 8000
protocol = "tcp"
}]
environment = [
{ name = "APP_ENV", value = "production" }
]
secrets = [
{ name = "DATABASE_URL", valueFrom = aws_ssm_parameter.db_url.arn }
]
logConfiguration = {
logDriver = "awslogs"
options = {
awslogs-group = aws_cloudwatch_log_group.app.name
awslogs-region = var.region
awslogs-stream-prefix = "app"
}
}
healthCheck = {
command = ["CMD-SHELL", "curl -f http://localhost:8000/health || exit 1"]
interval = 30
timeout = 5
retries = 3
startPeriod = 60
}
}])
}
# ECS Service
resource "aws_ecs_service" "app" {
name = "app-service"
cluster = aws_ecs_cluster.main.id
task_definition = aws_ecs_task_definition.app.arn
desired_count = 3
launch_type = "FARGATE"
network_configuration {
subnets = aws_subnet.private[*].id
security_groups = [aws_security_group.ecs.id]
assign_public_ip = false
}
load_balancer {
target_group_arn = aws_lb_target_group.app.arn
container_name = "app"
container_port = 8000
}
deployment_circuit_breaker {
enable = true
rollback = true # Rollback automat la deploy eșuat
}
}
7. Serverless / Functions-as-a-Service¶
7.1 Când serverless?¶
Ideal pentru:
✅ Event-driven (S3 upload → procesare, API Gateway → logică, SQS → worker)
✅ Trafic variabil / sporadic (de la 0 la mii de request-uri)
✅ Microservicii mici, funcții individuale
✅ Prototipare rapidă
✅ Cron jobs / batch processing
NU ideal pentru:
❌ Workloads cu latență constantă necesară (cold start: 100ms-3s)
❌ Procesare de lungă durată (>15 min pe Lambda)
❌ Workloads compute-intensive constante (mai scump decât EC2)
❌ Aplicații stateful complexe
7.2 AWS Lambda — exemple practice¶
# lambda_function.py — handler Lambda
import json
import boto3
import os
from datetime import datetime
s3 = boto3.client('s3')
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table(os.environ['TABLE_NAME'])
def handler(event, context):
"""
Triggered de: API Gateway, S3 Event, SQS, EventBridge, etc.
event: datele de intrare (format depinde de sursa trigger)
context: metadata runtime (request_id, time_remaining, memory_limit)
"""
# Exemplu 1: API Gateway trigger (REST API)
if 'httpMethod' in event:
method = event['httpMethod']
path = event['path']
body = json.loads(event.get('body', '{}'))
if method == 'GET' and path == '/users':
result = table.scan()
return {
'statusCode': 200,
'headers': {'Content-Type': 'application/json'},
'body': json.dumps(result['Items'], default=str)
}
elif method == 'POST' and path == '/users':
table.put_item(Item={
'id': context.aws_request_id,
'name': body['name'],
'email': body['email'],
'created_at': datetime.now().isoformat()
})
return {
'statusCode': 201,
'body': json.dumps({'message': 'User created'})
}
# Exemplu 2: S3 Event trigger (imagine uploadată → procesare)
if 'Records' in event and event['Records'][0].get('eventSource') == 'aws:s3':
bucket = event['Records'][0]['s3']['bucket']['name']
key = event['Records'][0]['s3']['object']['key']
print(f"New file uploaded: s3://{bucket}/{key}")
# Procesare: resize imagine, extragere text OCR, etc.
return {'statusCode': 200}
return {'statusCode': 400, 'body': 'Unknown event source'}
# Terraform Lambda
resource "aws_lambda_function" "api" {
function_name = "api-handler"
role = aws_iam_role.lambda.arn
handler = "lambda_function.handler"
runtime = "python3.12"
timeout = 30
memory_size = 256
filename = data.archive_file.lambda.output_path
source_code_hash = data.archive_file.lambda.output_base64sha256
environment {
variables = {
TABLE_NAME = aws_dynamodb_table.users.name
ENVIRONMENT = "production"
}
}
tracing_config {
mode = "Active" # AWS X-Ray tracing
}
}
# API Gateway → Lambda
resource "aws_apigatewayv2_api" "http" {
name = "http-api"
protocol_type = "HTTP"
}
resource "aws_apigatewayv2_integration" "lambda" {
api_id = aws_apigatewayv2_api.http.id
integration_type = "AWS_PROXY"
integration_uri = aws_lambda_function.api.invoke_arn
payload_format_version = "2.0"
}
resource "aws_apigatewayv2_route" "default" {
api_id = aws_apigatewayv2_api.http.id
route_key = "$default"
target = "integrations/${aws_apigatewayv2_integration.lambda.id}"
}
8. Auto Scaling și elasticitate¶
# Auto Scaling Group cu Launch Template
resource "aws_autoscaling_group" "web" {
name = "web-asg"
desired_capacity = 3
min_size = 2
max_size = 20
vpc_zone_identifier = aws_subnet.private[*].id
target_group_arns = [aws_lb_target_group.web.arn]
health_check_type = "ELB"
launch_template {
id = aws_launch_template.web.id
version = "$Latest"
}
instance_refresh {
strategy = "Rolling"
preferences {
min_healthy_percentage = 75
}
}
tag {
key = "Name"
value = "web-server"
propagate_at_launch = true
}
}
# Scaling Policy — Target Tracking (cel mai simplu și recomandat):
resource "aws_autoscaling_policy" "cpu" {
name = "cpu-target-tracking"
autoscaling_group_name = aws_autoscaling_group.web.name
policy_type = "TargetTrackingScaling"
target_tracking_configuration {
predefined_metric_specification {
predefined_metric_type = "ASGAverageCPUUtilization"
}
target_value = 60.0 # Menține CPU la ~60% în medie
}
}
# Scheduled Scaling (predictibil — ex: ore de vârf):
resource "aws_autoscaling_schedule" "morning_scale_up" {
autoscaling_group_name = aws_autoscaling_group.web.name
scheduled_action_name = "morning-scale-up"
min_size = 5
max_size = 30
desired_capacity = 10
recurrence = "0 8 * * MON-FRI" # Luni-Vineri la 08:00
}
PARTEA III — NETWORKING¶
9. Virtual Private Cloud (VPC)¶
9.1 Arhitectura VPC tipică producție¶
┌──────────────────────────────────────────────────────────────────┐
│ VPC: 10.0.0.0/16 │
│ │
│ ┌─────────── AZ-a ──────────┐ ┌─────────── AZ-b ─────────┐ │
│ │ │ │ │ │
│ │ Public Subnet │ │ Public Subnet │ │
│ │ 10.0.1.0/24 │ │ 10.0.2.0/24 │ │
│ │ ┌────────┐ ┌────────┐ │ │ ┌────────┐ ┌────────┐ │ │
│ │ │ ALB │ │NAT GW │ │ │ │ ALB │ │NAT GW │ │ │
│ │ └────────┘ └────────┘ │ │ └────────┘ └────────┘ │ │
│ │ │ │ │ │
│ │ Private Subnet (App) │ │ Private Subnet (App) │ │
│ │ 10.0.11.0/24 │ │ 10.0.12.0/24 │ │
│ │ ┌────────┐ ┌────────┐ │ │ ┌────────┐ ┌────────┐ │ │
│ │ │ EC2/ECS│ │ EC2/ECS│ │ │ │ EC2/ECS│ │ EC2/ECS│ │ │
│ │ └────────┘ └────────┘ │ │ └────────┘ └────────┘ │ │
│ │ │ │ │ │
│ │ Private Subnet (DB) │ │ Private Subnet (DB) │ │
│ │ 10.0.21.0/24 │ │ 10.0.22.0/24 │ │
│ │ ┌────────┐ │ │ ┌────────┐ │ │
│ │ │ RDS │ (primary) │ │ │ RDS │ (standby) │ │
│ │ └────────┘ │ │ └────────┘ │ │
│ │ │ │ │ │
│ └────────────────────────────┘ └───────────────────────────┘ │
│ │
│ ┌─────────┐ │
│ │ Internet│←── Internet Gateway (IGW) │
│ │ Gateway │ │
│ └─────────┘ │
│ │
│ Route Tables: │
│ Public: 0.0.0.0/0 → IGW (acces direct internet) │
│ Private: 0.0.0.0/0 → NAT GW (internet outbound-only) │
│ DB: no default route (complet izolat de internet) │
│ │
│ VPC Endpoints: │
│ S3 Gateway Endpoint (trafic S3 fără a trece prin internet) │
│ Interface Endpoints: ECR, CloudWatch, SSM, Secrets Manager │
└──────────────────────────────────────────────────────────────────┘
9.2 Terraform VPC complet¶
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "~> 5.0"
name = "production-vpc"
cidr = "10.0.0.0/16"
azs = ["eu-west-1a", "eu-west-1b", "eu-west-1c"]
public_subnets = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"]
private_subnets = ["10.0.11.0/24", "10.0.12.0/24", "10.0.13.0/24"]
database_subnets = ["10.0.21.0/24", "10.0.22.0/24", "10.0.23.0/24"]
enable_nat_gateway = true
single_nat_gateway = false # Un NAT GW per AZ (HA)
one_nat_gateway_per_az = true
enable_dns_hostnames = true
enable_dns_support = true
create_database_subnet_group = true
create_database_subnet_route_table = true
# VPC Flow Logs
enable_flow_log = true
create_flow_log_cloudwatch_log_group = true
create_flow_log_iam_role = true
tags = {
Environment = "production"
Terraform = "true"
}
public_subnet_tags = {
"kubernetes.io/role/elb" = "1"
}
private_subnet_tags = {
"kubernetes.io/role/internal-elb" = "1"
}
}
# Security Group — web servers
resource "aws_security_group" "web" {
name_prefix = "web-"
vpc_id = module.vpc.vpc_id
ingress {
from_port = 8000
to_port = 8000
protocol = "tcp"
security_groups = [aws_security_group.alb.id] # Doar de la ALB
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
lifecycle {
create_before_destroy = true
}
}
# Security Group — database
resource "aws_security_group" "db" {
name_prefix = "db-"
vpc_id = module.vpc.vpc_id
ingress {
from_port = 5432
to_port = 5432
protocol = "tcp"
security_groups = [aws_security_group.web.id] # Doar de la app servers
}
# Fără egress către internet → complet izolat
}
10. Load balancing¶
AWS Azure GCP
──────────────────────────────────────────────────────────────────────
Layer 7 (HTTP/S) ALB App Gateway HTTP(S) LB
Layer 4 (TCP/UDP) NLB Azure LB TCP/UDP LB
DNS-based Route53 Traffic Manager Cloud DNS
Global CloudFront + ALB Front Door Global LB
# Application Load Balancer (ALB) — Terraform
resource "aws_lb" "main" {
name = "app-alb"
internal = false
load_balancer_type = "application"
security_groups = [aws_security_group.alb.id]
subnets = module.vpc.public_subnets
enable_deletion_protection = true
access_logs {
bucket = aws_s3_bucket.alb_logs.id
enabled = true
}
}
resource "aws_lb_listener" "https" {
load_balancer_arn = aws_lb.main.arn
port = 443
protocol = "HTTPS"
ssl_policy = "ELBSecurityPolicy-TLS13-1-2-2021-06"
certificate_arn = aws_acm_certificate.main.arn
default_action {
type = "forward"
target_group_arn = aws_lb_target_group.app.arn
}
}
# Redirect HTTP → HTTPS
resource "aws_lb_listener" "http_redirect" {
load_balancer_arn = aws_lb.main.arn
port = 80
protocol = "HTTP"
default_action {
type = "redirect"
redirect {
port = "443"
protocol = "HTTPS"
status_code = "HTTP_301"
}
}
}
# Path-based routing (microservicii):
resource "aws_lb_listener_rule" "api" {
listener_arn = aws_lb_listener.https.arn
priority = 100
condition {
path_pattern { values = ["/api/*"] }
}
action {
type = "forward"
target_group_arn = aws_lb_target_group.api.arn
}
}
11. DNS, CDN și accelerare globală¶
# Route53 — DNS
resource "aws_route53_zone" "main" {
name = "example.com"
}
resource "aws_route53_record" "app" {
zone_id = aws_route53_zone.main.zone_id
name = "app.example.com"
type = "A"
alias {
name = aws_lb.main.dns_name
zone_id = aws_lb.main.zone_id
evaluate_target_health = true
}
}
# CloudFront CDN
resource "aws_cloudfront_distribution" "cdn" {
enabled = true
default_root_object = "index.html"
aliases = ["app.example.com"]
price_class = "PriceClass_100" # Only NA + EU (mai ieftin)
origin {
domain_name = aws_lb.main.dns_name
origin_id = "alb"
custom_origin_config {
http_port = 80
https_port = 443
origin_protocol_policy = "https-only"
origin_ssl_protocols = ["TLSv1.2"]
}
}
# Cache static assets agresiv, bypass cache pentru API:
ordered_cache_behavior {
path_pattern = "/api/*"
target_origin_id = "alb"
allowed_methods = ["GET", "HEAD", "OPTIONS", "PUT", "POST", "PATCH", "DELETE"]
cached_methods = ["GET", "HEAD"]
cache_policy_id = data.aws_cloudfront_cache_policy.disabled.id
origin_request_policy_id = data.aws_cloudfront_origin_request_policy.all_viewer.id
viewer_protocol_policy = "redirect-to-https"
}
default_cache_behavior {
target_origin_id = "alb"
allowed_methods = ["GET", "HEAD"]
cached_methods = ["GET", "HEAD"]
cache_policy_id = data.aws_cloudfront_cache_policy.optimized.id
viewer_protocol_policy = "redirect-to-https"
compress = true
}
viewer_certificate {
acm_certificate_arn = aws_acm_certificate.us_east_1.arn # MUST be us-east-1!
ssl_support_method = "sni-only"
minimum_protocol_version = "TLSv1.2_2021"
}
restrictions {
geo_restriction { restriction_type = "none" }
}
}
PARTEA IV — STOCARE ȘI BAZE DE DATE¶
13. Object Storage (S3)¶
resource "aws_s3_bucket" "data" {
bucket = "mycompany-production-data"
}
resource "aws_s3_bucket_versioning" "data" {
bucket = aws_s3_bucket.data.id
versioning_configuration { status = "Enabled" }
}
resource "aws_s3_bucket_server_side_encryption_configuration" "data" {
bucket = aws_s3_bucket.data.id
rule {
apply_server_side_encryption_by_default {
sse_algorithm = "aws:kms"
kms_master_key_id = aws_kms_key.s3.arn
}
bucket_key_enabled = true
}
}
# Lifecycle rules — optimizare costuri automate:
resource "aws_s3_bucket_lifecycle_configuration" "data" {
bucket = aws_s3_bucket.data.id
rule {
id = "archive-old-data"
status = "Enabled"
transition {
days = 90
storage_class = "STANDARD_IA" # Infrequent Access: -40% cost
}
transition {
days = 180
storage_class = "GLACIER_IR" # Glacier Instant Retrieval: -68%
}
transition {
days = 365
storage_class = "DEEP_ARCHIVE" # Deep Archive: -95% cost
}
noncurrent_version_expiration {
noncurrent_days = 30 # Șterge versiuni vechi după 30 zile
}
}
}
# Block Public Access (MEREU activat în producție):
resource "aws_s3_bucket_public_access_block" "data" {
bucket = aws_s3_bucket.data.id
block_public_acls = true
block_public_policy = true
ignore_public_acls = true
restrict_public_buckets = true
}
Clase de stocare S3:
S3 Standard: Acces frecvent, latență mică ~$0.023/GB
S3 Standard-IA: Acces rar (>30 zile), cost per acces ~$0.0125/GB
S3 One Zone-IA: Ca IA dar un singur AZ (mai puțin HA) ~$0.01/GB
S3 Glacier Instant: Arhivare cu acces instant (ms) ~$0.004/GB
S3 Glacier Flexible: Arhivare, retrieval ore ~$0.0036/GB
S3 Deep Archive: Arhivare lungă (7-10 ani), 12h retr. ~$0.00099/GB
S3 Intelligent-Tier: Mișcă automat între clase ~$0.023/GB + fee
15. Baze de date managed¶
┌─────────────────────────────────────────────────────────────────┐
│ Tip AWS Azure GCP │
├─────────────────────────────────────────────────────────────────┤
│ Relațional RDS (PostgreSQL, Azure SQL DB Cloud SQL │
│ (managed) MySQL, MariaDB) Azure DB for PG AlloyDB │
│ Aurora (PG/MySQL) │
│ │
│ NoSQL Document DynamoDB CosmosDB Firestore │
│ DocumentDB │
│ │
│ Key-Value ElastiCache Azure Cache Memorystore│
│ / Cache (Redis, Memcached) (Redis) (Redis) │
│ │
│ Graph Neptune CosmosDB (Gremlin) Neo4j AE │
│ │
│ Time-series Timestream Azure Data Exp. Bigtable │
│ │
│ Search OpenSearch Cognitive Search — │
└─────────────────────────────────────────────────────────────────┘
# RDS PostgreSQL cu Multi-AZ (High Availability)
resource "aws_db_instance" "main" {
identifier = "app-database"
engine = "postgres"
engine_version = "16.2"
instance_class = "db.r6g.large" # Graviton (ARM) — preț/performanță optim
allocated_storage = 100
max_allocated_storage = 500 # Auto-scaling stocare
storage_type = "gp3"
storage_encrypted = true
kms_key_id = aws_kms_key.rds.arn
db_name = "appdb"
username = "dbadmin"
password = random_password.db.result
port = 5432
multi_az = true # Standby în alt AZ (failover automat)
db_subnet_group_name = aws_db_subnet_group.main.name
vpc_security_group_ids = [aws_security_group.db.id]
backup_retention_period = 14 # 14 zile de backup automate
backup_window = "03:00-04:00"
maintenance_window = "sun:04:00-sun:05:00"
performance_insights_enabled = true
monitoring_interval = 60
monitoring_role_arn = aws_iam_role.rds_monitoring.arn
deletion_protection = true
skip_final_snapshot = false
final_snapshot_identifier = "app-database-final"
tags = { Environment = "production" }
}
# Stocare password în Secrets Manager:
resource "aws_secretsmanager_secret" "db" {
name = "production/database/credentials"
}
resource "aws_secretsmanager_secret_version" "db" {
secret_id = aws_secretsmanager_secret.db.id
secret_string = jsonencode({
username = aws_db_instance.main.username
password = random_password.db.result
host = aws_db_instance.main.address
port = aws_db_instance.main.port
dbname = aws_db_instance.main.db_name
})
}
PARTEA V — SECURITATE ȘI IDENTITATE¶
17. IAM — Identity and Access Management¶
17.1 Principiul Least Privilege¶
// ❌ GREȘIT — admin access pe tot:
{
"Effect": "Allow",
"Action": "*",
"Resource": "*"
}
// ✅ CORECT — doar ce e necesar:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ReadOnlyS3Bucket",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::my-app-data",
"arn:aws:s3:::my-app-data/*"
]
},
{
"Sid": "WriteSpecificDynamoTable",
"Effect": "Allow",
"Action": [
"dynamodb:PutItem",
"dynamodb:GetItem",
"dynamodb:UpdateItem",
"dynamodb:Query"
],
"Resource": "arn:aws:dynamodb:eu-west-1:123456789:table/users"
}
]
}
17.2 IAM Roles — nu chei statice!¶
# Roluri IAM pentru servicii (nu chei statice niciodată!)
# Rol pentru Lambda:
resource "aws_iam_role" "lambda" {
name = "lambda-execution-role"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Action = "sts:AssumeRole"
Effect = "Allow"
Principal = { Service = "lambda.amazonaws.com" }
}]
})
}
resource "aws_iam_role_policy_attachment" "lambda_basic" {
role = aws_iam_role.lambda.name
policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
}
# Politică custom inline:
resource "aws_iam_role_policy" "lambda_s3" {
name = "lambda-s3-access"
role = aws_iam_role.lambda.id
policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Action = ["s3:GetObject"]
Resource = "${aws_s3_bucket.data.arn}/*"
}]
})
}
20. Compliance, audit și logging¶
# CloudTrail — auditează TOATE apelurile API AWS:
resource "aws_cloudtrail" "main" {
name = "org-trail"
s3_bucket_name = aws_s3_bucket.cloudtrail.id
include_global_service_events = true
is_multi_region_trail = true
enable_log_file_validation = true
kms_key_id = aws_kms_key.cloudtrail.arn
event_selector {
read_write_type = "All"
include_management_events = true
data_resource {
type = "AWS::S3::Object"
values = ["arn:aws:s3"]
}
}
}
# AWS Config — verificare continuă a conformității:
resource "aws_config_config_rule" "s3_encryption" {
name = "s3-bucket-server-side-encryption-enabled"
source {
owner = "AWS"
source_identifier = "S3_BUCKET_SERVER_SIDE_ENCRYPTION_ENABLED"
}
}
resource "aws_config_config_rule" "restricted_ssh" {
name = "restricted-ssh"
source {
owner = "AWS"
source_identifier = "INCOMING_SSH_DISABLED"
}
}
PARTEA VI — IaC ȘI AUTOMATIZARE¶
21. Terraform — de la baze la module avansate¶
21.1 Structura proiect Terraform producție¶
infrastructure/
├── modules/ # Module reutilizabile
│ ├── vpc/
│ │ ├── main.tf
│ │ ├── variables.tf
│ │ ├── outputs.tf
│ │ └── README.md
│ ├── ecs-service/
│ ├── rds/
│ ├── lambda-function/
│ └── monitoring/
│
├── environments/ # Configurări per mediu
│ ├── dev/
│ │ ├── main.tf # Apelează modulele
│ │ ├── variables.tf
│ │ ├── terraform.tfvars # Valori specifice dev
│ │ └── backend.tf # S3 backend config
│ ├── staging/
│ └── production/
│ ├── main.tf
│ ├── variables.tf
│ ├── terraform.tfvars
│ └── backend.tf
│
├── global/ # Resurse globale (IAM, Route53 zone)
│ └── iam/
│
└── .github/workflows/terraform.yml # CI/CD pipeline
21.2 Pattern-uri Terraform avansate¶
# === Terraform State Remote (S3 + DynamoDB) ===
terraform {
required_version = ">= 1.5"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
backend "s3" {
bucket = "mycompany-terraform-state"
key = "production/infrastructure.tfstate"
region = "eu-west-1"
dynamodb_table = "terraform-locks"
encrypt = true
}
}
# === Data Sources (referire resurse existente) ===
data "aws_caller_identity" "current" {}
data "aws_region" "current" {}
data "aws_ami" "amazon_linux" {
most_recent = true
owners = ["amazon"]
filter {
name = "name"
values = ["al2023-ami-*-x86_64"]
}
}
# === for_each (multiple resurse din map) ===
variable "services" {
type = map(object({
cpu = number
memory = number
port = number
}))
default = {
api = { cpu = 512, memory = 1024, port = 8000 }
worker = { cpu = 1024, memory = 2048, port = 0 }
web = { cpu = 256, memory = 512, port = 3000 }
}
}
resource "aws_ecs_service" "services" {
for_each = var.services
name = each.key
cluster = aws_ecs_cluster.main.id
task_definition = aws_ecs_task_definition.services[each.key].arn
desired_count = each.key == "worker" ? 2 : 3
launch_type = "FARGATE"
# ... configurare ...
}
# === Moved blocks (refactoring fără distrugere) ===
moved {
from = aws_instance.web
to = module.compute.aws_instance.web
}
# === Import (adoptă resurse existente în Terraform) ===
import {
to = aws_s3_bucket.existing
id = "my-existing-bucket-name"
}
PARTEA VII — OBSERVABILITATE ȘI OPERARE¶
25. Monitorizare¶
# CloudWatch Dashboard
resource "aws_cloudwatch_dashboard" "main" {
dashboard_name = "Production-Overview"
dashboard_body = jsonencode({
widgets = [
{
type = "metric"
properties = {
title = "ALB Request Count"
metrics = [["AWS/ApplicationELB", "RequestCount", "LoadBalancer", aws_lb.main.arn_suffix]]
period = 300
stat = "Sum"
}
},
{
type = "metric"
properties = {
title = "ECS CPU Utilization"
metrics = [["AWS/ECS", "CPUUtilization", "ClusterName", "app-cluster", "ServiceName", "app-service"]]
period = 300
stat = "Average"
}
},
{
type = "metric"
properties = {
title = "RDS Connections"
metrics = [["AWS/RDS", "DatabaseConnections", "DBInstanceIdentifier", "app-database"]]
period = 300
}
}
]
})
}
# CloudWatch Alarms
resource "aws_cloudwatch_metric_alarm" "high_5xx" {
alarm_name = "high-5xx-errors"
comparison_operator = "GreaterThanThreshold"
evaluation_periods = 2
metric_name = "HTTPCode_Target_5XX_Count"
namespace = "AWS/ApplicationELB"
period = 300
statistic = "Sum"
threshold = 50
alarm_description = "High 5xx error rate on ALB"
dimensions = {
LoadBalancer = aws_lb.main.arn_suffix
}
alarm_actions = [aws_sns_topic.alerts.arn]
ok_actions = [aws_sns_topic.alerts.arn]
}
resource "aws_cloudwatch_metric_alarm" "rds_cpu" {
alarm_name = "rds-high-cpu"
comparison_operator = "GreaterThanThreshold"
evaluation_periods = 3
metric_name = "CPUUtilization"
namespace = "AWS/RDS"
period = 300
statistic = "Average"
threshold = 80
alarm_description = "RDS CPU > 80% for 15 minutes"
dimensions = {
DBInstanceIdentifier = aws_db_instance.main.identifier
}
alarm_actions = [aws_sns_topic.alerts.arn]
}
28. Optimizarea costurilor (FinOps)¶
28.1 Principii FinOps¶
1. VIZIBILITATE — Înțelege unde se duc banii
- AWS Cost Explorer, Billing Dashboard
- Tag-uri pe TOATE resursele (Environment, Team, Project, CostCenter)
- Buget alerte: AWS Budgets → SNS → Slack/Email
2. OPTIMIZARE — Reduce risipa
- Right-sizing: instanțe supradimensionate (Compute Optimizer)
- Savings Plans / Reserved Instances: workloads stabile (30-60% economie)
- Spot Instances: workloads tolerante la întrerupere (70-90% economie)
- S3 Lifecycle: mută date vechi în clase mai ieftine automat
- Oprește resurse dev/test în weekend: Instance Scheduler
- Șterge resurse orfane: EBS volumes, Elastic IPs, snapshots vechi
3. GUVERNANȚĂ — Controlează și previne
- Service Control Policies (SCP): limitează ce pot face conturile
- AWS Budgets cu acțiuni automate
- Tagging enforcement (AWS Config rules)
# AWS Budget cu alertă
resource "aws_budgets_budget" "monthly" {
name = "monthly-total"
budget_type = "COST"
limit_amount = "5000"
limit_unit = "USD"
time_unit = "MONTHLY"
notification {
comparison_operator = "GREATER_THAN"
threshold = 80 # La 80% din buget
threshold_type = "PERCENTAGE"
notification_type = "ACTUAL"
subscriber_email_addresses = ["finops@company.com"]
}
notification {
comparison_operator = "GREATER_THAN"
threshold = 100 # La 100% (budget depășit)
threshold_type = "PERCENTAGE"
notification_type = "FORECASTED" # Prognoza depășirii
subscriber_email_addresses = ["finops@company.com", "cto@company.com"]
}
}
# Tag policy enforcement:
resource "aws_config_config_rule" "required_tags" {
name = "required-tags"
source {
owner = "AWS"
source_identifier = "REQUIRED_TAGS"
}
input_parameters = jsonencode({
tag1Key = "Environment"
tag2Key = "Team"
tag3Key = "Project"
})
}
PARTEA VIII — ARHITECTURI AVANSATE¶
29. Arhitecturi multi-tier și microservicii¶
Arhitectură serverless completă (exemplu e-commerce):
┌──────────────────────────────────────────────────────────────────┐
│ │
│ CloudFront (CDN) │
│ │ │
│ ├── S3 (static assets: React/Vue frontend) │
│ │ │
│ └── API Gateway (REST/HTTP API) │
│ │ │
│ ┌───────┴────────┐ │
│ │ │ │
│ Lambda: /products Lambda: /orders │
│ │ │ │
│ ▼ ▼ │
│ DynamoDB DynamoDB ┌─────────────────┐ │
│ (products) (orders) │ EventBridge │ │
│ │ │ (event bus) │ │
│ └──────────────┤ │ │
│ │ order.created │ │
│ ┌──────────────────┤ order.paid │ │
│ │ │ order.shipped │ │
│ ▼ └─────────────────┘ │
│ Lambda: │ │
│ payment-processor ▼ │
│ │ Lambda: │
│ ▼ send-notification │
│ Stripe API │ │
│ ▼ │
│ SES (email) │
│ SNS (push) │
│ │
│ Cognito (autentificare) WAF (protecție) X-Ray (tracing) │
└──────────────────────────────────────────────────────────────────┘
30. Event-driven architecture și messaging¶
Servicii de messaging AWS:
SQS (Simple Queue Service):
- Message queue (point-to-point)
- Standard: at-least-once, throughput nelimitat
- FIFO: exactly-once, ordinea garantată, 3000 msg/s
- Dead Letter Queue: mesaje eșuate → analiză
SNS (Simple Notification Service):
- Pub/Sub (fan-out: un mesaj → mulți consumatori)
- Topic → subscriptions (Lambda, SQS, HTTP, email, SMS)
EventBridge:
- Event bus avansat (routing pe baza conținutului evenimentului)
- Reguli: if event matches pattern → trigger target
- 100+ integrări native (AWS services + SaaS)
Kinesis:
- Real-time streaming (ca Kafka managed)
- Kinesis Data Streams: ingestion real-time
- Kinesis Firehose: delivery la S3/Redshift/OpenSearch
# Pattern: SQS + Lambda (procesare asincronă fiabilă)
resource "aws_sqs_queue" "orders" {
name = "order-processing"
visibility_timeout_seconds = 300 # 5 min (6× Lambda timeout)
message_retention_seconds = 1209600 # 14 zile
receive_wait_time_seconds = 20 # Long polling (eficient)
redrive_policy = jsonencode({
deadLetterTargetArn = aws_sqs_queue.orders_dlq.arn
maxReceiveCount = 3 # După 3 eșecuri → DLQ
})
}
resource "aws_sqs_queue" "orders_dlq" {
name = "order-processing-dlq"
message_retention_seconds = 1209600
}
resource "aws_lambda_event_source_mapping" "sqs_lambda" {
event_source_arn = aws_sqs_queue.orders.arn
function_name = aws_lambda_function.process_order.arn
batch_size = 10
maximum_batching_window_in_seconds = 5
function_response_types = ["ReportBatchItemFailures"]
}
32. Disaster Recovery și Business Continuity¶
Strategii DR (de la cea mai ieftină la cea mai rapidă):
┌────────────────────────────────────────────────────────────────┐
│ Strategie │ RPO │ RTO │ Cost │ Descriere│
├────────────────────────────────────────────────────────────────┤
│ Backup & Restore│ Ore │ Ore-Zile │ $ │ Backup │
│ │ │ │ │ S3 cross-│
│ │ │ │ │ region │
├────────────────────────────────────────────────────────────────┤
│ Pilot Light │ Minute │ Ore │ $$ │ DB repli-│
│ │ │ │ │ cat, comp│
│ │ │ │ │ ute oprit│
├────────────────────────────────────────────────────────────────┤
│ Warm Standby │ Secunde │ Minute │ $$$ │ Env mini-│
│ │ │ │ │ mal activ│
│ │ │ │ │ scale up │
│ │ │ │ │ la DR │
├────────────────────────────────────────────────────────────────┤
│ Multi-Site │ ~0 │ ~0 │ $$$$ │ Active- │
│ Active-Active │(real-time) │(automat) │ │ active │
│ │ │ │ │ ambele │
│ │ │ │ │ regiuni │
└────────────────────────────────────────────────────────────────┘
RPO = Recovery Point Objective (cât de multe date poți pierde)
RTO = Recovery Time Objective (cât durează să revii online)
33. Cloud-native design patterns¶
1. Circuit Breaker: Oprește apelurile la un serviciu defect
pentru a evita cascading failure.
2. Retry + Backoff: Reîncercare cu delay exponențial
(1s, 2s, 4s, 8s... + jitter random).
3. Bulkhead: Izolarea resurselor per serviciu/funcție
(un serviciu supraîncărcat nu afectează altele).
4. Saga Pattern: Tranzacții distribuite prin secvență de
tranzacții locale + compensări la eșec.
5. CQRS: Command Query Responsibility Segregation.
Scrie în DB normalizată, citește din view optimizat.
6. Event Sourcing: Stochează TOATE evenimentele (nu starea curentă).
Starea = replay-ul tuturor evenimentelor.
7. Sidecar: Funcționalitate auxiliară într-un container
alăturat (logging, proxy, service mesh).
8. Strangler Fig: Migrare incrementală: noul sistem „înghite"
treptat funcționalitățile vechiului sistem.
Anexe¶
A. Echivalențe între provideri¶
| Serviciu | AWS | Azure | GCP |
|---|---|---|---|
| Compute (VM) | EC2 | Virtual Machines | Compute Engine |
| Containers (managed K8s) | EKS | AKS | GKE |
| Serverless containers | Fargate | Container Instances | Cloud Run |
| Functions | Lambda | Azure Functions | Cloud Functions |
| Object Storage | S3 | Blob Storage | Cloud Storage |
| Block Storage | EBS | Managed Disks | Persistent Disk |
| Relational DB | RDS / Aurora | Azure SQL / Azure DB | Cloud SQL / AlloyDB |
| NoSQL Document | DynamoDB | CosmosDB | Firestore |
| Cache | ElastiCache | Azure Cache for Redis | Memorystore |
| Message Queue | SQS | Service Bus Queue | Cloud Tasks / Pub/Sub |
| Pub/Sub | SNS | Service Bus Topics | Pub/Sub |
| Event Bus | EventBridge | Event Grid | Eventarc |
| DNS | Route 53 | Azure DNS | Cloud DNS |
| CDN | CloudFront | Front Door / CDN | Cloud CDN |
| Load Balancer L7 | ALB | Application Gateway | HTTP(S) LB |
| VPN | Site-to-Site VPN | VPN Gateway | Cloud VPN |
| IAM | IAM | Entra ID (Azure AD) | Cloud IAM |
| Secrets | Secrets Manager | Key Vault | Secret Manager |
| Monitoring | CloudWatch | Azure Monitor | Cloud Monitoring |
| Logging | CloudWatch Logs | Log Analytics | Cloud Logging |
| IaC | CloudFormation | ARM / Bicep | Deployment Manager |
| Container Registry | ECR | ACR | Artifact Registry |
B. Checklist producție cloud¶
NETWORKING:
□ VPC cu subrețele public/private/database pe 3+ AZ
□ NAT Gateway per AZ (high availability)
□ Security Groups: least privilege, referințe între SG-uri
□ VPC Flow Logs activate
□ VPC Endpoints pentru servicii AWS (S3, ECR, etc.)
□ Fără SSH/RDP direct (folosește SSM Session Manager)
COMPUTE:
□ Auto Scaling configurat (min/max/desired)
□ Health checks la nivel ALB + aplicație
□ IMDSv2 obligatoriu pe EC2
□ Graviton/ARM acolo unde e posibil (20% mai ieftin)
STOCARE:
□ S3: versioning, encryption, block public access, lifecycle
□ EBS: encryption, backup/snapshot automate
BAZE DE DATE:
□ Multi-AZ (failover automat)
□ Backup automat (min 14 zile retenție)
□ Encryption at rest + in transit
□ Performance Insights activat
□ Credențiale în Secrets Manager (nu hardcodate!)
SECURITATE:
□ IAM roles (nu access keys) pentru servicii
□ MFA pe root account și toți userii IAM
□ CloudTrail activat (toate regiunile)
□ AWS Config rules active
□ GuardDuty activat
□ Criptare everywhere (at rest + in transit)
OBSERVABILITATE:
□ CloudWatch alarms pe metrici critice
□ Logging centralizat
□ Dashboards per serviciu
□ Alertare → PagerDuty / Slack / Email
COST:
□ Tagging pe TOATE resursele
□ AWS Budgets cu alerte
□ Savings Plans / RI pentru workloads stabile
□ Revizuire lunară Compute Optimizer
□ Cleanup resurse orfane (periodic)
DR:
□ Backup cross-region pentru date critice
□ DR plan documentat și TESTAT (cel puțin semestrial)
□ Runbooks pentru scenarii de failure
Curs realizat ca material de referință pentru cloud engineers, DevOps engineers, solutions architects și echipe de infrastructură.