Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Migre seus volumes EBS de gp2 para gp3: até 20% de economia com mais performance

By VilmarApr 11, 20247 min read

Esta página também está disponível em English, Deutsch, Español, Français, Italiano e 日本語.

Imagem gerada por IA representando Cloud Storage

Sumário

Comparando volumes gp3 e gp2

Em dezembro de 2020, a AWS lançou uma nova geração de volumes EBS de uso geral baseados em SSD: o gp3. Diferente do antecessor, sua performance baseline não está atrelada ao tamanho do volume, e o gp3 entrega no mínimo 3.000 IOPS de baseline independentemente do tamanho — bem diferente da taxa variável de 3 IOPS/GiB do gp2, que está diretamente vinculada ao tamanho do volume. Os volumes gp3 também saem mais em conta: US$ 0,08/GiB-mês contra US$ 0,10/GiB-mês dos antigos gp2.

Nos volumes EBS gp2, o throughput baseline e os IOPS estão diretamente atrelados ao tamanho do volume, na proporção de 3 IOPS/GiB e entre 128 MiB/s e 250 MiB/s de throughput, dependendo do tamanho. No gp2, não dá para aumentar IOPS ou throughput sem aumentar o tamanho do volume. Esses volumes ainda contam com um sistema de créditos de burst, que permite picos por curtos períodos.

Já com os novos volumes gp3, dá para provisionar até 16.000 IOPS e 1.000 MiB/s de throughput independentemente do tamanho do volume, ao custo adicional de US$ 0,005/IOPS provisionado-mês acima dos 3.000 IOPS do baseline padrão e US$ 0,04/MiB/s provisionado-mês acima dos 125 MiB/s do baseline padrão.

A AWS publicou uma tabela comparativa enxuta destacando as diferenças entre os tipos de volume gp2 e gp3:

Tabela comparativa entre os tipos de volume EBS gp3 e gp2

Com a chegada dessa nova geração de volumes EBS de uso geral baseados em SSD, usar gp2 deixou de fazer sentido tanto em custo quanto em performance: os gp2 são mais caros e, em geral, oferecem menos IOPS de baseline do que volumes gp3 do mesmo tamanho.

É verdade que, a partir de 1 TiB, os volumes gp2 passam a oferecer mais IOPS do que o baseline do gp3. Mesmo assim, ainda compensa pagar a mais para igualar IOPS e throughput no gp3 do que ficar no gp2 só por causa desse extra. Nesses casos, a economia começa a cair em relação aos 20% de baseline, mas continua valendo a pena.

Se o seu volume EBS for menor que 334 GiB, migrar de gp2 para gp3 garante 20% de economia, com ganhos enormes de performance.

Para volumes maiores que 334 GiB e menores que 1 TiB, migrar para gp3 e pagar pelo throughput adicional para igualar os 250 MiB/s do gp2 ainda gera economia, com performance melhor graças aos IOPS de baseline extras. Nesse cenário, a economia varia de 15% a 5%, dependendo do tamanho do volume.

Para volumes maiores que 1 TiB, migrar para gp3 e pagar pelo throughput e IOPS adicionais para igualar os 250 MiB/s e 3 IOPS por GiB do gp2 também gera economia, na faixa de 15% a 7%.

Em nenhum cenário o gp2 sai melhor ou mais barato que o gp3. Ou seja, migrar para gp3 é uma escolha óbvia, tanto pelo custo-benefício quanto pela performance superior.

E o melhor: a migração não tem contras. Ela pode ser concluída sem downtime e não impacta a performance negativamente. Isso porque a performance do volume EBS durante a modificação é garantida como, no mínimo, igual à do volume original.

Como migrar todos os volumes gp2 para gp3?

Dá para fazer uma migração simples e tranquila rodando o script Python abaixo. Ele converte automaticamente todos os seus volumes gp2 para gp3, em todas as regiões, ajustando IOPS e throughput equivalentes para volumes maiores que 334 GiB.

Ao rodar o script, você economiza em cada volume migrado — até 20% — e ainda melhora drasticamente a performance dos volumes menores ou, no mínimo, mantém o mesmo nível de performance dos maiores.

O script também calcula quanto você economizou ao migrar seus volumes gp2 para gp3 e mostra o valor efetivo da economia.

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()

Pré-requisitos:

  • Tenha o Python3 instalado, com a biblioteca boto3;
  • Tenha credenciais AWS com as permissões necessárias para modificar volumes EBS em todas as regiões no caminho ~/.aws/credentials; OU
  • Como alternativa, exporte as credenciais AWS como variáveis de ambiente para uma execução pontual com os comandos abaixo:
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"

Depois de confirmar que você atende a todos os pré-requisitos acima, basta salvar o script em um arquivo (por exemplo, gp2togp3.py) e rodar o comando:

python3 gp2togp3.py

Exemplo de saída:

❯ 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.

Como economizar ainda mais na migração para gp3

Embora este artigo apresente uma solução padrão, é possível economizar ainda mais na migração para gp3 caso você não precise daqueles IOPS e throughput extras em volumes maiores que 1 TiB.

Nesses casos, vale analisar com cuidado o uso da sua aplicação para entender de quantos IOPS e quanto throughput ela realmente precisa, e ajustar os volumes gp3 conforme essa demanda.

Quando volumes maiores não exigem 3 IOPS por GiB, você acaba economizando mais simplesmente por não aumentar os IOPS de baseline — e o mesmo vale para o throughput.