giip
SES Proposal
AWSHighコストサイジングストレージRDSEBS

What to Check When Reviewing AWS Database Costs

Published 2026-08-13 · Updated 2026-08-13 · Last Verified 2026-08-13

Answer

Work through the review in order of increasing impact: (1) stop or delete unused resources, (2) right-size based on measurements, (3) review storage type and provisioned amounts, (4) inventory backups and snapshots, (5) review Multi-AZ and uptime in non-production environments, and (6) consider Savings Plans / Reserved Instances only once usage has stabilized. Since the savings amount and percentage depend entirely on your configuration, the first step is to pull your own cost breakdown from Cost Explorer.

Applicability of This Document

ProductAmazon RDS / Amazon Aurora / Amazon EBS / AWS Cost Explorer
Verified VersionsAWS CLI v2 / the public APIs of Amazon RDS, Amazon EC2, and AWS Cost Explorer (based on the specification as of 2026-08-13)
EnvironmentAWS
Required PermissionsRead access requires `rds:DescribeDBInstances`, `rds:DescribeDBSnapshots`, `ec2:DescribeVolumes`, `ec2:DescribeSnapshots`, and `ce:GetCostAndUsage`. Delete operations require the corresponding Delete privilege
Execution ImpactNo impact from listing commands. Delete and change commands can be irreversible
RestartRequired when changing storage type or instance class
Last Verified2026-08-13

Ready-to-Run Commands

Pull monthly cost by service (run this first)Read-only
対象
AWS Cost Explorer API (AWS CLI v2)
権限
ce:GetCostAndUsage
変更作業
None (read-only)
Production実行
Possible
# 対象: AWS Cost Explorer API(AWS CLI v2)
# 権限: ce:GetCostAndUsage
# 変更作業: なし(参照のみ)
# Production 実行: 可能
aws ce get-cost-and-usage \
  --time-period Start=2026-05-01,End=2026-08-01 \
  --granularity MONTHLY \
  --metrics UnblendedCost UsageQuantity \
  --group-by Type=DIMENSION,Key=SERVICE \
  --output json

First get the breakdown by service, then switch to `Type=DIMENSION,Key=USAGE_TYPE` to check the ratio of instance cost, storage cost, I/O cost, and data transfer cost. Starting with individual initiatives without looking at this breakdown means spending effort on items that are small in dollar terms. Also note that calling the Cost Explorer API itself incurs a cost.

List EBS volumes that are not attached to anythingRead-only
対象
Amazon EC2 / Amazon EBS (AWS CLI v2)
権限
ec2:DescribeVolumes
変更作業
None (read-only)
Production実行
Possible
# 対象: Amazon EC2 / Amazon EBS(AWS CLI v2)
# 権限: ec2:DescribeVolumes
# 変更作業: なし(参照のみ)
# Production 実行: 可能
aws ec2 describe-volumes \
  --filters Name=status,Values=available \
  --query "Volumes[].{Id:VolumeId,Type:VolumeType,SizeGiB:Size,Iops:Iops,\
Throughput:Throughput,AZ:AvailabilityZone,Created:CreateTime,Name:Tags[?Key=='Name']|[0].Value}" \
  --output table

`status=available` means it's not attached to any instance. Billing continues regardless, which is why you pull this list first. Since some volumes will turn out to be "staged right after a detach" or "planned for use in a recovery procedure," always check tags, creation date, and with the owner before deleting anything.

List old manual snapshots (RDS and EBS)Read-only
対象
Amazon RDS / Amazon EBS (AWS CLI v2)
権限
rds:DescribeDBSnapshots, ec2:DescribeSnapshots
変更作業
None (read-only)
Production実行
Possible
# 対象: Amazon RDS / Amazon EBS(AWS CLI v2)
# 権限: rds:DescribeDBSnapshots, ec2:DescribeSnapshots
# 変更作業: なし(参照のみ)
# Production 実行: 可能

# 手動作成された RDS スナップショット(自動バックアップは snapshot-type=automated)
aws rds describe-db-snapshots \
  --snapshot-type manual \
  --query "DBSnapshots[].{Id:DBSnapshotIdentifier,Source:DBInstanceIdentifier,\
Created:SnapshotCreateTime,SizeGiB:AllocatedStorage,Engine:Engine}" \
  --output table

# 自アカウント所有の EBS スナップショット(作成日の古い順)
aws ec2 describe-snapshots \
  --owner-ids self \
  --query "sort_by(Snapshots,&StartTime)[].{Id:SnapshotId,Volume:VolumeId,\
Started:StartTime,SizeGiB:VolumeSize,Desc:Description}" \
  --output table

A manual snapshot is not subject to automatic retention management and stays around until explicitly deleted. It's common to find years' worth of temporary snapshots taken during a migration or incident response piling up. Before deciding to delete anything, check whether an audit or statutory retention requirement covers any of them.

Check the configured storage type and provisioned IOPSRead-only
対象
Amazon RDS (AWS CLI v2)
権限
rds:DescribeDBInstances
変更作業
None (read-only)
Production実行
Possible
# 対象: Amazon RDS(AWS CLI v2)
# 権限: rds:DescribeDBInstances
# 変更作業: なし(参照のみ)
# Production 実行: 可能
aws rds describe-db-instances \
  --query "DBInstances[].{Id:DBInstanceIdentifier,Class:DBInstanceClass,\
StorageType:StorageType,AllocatedGiB:AllocatedStorage,Iops:Iops,\
StorageThroughput:StorageThroughput,MultiAZ:MultiAZ,\
BackupRetentionDays:BackupRetentionPeriod,Status:DBInstanceStatus}" \
  --output table

What you see here are configured values. Measure actual IOPS consumption with CloudWatch's ReadIOPS / WriteIOPS. If the configured value is far above the measured value, it's a candidate for reducing the provisioned amount.

Delete unused resources (an irreversible operation)High
対象
Amazon EC2 / Amazon EBS / Amazon RDS (AWS CLI v2)
権限
ec2:DeleteVolume, ec2:DeleteSnapshot, rds:DeleteDBSnapshot
変更作業
Yes (deletion; cannot be undone)
Production実行
Require owner confirmation and deletion approval before running this
# 対象: Amazon EC2 / Amazon EBS / Amazon RDS(AWS CLI v2)
# 権限: ec2:DeleteVolume, ec2:DeleteSnapshot, rds:DeleteDBSnapshot
# 変更作業: あり(削除操作。実行後に元へ戻すことはできない)
# Production 実行: 一覧の全件確認と所有者承認を得てから、1件ずつ実行すること
#
# 注意: 以下は「一括で流すスクリプト」ではなく、1件ごとに判断した結果を実行する形を想定しています。
#       まず削除候補ボリュームのスナップショットを取り、復旧経路を確保してから削除します。
aws ec2 create-snapshot \
  --volume-id vol-0123456789abcdef0 \
  --description "pre-delete backup of vol-0123456789abcdef0"

# スナップショットの完了を確認したうえで削除する
aws ec2 delete-volume --volume-id vol-0123456789abcdef0

Do not automate deletion. A volume or snapshot in the `available` state can include something staged for incident recovery or an asset whose handover is not yet complete. Treat listing and deleting as separate tasks, and limit deletion to items that have gone through owner confirmation and approval.

How to Read the Results

ColumnMeaningWhat to Check
Id (VolumeId / SnapshotId)Resource identifierRecord it as a deletion candidate and a target for owner confirmation
Type / StorageTypeStorage type (gp2 / gp3 / io1 / io2 / standard, etc.)A volume still on gp2 is a candidate for switching to gp3. For io1/io2, check whether the IOPS requirement is actually backed up by measurement
IopsProvisioned IOPSCross-check against CloudWatch's measured IOPS. Consistently lower measured usage means over-provisioning
Throughput / StorageThroughputProvisioned throughputCompare against measured ReadThroughput + WriteThroughput
Created / StartTimeCreation date/timeThe older a manual snapshot is, the more likely its original purpose has been lost
AZ / AvailabilityZonePlacement availability zoneIf different from the application, check whether cross-AZ data transfer cost is being incurred
BackupRetentionPeriodAutomated backup retention period (days)Whether it is set longer than required — check this especially for non-production
MultiAZWhether a standby existsWhether this is true in dev/test environments — a candidate for re-confirming availability requirements
UnblendedCost (Cost Explorer)Actual cost for the periodLook at the breakdown by service and usage type, and start with the largest items

When to Use This

  • The AWS bill keeps climbing, but it's unclear which item grew
  • The instance class and storage settings decided at build time have never been reviewed since
  • EBS volumes attached to nothing, or snapshots with an unclear purpose, remain
  • Dev and test environments run 24/7
  • Provisioned IOPS is configured, but whether it's actually being fully used has never been checked
  • Reserved Instances or Savings Plans were recommended, but there is no basis to decide

Possible Causes (Most Likely First)

  1. 01

    Still running on the estimates from when it was built

    Instance class and storage provisioning are often decided "with margin" before a service launches. Without a process for reviewing them against actual usage after launch, those original values just stay in place.

  2. 02

    Orphaned resources keep getting billed

    An EBS volume left over from deleting an instance, a manual snapshot taken during a migration, or a read replica created for testing and then abandoned — all of these are billed until explicitly deleted. This is the kind of cost that's hard to spot as "unused" from the bill alone.

  3. 03

    Storage type is still on an older generation

    gp2's baseline performance is tied to volume size, with bursts drawing on I/O credits. gp3 lets you set baseline performance and throughput independently of capacity. A volume still on gp2 is a candidate for review on both performance-fit and cost. Check current AWS documentation for eligibility and terms.

  4. 04

    Provisioned IOPS is not being consumed

    Extra IOPS on io1/io2 or gp3 is billed by the provisioned amount regardless of consumption. If CloudWatch measurements are consistently below the configured value, you are only paying for it.

  5. 05

    Non-production is configured the same as production

    It's not unusual for a dev or test environment to have Multi-AZ enabled, the same instance class as production, and to run 24/7. If availability requirements differ from production, the configuration can be separated too.

  6. 06

    Data transfer cost is going unnoticed

    When the application and database sit in different AZs, cross-AZ data transfer cost accrues continuously. The per-unit rate is small, but it can add up to a non-negligible amount in a high-traffic configuration.

Diagnostic Steps

  1. 1

    Pull the cost breakdown from Cost Explorer

    Read-only

    Break it down by service and usage type on a monthly basis, and prioritize by dollar amount. Skipping this step leaves you with no way to prioritize.

  2. 2

    Identify stopped and unused instances

    Read-only

    Cross-check `DBInstanceStatus` from `aws rds describe-db-instances` against instances with a DatabaseConnections count of zero for a long period.

  3. 3

    List orphaned resources

    Read-only

    List EBS volumes in `status=available`, manual snapshots, and unused read replicas, and identify their owners.

  4. 4

    Cross-check measured values against provisioned values

    Read-only

    Compare CloudWatch's CPUUtilization, FreeableMemory, ReadIOPS, and WriteIOPS against the configured instance class and IOPS.

  5. 5

    Check backup retention settings

    Read-only

    Check whether the automated backup retention period is excessive relative to requirements, and how many years of manual snapshots remain.

  6. 6

    Check the non-production configuration

    Read-only

    Check the Multi-AZ setting, instance class, and operating hours of dev/test environments.

  7. 7

    Set up monitoring with AWS Budgets

    Low

    Set a budget and threshold alert to track the effect of the review going forward. Make this ongoing monitoring rather than a one-time reduction.

Solutions

Low-risk action that can be done immediately

  • "List" unused resources

    Read-only

    Start with a list and identifying the owner, not deletion. Cost doesn't drop at this stage, but every subsequent decision is based on this list.

  • Set up AWS Budgets and Cost Anomaly Detection

    Low

    Stop finding out about cost increases after the fact. With a threshold alert in place, the next increase shows up as a notification instead of on the bill.

Change requiring advance review

  • Plan right-sizing based on measurements

    Medium

    Review the class based on CloudWatch's p95/p99, not the original build-time estimate. Since the change involves a restart, it needs a maintenance window.

  • Consider switching from gp2 to gp3

    Medium

    Switch after confirming it meets performance requirements. Check current AWS documentation for eligibility and behavior during the switch.

  • Align provisioned IOPS with measured usage

    Medium

    If measured usage is consistently below the configured value, consider lowering it. Measure over a period that includes peak load — do not judge while excluding the busy season.

  • Align backup retention with requirements

    Medium

    Match the retention period to requirements, and set an operational rule for periodically inventorying manual snapshots.

  • Limit non-production uptime to business hours

    Medium

    Stop dev/test environments overnight and on holidays. Pair scheduled automated stops with a notification path for a missed startup.

  • Reconsider placement to reduce cross-AZ traffic

    Medium

    Check the AZ placement of the application and database, and reduce round trips within what availability requirements allow.

Change involving a restart or service impact

  • Disable Multi-AZ on non-production

    High

    Carry this out only after re-confirming availability requirements with stakeholders. Disabling it is a change operation, and re-enabling it later also takes time.

  • Delete orphaned resources

    High

    Deletion cannot be undone. Execute only items that satisfy all three of owner confirmation, approval, and a prior snapshot, one at a time.

Work requiring expert review

  • Purchase Savings Plans / Reserved Instances

    Expert Review Required

    This is a long-term commitment, and changing the configuration midway wastes it. Consider this only after finishing right-sizing and confirming through measurement that usage has stabilized. Since scope and flexibility differ by type, always check the target service and conditions before purchasing.

!Warnings

  • This article gives no savings percentage or amount whatsoever. A figure like "X% savings" depends entirely on your configuration and usage — calculate it from your own Cost Explorer data. A savings percentage from someone else's case cannot be applied directly to yours.
  • A deletion cannot be undone. An EBS volume in the `available` state may include something staged for incident recovery or an asset whose handover is not complete. Treat listing and deletion as separate tasks, and limit deletion to items that have owner confirmation and approval.
  • A manual snapshot may be subject to an audit or statutory retention requirement. Check retention requirements before deleting anything.
  • Deciding to lower provisioned IOPS based on measurements from a period that excludes the busy season can lead to a performance incident. Measure over a period that includes annual and monthly peaks.
  • Savings Plans and Reserved Instances are commitments that cannot be cancelled. Purchasing before right-sizing leaves a contract that no longer fits the optimized configuration.
  • Calling the Cost Explorer API incurs a per-request cost. Design the call frequency if you set this up to run periodically.

Differences by Version and Environment

gp2 vs. gp3gp2's baseline performance is tied to volume size, with anything above that drawn from I/O credits (bursting). gp3 lets you set IOPS and throughput independently of capacity, in addition to the baseline. Refer to current AWS documentation for eligibility, limits, and billing terms.
Amazon AuroraAurora's storage capacity grows and shrinks with usage, and I/O billing is handled differently than on RDS (including whether an I/O-Optimized configuration is used). Since the cost structure differs from RDS, the same checklist items carry different weight.
RDS's stop featureTemporarily stopping an RDS instance has a maximum stop duration, after which it starts automatically. Assume this constraint when designing overnight stops for a dev environment.

If This Doesn't Resolve It

  • If cost isn't dropping, check which part of the breakdown isn't moving

    If storage cost or data transfer cost dominates, lowering instance cost won't move the total. Go back to Cost Explorer's breakdown by usage type.

  • Check the completeness of tagging

    A resource without a cost-allocation tag can't be attributed to a department or system. Get tagging practice in order as a prerequisite for the inventory.

  • Check details with the Cost and Usage Report

    If Cost Explorer's granularity isn't enough, export the Cost and Usage Report (CUR) to S3 and analyze it at the resource level.

  • Check dependencies for resources that cannot be deleted

    Check for dependencies such as a snapshot referenced by an AMI, or a volume documented in a recovery runbook.

  • Build a mechanism to prevent the same growth from recurring

    Even if one inventory pass brings things down, the same path will cause growth again. Pair mandatory tagging at creation time with a periodic inventory.

Basis and Limitations of This Document

Explanation based on official product documentation

Based on the public specifications of Amazon RDS, Amazon EBS, and AWS Cost Explorer, and general practices for inventorying cloud spend. It includes no pricing, savings percentages, or measurements from any specific environment. Calculate the amount using your own Cost Explorer data and the AWS Pricing Calculator.

FAQ

How much can AWS database costs be reduced?

This article gives no percentage. The room for savings depends entirely on your current configuration and usage, and an already-optimized environment will barely move. First pull the breakdown by service and usage type from Cost Explorer and start with the largest items — an estimate of potential savings can only come from that breakdown.

What should be done first?

In order of smallest impact and easiest to reverse: (1) understand the breakdown via Cost Explorer, (2) list unused resources, (3) right-size based on measurements, (4) review storage type and provisioned amounts, (5) inventory backups, (6) review the configuration and uptime of non-production environments, and (7) purchase a commitment only after usage has stabilized.

Is it okay to buy Reserved Instances or Savings Plans first?

Not recommended. These are long-term commitments that cannot be cancelled. Without finishing right-sizing first, you'll be left with a contract covering a configuration that becomes unnecessary after optimization. Consider this only after confirming through measurement that usage has stabilized.

Does switching from gp2 to gp3 make things cheaper?

It depends on the configuration. Since gp3 lets you set baseline performance and throughput independently of capacity, a setup that provisioned large capacity purely for performance has room to review. But confirming it meets performance requirements comes first. Check current AWS documentation for eligibility and billing terms.

Is it okay to delete an unattached EBS volume right away?

Don't delete it immediately after listing it. It may include something staged for incident response, temporary space from an in-progress migration, or an asset whose handover is not yet complete. Check the tags and creation date, get owner approval, take a snapshot before deleting, and execute one at a time.

Can this be run in production?

The listing commands (`get-cost-and-usage`, `describe-volumes`, `describe-snapshots`, `describe-db-instances`) are read-only and can be run as-is in production. Since delete commands and storage/instance class changes have an impact, carry them out only after approval and within a maintenance window.

Questions This Document Covers

  • Want to identify why the AWS bill increased
  • Want to know how to lower RDS costs
  • Want to find unused EBS volumes or snapshots
  • Want to reduce AWS cost for a development environment

What the Risk Labels Mean

  • Read-onlyDoes not change data or settings.
  • LowImpact is limited, but permissions and load should be checked.
  • MediumMay affect performance, locking, or cost.
  • HighMay cause an outage, data loss, or require recovery work.
  • Expert Review RequiredRequires a separate review before applying to production.

GIIP's Scope of Support

The difficulty in reviewing cost isn't not knowing what actions to take — it's that the inventory happens only once. Three months after a cleanup, new unused volumes and snapshots pile up again, and a right-sized configuration drifts again as business volume changes. At GIIP, an AI agent periodically detects orphaned resources and checks for gaps between provisioned and measured values across several databases on AWS and Azure and roughly 30 web services, while an irreversible decision such as deletion or a configuration change is approved by a human specialist. The goal is to make inventory an ongoing routine rather than a one-off event.

Author & Technical Review

GIIP Production Operations Team

About 30 years of experience in designing, migrating, and operating large-scale web services, SQL Server, Oracle, AWS, and Azure. Experience includes 12 sets of x12large-class AWS RDS for SQL Server environments, an Oracle environment with roughly 120,000 tables, and migrating roughly 3TB from TiDB to Aurora MySQL. AI agents and human experts currently continue to monitor and operate multiple cloud databases and about 30 web services.

Related Knowledge

Related Services

Request an inventory of your AWS cost structure

If you need to repeat the same checks across multiple environments, we can discuss your entire operations setup.

Request an inventory of your AWS cost structure

← Back to Knowledge Base