この記事について
AWSのコスト最適化に取り組むインフラ・SRE担当者に向けて、AWS コストと使用状況レポート(AWS CUR)のCSVデータを活用し、使用量が0であるにもかかわらず課金が発生している明細行を特定する具体的な手順と知見をFAQ形式で整理しました。本記事の内容は公式ドキュメントの情報に基づいています。
課題
「AWS CUR CSV 読み方」や「Elastic IP 未使用 課金」、「EBS ボリューム 未接続 課金」といったキーワードで検索する担当者の多くは、次のような疑問や課題を抱えています。
- Q: 使っていないはずのリソースに対して、なぜ毎月請求が発生しているのか?
- Q: 大量の明細行が含まれるCURのCSVデータから、どの列を確認すれば無駄なコストを発見できるのか?
例えば、EC2インスタンスから関連付けが解除された Elastic IP アドレスは、明示的にリリースするまでアカウントに割り当てられたままとなり、関連付けの有無にかかわらず課金対象となります。また、インスタンスを削除しても残存しているEBSボリューム(describe-volumes コマンドで状態が available と表示されるもの)なども、使用量とは別に保持コストが発生します。これらをCURのCSVから正確に抽出する手順が必要です。
手順
CURのCSVファイルから使用量0で課金されている行を特定するための3つの手順を解説します。
手順1: S3バケットに出力されたCURのCSVを取得し、必須列を確認する
-
何を見るか: CURは設定したS3バケットに1日1回更新・発行されます。CSVを開き、主に
lineItem/UsageAmount(使用量)とlineItem/UnblendedCost(またはlineItem/BlendedCostなどの請求金額列)、lineItem/ResourceTypeやlineItem/ResourceId(リソース識別子)の列を確認します。 - どう判断するか: 各明細行はAWS製品、使用タイプ、オペレーションの一意の組み合わせです。列の構成は月の使用状況によって異なるため、該当する列が正しく含まれているかをまずチェックします。
手順2: 使用量(UsageAmount)が0かつ請求金額が発生している行をフィルタリングする
-
何を見るか:
lineItem/UsageAmountの値が0(または空)でありながら、請求金額の列に0を超える数値が記録されている行を抽出します。 - どう判断するか: 使用量が0であるにもかかわらず費用が発生している場合、リソースがアイドル状態または未接続(固定費や保持コストが発生している状態)であると判断できます。
手順3: リソースタイプとCLIコマンドによるステータス照合
-
何を見るか: 抽出された行の
lineItem/ResourceTypeや使用タイプを確認します。たとえば Elastic IP であればアカウントに割り当てられたまま維持されている状態、EBSであれば未接続状態が疑われます。 -
どう判断するか: EBSボリュームの例では、AWS CLIの
aws ec2 describe-volumes --volume-id <volume-id> --query Volumes[*].State --output textを実行します。応答がin-useではなくavailableであれば、インスタンスに接続されていない孤立したボリュームだと確認できます。
落とし穴
よくある間違いとして、CUR(Legacy CUR)と CUR 2.0(Data Exports)の仕様混同が挙げられます。CUR 2.0 はデータエクスポートにおける推奨される新しい受け取り方法であり、従来の Legacy CUR とはアクセス方法やアクションの定義が異なります。
また、古いCURの出力設定のままCSVを機械的に処理しようとすると、月ごとの使用状況によって含まれる列が可変であるため、列の位置ズレによる集計エラーを引き起こすリスクがあります。コンソールでのカスタム列選択や、AWS CLI/SDKでのSQLクエリを活用して出力スキーマを制御しないと、意図しないデータ取得につながります。
当社で実際に測っていること
当社が提供するプログラムでは、架空の9行の請求CSVを用いた見本レポートにおいて、請求合計のうち「未使用と読める費用(未接続の静的IP、孤立したスケジュールクエリ)」や「用途の確認が要る費用(GPU、開発DB、スナップショット、LB)」を仕分けて実測しています。
まとめ
明日から取り組む作業として、まずS3内の最新CUR CSVをダウンロードし、lineItem/UsageAmount が0で金額が発生している行をフィルタ抽出してみましょう。未接続のElastic IPや available 状態のEBSボリュームを特定し、不要なリソースを解放・削除することで無駄なコストを削減できます。
クラウド請求CSVを自動で仕分けるツールについては https://infraone.jp/costdiag/?utm_source=qiita&utm_medium=post&utm_campaign=qiita-quora をご覧ください。
※本記事は弊社 InfraOne のサービス紹介を含みます
参考
- https://docs.aws.amazon.com/ja_jp/cur/latest/userguide/what-is-cur.html
- https://docs.aws.amazon.com/cur/latest/userguide/what-is-data-exports.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 のサービス紹介を含みます。