Immagine del Cloud Storage generata dall'AI
Indice
Volumi gp3 e gp2 a confronto
Nel dicembre 2020 AWS ha lanciato una nuova generazione di volumi EBS general-purpose basati su SSD, denominati gp3. A differenza del predecessore, le prestazioni di base non dipendono dalla dimensione del volume: i gp3 garantiscono un minimo di 3.000 IOPS a prescindere dalle dimensioni, mentre i gp2 seguono un rapporto variabile di 3 IOPS/GiB, legato direttamente alla capacità. I gp3 sono anche più convenienti, con un prezzo di 0,08 $/GiB-mese rispetto agli 0,10 $/GiB-mese dei gp2.
Sui volumi EBS gp2 throughput e IOPS di base sono direttamente proporzionali alla dimensione del volume, con un rapporto di 3 IOPS/GiB e un throughput compreso tra 128 MiB/s e 250 MiB/s a seconda della capacità. Sui gp2 non è possibile aumentare IOPS o throughput senza ampliare il volume. Questi volumi dispongono inoltre di un sistema di crediti di burst, che consente picchi di prestazioni per brevi periodi.
Con i nuovi gp3 è invece possibile provisionare fino a 16.000 IOPS e 1.000 MiB/s di throughput indipendentemente dalla dimensione, con un costo aggiuntivo di 0,005 $/IOPS provisioned-mese oltre la baseline di 3.000 IOPS e di 0,04 $/MiB/s provisioned-mese oltre la baseline di 125 MiB/s.
AWS mette a disposizione una tabella sintetica che evidenzia le differenze tra i volumi gp2 e gp3:

Tabella di confronto tra i volumi EBS gp3 e gp2
Con questa nuova generazione di volumi EBS general-purpose basati su SSD, restare su gp2 non è più conveniente né vantaggioso sul piano delle prestazioni: i gp2 costano di più e in genere offrono meno IOPS di base rispetto ai gp3 di pari dimensione.
È vero che oltre 1 TiB i gp2 iniziano a offrire più IOPS rispetto alla baseline dei gp3, ma resta comunque più conveniente sostenere il costo aggiuntivo per allineare IOPS e throughput su gp3 piuttosto che ripiegare su gp2 per ottenere quegli IOPS/throughput in più. In questi scenari il risparmio scende al di sotto del 20% di partenza, pur restando significativo.
Se il volume EBS è inferiore a 334 GiB, migrare da gp2 a gp3 fa risparmiare il 20% e porta enormi guadagni in termini di prestazioni.
Per i volumi compresi tra 334 GiB e 1 TiB, la migrazione a gp3 con il pagamento del throughput aggiuntivo necessario a eguagliare i 250 MiB/s di gp2 consente comunque di risparmiare, garantendo prestazioni migliori grazie agli IOPS di base superiori. In questo caso il risparmio oscilla tra il 15% e il 5%, a seconda della dimensione del volume.
Per i volumi superiori a 1 TiB, la migrazione a gp3 con il pagamento del throughput e degli IOPS aggiuntivi necessari a eguagliare i 250 MiB/s e i 3 IOPS per GiB di gp2 fa comunque risparmiare, in una forbice tra il 15% e il 7%.
In nessuno scenario gp2 risulta migliore o più economico di gp3. Detto questo, passare a gp3 è una scelta praticamente obbligata, sia per il risparmio sia per le prestazioni superiori.
La migrazione, inoltre, non comporta svantaggi: si completa senza downtime e non penalizza le prestazioni. Durante la modifica, infatti, le prestazioni del volume EBS sono garantite almeno pari a quelle del volume originale.
Come migrare tutti i volumi gp2 a gp3
Per una migrazione semplice e fluida basta eseguire lo script Python riportato qui sotto, che converte automaticamente tutti i volumi gp2 in gp3, in ogni region, allineando IOPS e throughput per i volumi superiori a 334 GiB.
Lo script consente di risparmiare su ogni volume migrato fino al 20%, migliorando nettamente le prestazioni dei volumi più piccoli e mantenendo invariati i livelli prestazionali di quelli più grandi.
Lo script calcola anche il risparmio ottenuto dalla migrazione dei volumi gp2 a gp3 e ne stampa l'importo effettivo.
import boto3
from botocore.exceptions import ClientError
def calculate_gp3_cost(size_gib, iops, throughput):
# gp3 pricing
storage_cost_per_gib = 0.08 # $0.08/GB-month
iops_cost = 0.005 # $0.005 per IOPS over 3000 IOPS
throughput_cost = 0.04 # $0.04 per MB/s of throughput above 125 MB/s
storage_cost = size_gib * storage_cost_per_gib
extra_iops_cost = (iops - 3000) * iops_cost if iops > 3000 else 0
extra_throughput_cost = (throughput - 125) * throughput_cost if throughput > 125 else 0
return storage_cost + extra_iops_cost + extra_throughput_cost
def calculate_gp2_cost(size_gib):
# gp2 pricing
storage_cost_per_gib = 0.10 # $0.10/GB-month
return size_gib * storage_cost_per_gib
def migrate_volume(ec2_client, volume_id, size_gib, region_name):
savings = 0
try:
if size_gib < 334:
iops = 3000
throughput = 125
elif size_gib < 1024:
iops = 3000
throughput = 250
else:
iops = size_gib * 3
throughput = 250
gp2_cost = calculate_gp2_cost(size_gib)
gp3_cost = calculate_gp3_cost(size_gib, iops, throughput)
savings = gp2_cost - gp3_cost
response = ec2_client.modify_volume(
VolumeId=volume_id,
VolumeType='gp3',
Iops=iops,
Throughput=throughput
)
print(f"Migrated volume {volume_id} of size {size_gib} GiB to gp3 in {region_name}. Savings: ${savings:.2f} per month.")
except ClientError as e:
print(f"An error occurred: {e}")
return savings
def list_and_migrate_volumes_in_region(region_name):
ec2_client = boto3.client('ec2', region_name=region_name)
total_savings = 0
try:
volumes = ec2_client.describe_volumes(
Filters=[\
{'Name': 'volume-type', 'Values': ['gp2']}\
]
)
if not volumes['Volumes']:
return total_savings # Return early if no volumes to migrate
for volume in volumes['Volumes']:
volume_id = volume['VolumeId']
size_gib = volume['Size']
savings = migrate_volume(ec2_client, volume_id, size_gib, region_name)
total_savings += savings
except ClientError as e:
print(f"An error occurred in {region_name}: {e}")
return total_savings
def list_regions_and_migrate_volumes():
ec2 = boto3.client('ec2')
regions = [region['RegionName'] for region in ec2.describe_regions()['Regions']]
grand_total_savings = 0
volumes_found = False
for region in regions:
total_savings = list_and_migrate_volumes_in_region(region)
grand_total_savings += total_savings
if total_savings > 0:
volumes_found = True
print(f"Total savings in {region}: ${total_savings:.2f} per month.")
if not volumes_found:
print("No gp2 volumes to migrate.")
else:
print(f"Grand total savings from migrating all gp2 volumes to gp3: ${grand_total_savings:.2f} per month.")
if __name__ == "__main__":
list_regions_and_migrate_volumes()
Prerequisiti:
- Verifica di avere installato Python3 con il modulo boto3;
- Verifica di disporre di credenziali AWS con i permessi necessari per modificare i volumi EBS in tutte le region nel percorso ~/.aws/credentials; OPPURE
- In alternativa, puoi esportare le credenziali AWS come variabili d'ambiente per un'esecuzione una tantum, con i comandi seguenti:
export AWS_ACCESS_KEY_ID="your_access_key_id_here"
export AWS_SECRET_ACCESS_KEY="your_secret_access_key_here"
export AWS_DEFAULT_REGION="us-east-1"
Dopo aver verificato i prerequisiti, per eseguire lo script è sufficiente salvarlo in un file (ad esempio gp2togp3.py) e lanciare il comando seguente:
python3 gp2togp3.py
Esempio di output:
❯ python3 gp2togp3.py
Migrated volume vol-0f554746c24525f01 of size 520 GiB to gp3 in eu-west-1. Savings: $5.40 per month.
Migrated volume vol-03123800cba75b18f of size 20 GiB to gp3 in eu-west-1. Savings: $0.40 per month.
Migrated volume vol-087a04f1d3d88bf07 of size 2520 GiB to gp3 in eu-west-1. Savings: $22.60 per month.
Migrated volume vol-06b09798a7b6f21d3 of size 4020 GiB to gp3 in eu-west-1. Savings: $30.10 per month.
Migrated volume vol-0b55386bde1279329 of size 4520 GiB to gp3 in eu-west-1. Savings: $32.60 per month.
Migrated volume vol-0f2935d2360fdd2ed of size 2020 GiB to gp3 in eu-west-1. Savings: $20.10 per month.
Migrated volume vol-0a686b3a9aebbbf8f of size 3020 GiB to gp3 in eu-west-1. Savings: $25.10 per month.
Migrated volume vol-0d2d709a825421233 of size 1020 GiB to gp3 in eu-west-1. Savings: $15.40 per month.
Migrated volume vol-00766065b8e2ccc14 of size 1520 GiB to gp3 in eu-west-1. Savings: $17.60 per month.
Migrated volume vol-07ff6098fc4a188f6 of size 3520 GiB to gp3 in eu-west-1. Savings: $27.60 per month.
Total savings in eu-west-1: $196.90 per month.
Migrated volume vol-0de6269b523834350 of size 1520 GiB to gp3 in us-east-1. Savings: $17.60 per month.
Migrated volume vol-05c8fffff1e48fdcb of size 3020 GiB to gp3 in us-east-1. Savings: $25.10 per month.
Migrated volume vol-0f5bd9886a18cfb22 of size 2020 GiB to gp3 in us-east-1. Savings: $20.10 per month.
Migrated volume vol-05981da5774928178 of size 4020 GiB to gp3 in us-east-1. Savings: $30.10 per month.
Migrated volume vol-0d788bce161c9978a of size 2520 GiB to gp3 in us-east-1. Savings: $22.60 per month.
Migrated volume vol-0a45ded9ba633b92a of size 520 GiB to gp3 in us-east-1. Savings: $5.40 per month.
Migrated volume vol-06d300164bf986c32 of size 20 GiB to gp3 in us-east-1. Savings: $0.40 per month.
Migrated volume vol-04a27bbad19828bbf of size 4520 GiB to gp3 in us-east-1. Savings: $32.60 per month.
Migrated volume vol-0e85c18b59e418b8c of size 1020 GiB to gp3 in us-east-1. Savings: $15.40 per month.
Migrated volume vol-0b0cafa0f49767f28 of size 3520 GiB to gp3 in us-east-1. Savings: $27.60 per month.
Total savings in us-east-1: $196.90 per month.
Grand total savings from migrating all gp2 volumes to gp3: $393.80 per month.
Come ottenere ulteriori risparmi con la migrazione a gp3
Questo articolo propone una soluzione universale, ma con la migrazione a gp3 si può risparmiare ancora di più, soprattutto se non servono IOPS e throughput aggiuntivi sui volumi oltre 1 TiB.
In questi casi, però, occorre analizzare con attenzione l'utilizzo della propria applicazione, capire quanti IOPS e quanto throughput servono davvero e configurare i volumi gp3 di conseguenza.
Quando i volumi più grandi non hanno bisogno di 3 IOPS per GiB, si può risparmiare ulteriormente lasciando semplicemente la baseline degli IOPS invariata; lo stesso vale per il throughput.