[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)** |
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
r6gis 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.
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 aDPI-1047error, because that library depends on specific C libraries. - Solution — use
python-oracledbThin 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.
References (AWS official)
📦 Migrated from my own Korean blog (my own writing). Original: taehyuklee.tistory.com/33



Comments