[AWS] Cutting Infrastructure Costs by 55% — Graviton (ARM) Migration & Fixed-Cost Optimization

From 2024 through the first half of 2026, while designing and building infrastructure for my division/team, my main focus was "minimizing unnecessary cloud spend while still drawing a robust architecture."

This post shares real quote data and know-how for strategically leveraging AWS Graviton (ARM) and replacing managed services like ALB, NAT Gateway, and RDS with self-managed builds — cutting operating costs by up to 55% (about ₩2M/month).

1. 2026 AWS EC2 Instance Price Comparison (Seoul Region)

The table below is on-demand pricing for the Asia Pacific (Seoul) region, Ubuntu 24.04 LTS (HVM). You can see that the CPU architecture choice alone makes about a 20% cost difference.

Instance type vCPU Arch Mem Storage Network per hour per month (30d) per year (12M)
m6g.large 2 Arm 8 GiB EBS Only Up to 10 Gbps $0.094 $67.68 $812.16
t4g.xlarge 4 Arm 16 GiB EBS Only Up to 5 Gbps $0.1664 $119.81 $1,437.70
t4g.medium 2 Arm 4 GiB EBS Only Up to 5 Gbps $0.0416 $29.95 $359.42
t2.micro 1 x86 1 GiB EBS Only Low~Moderate $0.0144 $10.37 $124.42
r6g.large 2 Arm 16 GiB EBS Only Up to 10 Gbps $0.1220 $87.84 $1,054.08
r6g.xlarge 4 Arm 32 GiB EBS Only Up to 10 Gbps $0.2440 $175.68 $2,108.16
r5a.xlarge 4 x86 32 GiB EBS Only Up to 10 Gbps $0.2720 $195.84 $2,350.08
r6gd.xlarge 4 Arm 32 GiB 1×237 NVMe SSD Up to 10 Gbps $0.2768 $199.30 $2,391.55
r5.xlarge 4 x86 32 GiB EBS Only Up to 10 Gbps $0.3040 $218.88 $2,626.56
r6g.2xlarge 8 Arm 64 GiB EBS Only Up to 10 Gbps $0.4880 $351.36 $4,216.32

Switching architecture alone saves $43.2/month

Analyzing the table closely, even with identical CPU/Memory/Storage/Network specs, the architecture choice makes about a 20% difference.

Item r5.xlarge (x86) r6g.xlarge (Arm) Difference
vCPU / Mem 4 vCPU / 32 GiB 4 vCPU / 32 GiB Same
Storage / Network EBS / Up to 10Gbps EBS / Up to 10Gbps Same
Monthly cost (30 days) $218.88 $175.68 | **-$43.2 (~20% off)**

AWS console screen where choosing x86 architecture disables ARM (Graviton) instance types Figure 1. Setting the architecture to x86 restricts ARM instance selection

The on-demand price table doesn't show the CPU architecture; you see it when launching an instance. For example, if you set the architecture to 64-bit (x86) and try to pick r6gd.xlarge, it's disabled.

2. Choosing an Instance Family by Purpose

Alongside cost savings, you should match the instance family to its purpose.

  • t family (burstable) — best for small workloads. Handles intermittent traffic bursts cheaply via CPU credits.
  • m family (general purpose) — when you need a balance of CPU/memory/network. Fixed performance, good for stable WAS operation.
  • r family (memory optimized) — essential for memory-intensive work like DBs, caches (Redis), and large-scale data analysis. The ARM-based r6g is especially cost-effective vs x86.

3. Defending Fixed Costs with Self-Managed Builds Instead of Managed Services

If your infra capability is up to it, replacing managed services with self-managed builds can greatly reduce fixed costs.

3.1 Nginx Reverse Proxy instead of ALB — save $16.43/month

ALB is convenient but incurs fixed cost even with no traffic. Applying Nginx + Certbot (SSL) on the Bastion server for direct routing removes the ALB cost entirely.

3.2 NAT Instance instead of NAT Gateway — save $33.75/month

The NAT Gateway that helps the Private Subnet's external communication has an expensive hourly rate. Configuring the Bastion server as a NAT instance saves about $33.75/month including data-processing cost (assuming ~30GB/month).

  • NAT Gateway hourly rate: USD 0.045
  • Data processing per GB: USD 0.045

The detailed NAT instance build guide is covered in the two posts below.

[AWS] Cutting NAT Gateway Costs — Building a NAT Instance from an AMI (Part 1)
A NAT Gateway costs $32+/month in fixed fees. To save money, I connected a Private Subnet to the internet using an EC2 NAT Instance — Part 1 uses the AWS community AMI (amzn-ami-vpc-nat).
taystudios.com/blog
[AWS] Cutting NAT Gateway Costs — Building a NAT Instance with iptables (Part 2)
The Part 1 community AMI runs an old (EOS) OS and is hard to maintain. In Part 2 we build a NAT instance on the latest Ubuntu by configuring iptables directly (IP forwarding + MASQUERADE), and persist the rules across reboots.
taystudios.com/blog

3.3 Route53 domain — about $14.51 for a .com

Route53 domain fixed cost is hard to reduce. It's more effective to cut the larger fixed costs of EC2/ALB/NAT Gateway, or to use a cheaper domain registrar.

4. RDS Risk Management & Self-Hosting the DB

Oracle RDS (db.m5.4xlarge, etc.) can run $2,800–$6,000/month with the license included. Even for a company that owns the license (BYOL), RDS operating cost is a hefty ~$1,551.67.

  • RDS management fee vs self-built EC2 — if you already have the license, the RDS cost is purely a "management fee," and that fee exceeds the instance cost.
  • The Oracle RDS (BYOL) trap — at 8 vCPU / 32 GiB, even bringing an SE2 license via BYOL, the RDS management cost paid to AWS alone is ~$1,551.67.
  • Switching to an ARM-based DB-EC2 — instead of RDS, choose an 8 vCPU ARM / 64 GiB RAM / 512 GB storage EC2. Monthly cost $382.35 (incl. EBS) → about 75% off vs RDS management cost, while doubling memory (64 GiB).

5. Final Cost Comparison: Managed Services vs Self-Built (Monthly)

Item Qty USD/mo Self-built Managed-centric Note
VPC (EIP) 1 21.9 Common fixed cost
Route53 (Domain) 1 14.53 Common fixed cost
EC2 (Service) ARM 5 175.68 - 4 vCPU ARM 32 GiB
EC2 (Service) x86 5 218.88 - 4 vCPU x86 32 GiB
EC2 (Bastion) 1 66.4 In managed, Bastion-only (no NAT/Proxy role)
EC2 (DB) 1 382.35 - ARM 64 GiB
RDS (BYOL) Oracle 1 1,551.67 -
NAT Gateway 1 33.75 - Self-built replaces with a NAT instance
ALB 1 16.43 - Self-built replaces with an Nginx proxy
Total (USD/mo) 1,263.58 2,799.08 ~$1,535 difference (up to ~55% savings)

Conclusion: Efficient cost reduction

This doesn't mean abandoning all managed services. But by selectively reducing (ARM migration, self-built NAT/Proxy, self-hosted DB) using engineering capability, you can run a far higher-performance architecture within a limited budget. Saving ~$1,535/month (about ₩2M) in fixed costs is meaningful.

6. Caveats When Migrating to ARM

As much as cost savings, it's important to avoid service-downtime risk from the architecture switch. ARM was once avoided over compatibility issues, but as of 2026 it's stabilized (or in progress) on most major libraries and OSes.

Python — the 'DPI-1047' error when connecting to Oracle DB

The most common issue when moving a Python service to an ARM instance is driver compatibility.

  • Problem — using cx_Oracle (used on x86) as-is on ARM fails with a DPI-1047 error, because that library depends on specific C libraries.
  • Solution — use python-oracledb Thin mode, which needs no Oracle Instant Client install. It runs as pure Python with no C dependency and works perfectly on ARM. The detailed guide is in the post below.
Fixing the DPI-1047 Python–Oracle Error on AWS Graviton (ARM) — python-oracledb Thin Mode
Why a Python–Oracle integration that worked on x86_64 fails with DPI-1047 (can't find libclntsh.so) on AWS Graviton (ARM), and the fix using python-oracledb Thin mode — pure Python, no Instant Client (SQLAlchemy and native examples).
taystudios.com/blog

References (AWS official)

  1. AWS On-Demand Instance Pricing
  2. AWS VPC Pricing

📦 Migrated from my own Korean blog (my own writing). Original: taehyuklee.tistory.com/33

Share𝕏f

Comments