Se la tua fattura AWS cresce ogni mese senza capirne il perché, non sei solo. Secondo dati di Flexera, le aziende sprecano in media il 32% della spesa cloud. In Soamee abbiamo aiutato clienti a ridurre i costi AWS tra il 30% e il 60% senza sacrificare le prestazioni. Questa guida raccoglie le strategie che funzionano.
Prima di ottimizzare: capisci la tua fattura
Il primo passo è sapere dove va il denaro. AWS Cost Explorer è il tuo strumento principale.
Configurazione iniziale
- Attiva Cost Explorer nell’account root (impiega 24h per iniziare a mostrare dati)
- Configura i tag di costo: Etichetta tutte le risorse con almeno
Environment(prod/staging/dev),Team(team responsabile) eProject(progetto) - Attiva le notifiche di fatturazione: In AWS Budgets, crea alert al 50%, 80% e 100% del tuo budget mensile
# Creare un'alert di budget con AWS CLI
aws budgets create-budget \
--account-id 123456789012 \
--budget '{
"BudgetName": "MonthlyBudget",
"BudgetLimit": {"Amount": "5000", "Unit": "USD"},
"TimeUnit": "MONTHLY",
"BudgetType": "COST"
}' \
--notifications-with-subscribers '[{
"Notification": {
"NotificationType": "ACTUAL",
"ComparisonOperator": "GREATER_THAN",
"Threshold": 80,
"ThresholdType": "PERCENTAGE"
},
"Subscribers": [{
"SubscriptionType": "EMAIL",
"Address": "devops@tuazienda.com"
}]
}]'
I soliti sospettati
Nella nostra esperienza, gli sprechi maggiori sono in:
- EC2: Istanze sovradimensionate o che girano 24/7 senza necessità
- RDS: Database di sviluppo accesi fuori orario
- EBS: Volumi orfani (senza istanza associata)
- Elastic IP: IP elastici non associati a nessuna istanza (vengono addebitati)
- S3: Dati che dovrebbero essere in Glacier o eliminati
- NAT Gateway: Traffico non necessario attraverso il NAT (~0.045 USD/GB)
- CloudWatch Logs: Ritenzione infinita di log che nessuno consulta
Strategia 1: Right-sizing (risparmio immediato del 20-40%)
Right-sizing significa adeguare la dimensione delle istanze a ciò di cui hanno davvero bisogno. È il modo più rapido per ridurre i costi.
Come rilevare istanze sovradimensionate
AWS Compute Optimizer analizza l’utilizzo di CPU, memoria e rete delle tue istanze e raccomanda dimensioni più adeguate.
# Ottenere raccomandazioni di Compute Optimizer
aws compute-optimizer get-ec2-instance-recommendations \
--filters Name=Finding,Values=OVER_PROVISIONED \
--output table
Regola pratica:
- Se la CPU media è inferiore al 20% per 2 settimane, riduci di una dimensione
- Se la memoria usata è inferiore al 50%, considera un’istanza con meno RAM
- Se il traffico di rete è basso, non hai bisogno di istanze “network optimized”
Esempio reale
| Istanza corrente | Utilizzo CPU medio | Utilizzo memoria | Raccomandazione | Risparmio mensile |
|---|---|---|---|---|
| m5.2xlarge (8 vCPU, 32 GB) | 12% | 35% | m5.large (2 vCPU, 8 GB) | 220 USD |
| r5.xlarge (4 vCPU, 32 GB) | 8% | 18% | t3.medium (2 vCPU, 4 GB) | 180 USD |
| c5.4xlarge (16 vCPU, 32 GB) | 45% | 60% | c5.2xlarge (8 vCPU, 16 GB) | 175 USD |
Solo con right-sizing di 3 istanze: 575 USD/mese di risparmio (6.900 USD/anno).
Strategia 2: Reserved Instances e Savings Plans
Se sai già che utilizzerai una certa capacità per 1-3 anni, le Reserved Instances (RI) e i Savings Plans offrono sconti dal 30% al 72%.
Savings Plans vs Reserved Instances
| Caratteristica | Savings Plans | Reserved Instances |
|---|---|---|
| Flessibilità | Alta (qualsiasi istanza) | Bassa (famiglia/regione fissa) |
| Sconto massimo | ~66% (3 anni, tutto anticipato) | ~72% (3 anni, tutto anticipato) |
| Impegno | Spesa per ora in USD | Tipo di istanza specifico |
| Consigliato per | La maggior parte dei casi | Workload molto stabili |
La nostra raccomandazione: Inizia con Compute Savings Plans per il baseline della tua infrastruttura (il carico sempre acceso). Sono più flessibili delle RI e gli sconti sono quasi uguali.
Come calcolare l’impegno corretto
Spesa on-demand mensile stabile: 3.000 USD
Fattore di sicurezza: 0.8 (impegnati sull'80% del baseline)
Impegno mensile: 2.400 USD
Sconto Savings Plan (1 anno, senza anticipazione): ~30%
Risparmio mensile: 720 USD
Risparmio annuale: 8.640 USD
Regola d’oro: Non impegnarti mai per più dell’80% del tuo carico base. Il 20% rimanente ti dà flessibilità per i cambiamenti.
Strategia 3: Spot Instances (risparmio del 60-90%)
Le Spot Instances sono capacità in eccesso di AWS offerta con sconti fino al 90%. Il compromesso: AWS può reclamarle con 2 minuti di preavviso.
Dove usare Spot
- Pipeline CI/CD: Le build tollerano le interruzioni
- Batch processing: Job che possono essere riavviati
- Worker di code: Elaborazione asincrona (SQS consumer)
- Ambienti dev/staging: Non necessitano il 100% di uptime
- Training ML: I framework moderni supportano il checkpointing
Dove NON usare Spot
- Database (ovviamente)
- Web server in produzione (a meno che tu non abbia un buon setup di auto-scaling)
- Qualsiasi cosa stateful senza meccanismo di recupero
Esempio: CI/CD con Spot
# GitHub Actions con runner self-hosted su Spot
# Configurazione di Auto Scaling Group per runner
Resources:
CIRunnerASG:
Type: AWS::AutoScaling::AutoScalingGroup
Properties:
MixedInstancesPolicy:
InstancesDistribution:
OnDemandBaseCapacity: 1 # 1 istanza on-demand sempre
OnDemandPercentageAboveBaseCapacity: 0 # Il resto, Spot
SpotAllocationStrategy: capacity-optimized
LaunchTemplate:
LaunchTemplateSpecification:
LaunchTemplateId: !Ref CIRunnerLaunchTemplate
Version: !GetAtt CIRunnerLaunchTemplate.LatestVersionNumber
Overrides:
- InstanceType: c5.xlarge
- InstanceType: c5a.xlarge
- InstanceType: c5d.xlarge
- InstanceType: m5.xlarge
Risultato reale: Un nostro cliente ha spostato le sue build CI da c5.xlarge on-demand a Spot con fallback. Costo precedente: 800 USD/mese. Costo con Spot: 120 USD/mese. Risparmio dell’85%.
Strategia 4: Ottimizzazione dello storage
S3: Lifecycle policies
La maggior parte dei dati in S3 viene accessa frequentemente solo nei primi giorni. Dopo, nessuno li tocca.
{
"Rules": [
{
"ID": "OptimizeCosts",
"Status": "Enabled",
"Transitions": [
{
"Days": 30,
"StorageClass": "STANDARD_IA"
},
{
"Days": 90,
"StorageClass": "GLACIER_INSTANT_RETRIEVAL"
},
{
"Days": 365,
"StorageClass": "DEEP_ARCHIVE"
}
],
"Expiration": {
"Days": 730
}
}
]
}
Costo per GB/mese:
- S3 Standard: 0.023 USD
- S3 Standard-IA: 0.0125 USD (-46%)
- Glacier Instant Retrieval: 0.004 USD (-83%)
- Glacier Deep Archive: 0.00099 USD (-96%)
EBS: Pulizia dei volumi orfani
# Trovare volumi EBS non associati a nessuna istanza
aws ec2 describe-volumes \
--filters Name=status,Values=available \
--query 'Volumes[*].{ID:VolumeId,Size:Size,Type:VolumeType,Created:CreateTime}' \
--output table
È comune trovare centinaia di GB in volumi orfani di istanze che sono state eliminate ma i cui volumi sono stati dimenticati. A 0.10 USD/GB/mese per gp3, 500 GB orfani sono 50 USD/mese non necessari.
EBS: Migrare da gp2 a gp3
Se hai ancora volumi gp2, migrarli a gp3. Stesse prestazioni base, 20% più economici, e puoi configurare IOPS e throughput indipendentemente.
# Migrare un volume da gp2 a gp3
aws ec2 modify-volume \
--volume-id vol-0123456789abcdef0 \
--volume-type gp3
Strategia 5: Ottimizzazione della rete
NAT Gateway: il costo silenzioso
NAT Gateway addebita 0.045 USD/GB di dati elaborati, oltre a 0.045 USD/ora. Se le tue istanze private fanno molte chiamate ad API esterne o scaricano dipendenze, il costo aumenta rapidamente.
Soluzioni:
- VPC Endpoint per servizi AWS (S3, DynamoDB, SQS): eliminano il traffico via NAT
- Cache delle dipendenze: Non scaricare pacchetti npm da internet ad ogni build; usa un registry privato o cache
- Rivedere il logging: CloudWatch Logs Agent può generare traffico significativo
# Creare VPC Endpoint per S3 (risparmia traffico NAT)
aws ec2 create-vpc-endpoint \
--vpc-id vpc-0123456789abcdef0 \
--service-name com.amazonaws.eu-west-1.s3 \
--route-table-ids rtb-0123456789abcdef0
Caso reale: Un cliente aveva 2 TB/mese di traffico S3 attraverso NAT Gateway. Costo: 90 USD/mese solo in dati. Dopo aver creato il VPC Endpoint: 0 USD.
Strategia 6: Automazione del risparmio
Spegnere gli ambienti di sviluppo fuori orario
I tuoi ambienti dev e staging non hanno bisogno di girare alle 3 di notte di domenica.
# Funzione Lambda per spegnere/accendere istanze per orario
import boto3
def lambda_handler(event, context):
ec2 = boto3.client('ec2')
action = event.get('action', 'stop') # 'stop' o 'start'
# Cercare istanze con tag AutoSchedule=true
filters = [
{'Name': 'tag:AutoSchedule', 'Values': ['true']},
{'Name': 'tag:Environment', 'Values': ['dev', 'staging']}
]
if action == 'stop':
filters.append({'Name': 'instance-state-name', 'Values': ['running']})
instances = ec2.describe_instances(Filters=filters)
ids = [i['InstanceId']
for r in instances['Reservations']
for i in r['Instances']]
if ids:
ec2.stop_instances(InstanceIds=ids)
print(f"Stopped {len(ids)} instances: {ids}")
elif action == 'start':
filters.append({'Name': 'instance-state-name', 'Values': ['stopped']})
instances = ec2.describe_instances(Filters=filters)
ids = [i['InstanceId']
for r in instances['Reservations']
for i in r['Instances']]
if ids:
ec2.start_instances(InstanceIds=ids)
print(f"Started {len(ids)} instances: {ids}")
Risparmio tipico: Se i tuoi ambienti dev costano 1.500 USD/mese girando 24/7, spegnerli dalle 20:00 alle 08:00 e nei weekend risparmia ~65%: 975 USD/mese.
Dashboard dei costi con Grafana
Configura un dashboard che il team possa vedere quotidianamente:
- Costo giornaliero vs budget
- Top 10 servizi per costo
- Costo per team/progetto (basato sui tag)
- Trend mese su mese
- Anomalie (picchi inaspettati)
Checklist di ottimizzazione rapida
Se hai bisogno di risultati immediati, esegui questa checklist:
- Eliminare Elastic IP non associate
- Eliminare volumi EBS orfani
- Eliminare snapshot vecchi (più di 6 mesi senza utilizzo)
- Migrare volumi gp2 a gp3
- Configurare lifecycle policy in S3
- Creare VPC Endpoint per S3 e DynamoDB
- Attivare Compute Optimizer e rivedere le raccomandazioni
- Configurare alert di budget
- Spegnere ambienti dev fuori orario
- Rivedere i log di CloudWatch (ritenzione e volume)
- Rivedere le istanze RDS di sviluppo
Tempo stimato: 4-8 ore. Risparmio tipico: 15-25% immediato.
Strumenti di terze parti che aiutano
| Strumento | Funzione | Prezzo |
|---|---|---|
| Infracost | Stimare il costo dell’infrastruttura come codice prima del deploy | Gratuito (open source) |
| Kubecost | Ottimizzazione dei costi per Kubernetes | Gratuito (base) |
| Vantage | Dashboard costi multi-cloud | Da 0 USD |
| Spot.io (NetApp) | Gestione automatica delle Spot Instance | Basato sul risparmio |
Piano d’azione raccomandato
| Settimana | Azione | Risparmio atteso |
|---|---|---|
| 1 | Checklist rapida (pulizia) | 15-25% |
| 2 | Right-sizing delle istanze | 20-40% aggiuntivo |
| 3 | Automatizzare spegnimento dev/staging | 10-15% aggiuntivo |
| 4 | Valutare Savings Plans | 20-30% aggiuntivo (dal mese successivo) |
Risultato tipico dopo 1 mese di ottimizzazione: riduzione del 35-55% nella fattura mensile.
Conclusione
Ottimizzare i costi in AWS non è un progetto una tantum, è un’abitudine. Le aziende che lo fanno meglio hanno un “cloud cost champion” nel team (non necessariamente a tempo pieno) che rivede la fattura settimanalmente e mantiene le buone pratiche.
Se la tua fattura AWS è fuori controllo e non sai da dove iniziare, contattaci. Facciamo audit dei costi cloud dove identifichiamo opportunità di risparmio e ti aiutiamo a implementarle.