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

What to Check When Reviewing AWS Database Costs

公開日 2026-08-13 · 更新日 2026-08-13 · 最終検証日 2026-08-13

結論

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.

この文書の適用条件

対象製品Amazon RDS / Amazon Aurora / Amazon EBS / AWS Cost Explorer
確認バージョンAWS CLI v2 / the public APIs of Amazon RDS, Amazon EC2, and AWS Cost Explorer (based on the specification as of 2026-08-13)
適用環境AWS
必要権限Read access requires `rds:DescribeDBInstances`, `rds:DescribeDBSnapshots`, `ec2:DescribeVolumes`, `ec2:DescribeSnapshots`, and `ce:GetCostAndUsage`. Delete operations require the corresponding Delete privilege
実行影響No impact from listing commands. Delete and change commands can be irreversible
再起動Required when changing storage type or instance class
最終検証日2026-08-13

そのまま実行できるコマンド

Pull monthly cost by service (run this first)参照のみ
対象
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 anything参照のみ
対象
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)参照のみ
対象
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 IOPS参照のみ
対象
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)
対象
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.

結果の読み方

意味確認するポイント
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

こういう状況で使います

  • 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

考えられる原因(可能性の高い順)

  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.

確認手順

  1. 1

    Pull the cost breakdown from Cost Explorer

    参照のみ

    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

    参照のみ

    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

    参照のみ

    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

    参照のみ

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

  5. 5

    Check backup retention settings

    参照のみ

    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

    参照のみ

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

  7. 7

    Set up monitoring with AWS Budgets

    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.

対応方法

すぐに実施できる低リスクの対応

  • "List" unused resources

    参照のみ

    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

    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.

事前検討が必要な変更

  • Plan right-sizing based on measurements

    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

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

  • Align provisioned IOPS with measured usage

    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

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

  • Limit non-production uptime to business hours

    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

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

再起動・サービス影響を伴う変更

  • Disable Multi-AZ on non-production

    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

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

専門家のレビューが必要な作業

  • Purchase Savings Plans / Reserved Instances

    専門家レビュー必須

    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.

!注意事項

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

バージョン・環境による違い

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

この文書の根拠と限界

製品の公式ドキュメントに基づく説明

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.

よくある質問

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.

この文書がカバーする質問

  • 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

リスク表示の意味

  • 参照のみデータと設定を変更しません。
  • 影響は限定的ですが、権限と負荷の確認が必要です。
  • 性能・ロック・コストに影響する可能性があります。
  • 障害・データ損失・復旧作業が発生する可能性があります。
  • 専門家レビュー必須本番適用前に別途レビューが必須です。

GIIPの対応範囲

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.

執筆・技術検証

GIIP プロダクション運用チーム

大規模Webサービス、SQL Server、Oracle、AWS、Azureの設計・移行・運用に約30年従事。x12largeクラスのAWS RDS for SQL Server環境12セット、約12万テーブルのOracle環境、約3TBのTiDBからAurora MySQLへの移行を経験。現在も複数のクラウドデータベースと約30のWebサービスを、AIエージェントと人間の専門家が継続的に監視・運用しています。

関連するナレッジ

関連サービス

Request an inventory of your AWS cost structure

同じ確認を複数の環境で継続する必要がある場合は、運用体制ごと相談できます。

Request an inventory of your AWS cost structure

ナレッジベース一覧へ