この記事について
AWSのコストと使用状況レポート(CUR)をCSV形式で読み込み、使用量が0にもかかわらず課金が発生している行を抽出する具体的な手順を紹介します。公式ドキュメントに基づき、再現可能な方法で「未使用だが課金されている」リソースを可視化します。対象は請求データの1か月分のみで、時系列分析や自動削除は含みません。
課題
Elastic IPアドレスやEBSボリュームなど、AWSでは「使用していないが課金される」リソースが存在します。例えば、関連付けが解除されたElastic IPアドレスは、明示的にリリースしない限りアカウントに割り当てられたままとなり、使用中かどうかにかかわらず料金が発生します。一方、EC2インスタンスから外されたEBSボリュームも、削除されない限り課金される可能性があります。これらは請求書上で「usage_quantity = 0 かつ unblended_cost > 0」として現れることがあります。しかし、大量のCUR CSVを人力で確認するのは非効率です。
手順
-
CUR CSVを取得する:AWSコンソールでCost and Usage Reportを有効化し、Amazon S3バケットに出力された最新のCSVファイルをダウンロードします。1日1回更新され、CSV形式で提供されます。
-
対象列を確認する:使用量がゼロでありながらコストが発生している行を特定するために、
line_item/UsageQuantity列が0かつline_item/UnblendedCost列が0より大きい行を探します。この組み合わせが「使用量ゼロだが課金あり」の基本条件です。 -
リソース種別でフィルタする:
line_item/ProductCodeがAmazonEC2の行の中で、product/usagetypeに未使用リソースを示唆する値(例:アイドル状態のElastic IPや未接続のEBSボリュームに関連すると考えられるもの)が含まれる場合、重点的に確認します。ただし、具体的なusagetype値についてはAWSの最新ドキュメントを参照してください。 -
誤検知を除外する:一部のサービス(例:予約インスタンス)ではUsageQuantityが0でもコストが計上されることがあります。そのため、
line_item/LineItemTypeに予約やディスカウントに関連するタイプが含まれる場合は、未使用とは判断せず除外することを検討します。
落とし穴
「UsageQuantity = 0」だけを見て未使用と判断すると、誤検知が発生します。例えば、一部のデータ転送やAPIリクエストは集計単位の関係でUsageQuantityが小数点以下で記録され、四捨五入により0と表示されることがあります。また、CURには請求確定前の暫定データも含まれるため、直近のデータは変動する可能性があります。請求サイクル終了後のデータを使用する必要があります。
当社で実際に測っていること
当社のcostdiagでは、クラウド(GCP/AWS/OCI)の請求CSVを読み、『未使用と読める費用』として「使用量0で課金されている行」を抽出しています。判定は請求CSVの記載だけによる規則で、金額はその行の請求額です。
まとめ
明日から、あなたのAWSアカウントのCUR CSVをダウンロードし、「UsageQuantity=0かつUnblendedCost>0」の行を抽出してみてください。特にElastic IPやEBSボリュームに関連する行に注目しましょう。
参考
- https://docs.aws.amazon.com/ja_jp/cur/latest/userguide/what-is-cur.html
- https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html
- https://docs.aws.amazon.com/ja_jp/ebs/latest/userguide/ebs-deleting-volume.html
※本記事は弊社 InfraOne のサービス紹介を含みます
※本記事は弊社 InfraOne のサービス紹介を含みます。