インスタンスごとの月間稼働時間を知る方法を教えてください

2023.05.24

こんにちは。
ご機嫌いかがでしょうか。
"No human labor is no human error" が大好きな吉井 亮です。

AWS 管理者のみなさん、インスタンスごとの月間稼働時間を知りたいという場面はないでしょうか?あると思います。
CostExplorer ではインスタンスタイプごとの把握は可能ですが、インスタンスごとは難しそうです。
CloudTrail で StartInstances/StopInstances を拾って DynamoDB に記録しておくことも選択肢としてはありですが、すこし過剰に感じるかもしれません。

今回は CUR を活用してインスタンスごとの月間稼働時間を知る方法を考えてみます。
以下のような手順になります。

  1. CUR を定期的に出力
  2. 出力されたレポートを Athena で検索

CUR とは?

AWS Cost and Usage Reports の略称です。日本語だと ”AWS コストと使用状況レポート” になります。
レポートには AWS リソース使用状況の明細が含まれており、定期的に S3 バケットへ出力されます。

含まれる主な項目は以下です。すべての項目を知りたい方は データディクショナリ を参照ください。

  • bill/BillingEntity : AWS Marketplace に関するものなのかどうか
  • lineItem/ProductCode : 製品コード。いわゆる AWS サービス。
  • lineItem/ResourceId : リソース ID
  • lineItem/UsageAccountId : AWS アカウント ID
  • lineItem/UsageAmount : 使用量。料金ではなく起動時間やストレージ容量などの使用量です。
  • lineItem/UsageType : 使用状況。例えば、S3 であれば Put、Get、Head など何に使われたかが細かく分かれています。
  • pricing/unit : AWS が使用料を計算するために使用した料金単位
  • product/dataTransfer : データ転送量
  • product/instanceType : インスタンスタイプ
  • resourceTags/user:~~ : ユーザー定義のコスト配分タグ

AWS コストと使用状況レポートとは

CUR 作成

CUR はマネジメントコンソールから簡単に設定可能です。

マネジメントコンソールで billing を開きます。

左側ペインから Cost & usage reports をクリックします。

レポートの作成 ボタンをクリックします。

レポートの詳細の指定画面に遷移します。
識別しやすい任意のレポート名 を入力します。
リソース ID のインクルード にチェックを入れます。これによりレポートにリソース ID が含まれます。

配信オプションの設定画面に遷移します。
S3 バケットの設定にある 設定 ボタンをクリックします。
CUR 保存用 S3 バケットをお持ちでない場合は バケットの作成 を選択します。
識別しやすい任意のバケット名 の入力と リージョン を選択します。
以下のデフォルトポリシーは、バケットに適用されます。 にチェックを入れます。

レポート配信のオプションにある レポートデータの統合 → Amazon Athena にチェックを入れます。
このチェックは必須ではありませんが、本エントリの後続手順はこのチェックが前提になっています。

次へ をクリックします。

レポートの作成 をクリックします。

CUR 確認

以上で CUR 設定は完了です。
しばらくすると作成手順で指定した S3 バケットにレポートが出力されます。最大24時間かかるそうです。レポートは少なくとも1日1回更新されます。ここのコントロールはできないようです。

待ってみたところ無事にレポート他が生成されています。以下の4つが生成されていることを確認してください。

Athena 設定

CUR をファイルで内容確認していくのは無理があります。
Athena を使って SQL ライクに欲しい情報のみを取り出します。

CUR と Athena を統合した設定は CloudFormation テンプレートが用意されています。CUR 保存用の S3 バケットに crawler-cfn.yml というファイルがあるはずです。これを手元の PC にダウンロードします。

マネジメントコンソールで CloudFormation を開きます。

スタックの作成 → 新しいリソースを使用 をクリックします。

テンプレートファイルのアップロード を選択し、ファイルの選択 から先ほどダウンロードした crawler-cfn.yml をアップロードします。
次へ をクリックします。

任意のスタック名 を入力して 次へ をクリックします。

スタックオプションの設定画面ではそのまま 次へ をクリックします。

AWS CloudFormation によって IAM リソースが作成される場合があることを承認します。 にチェックを入れ 送信 をクリックします。

しばらく待つとスタックが「CREATE_COMPLETE」になります。必要なリソースが作成されています。

AWS CloudFormation テンプレートを使用した Athena のセットアップ

Athena でクエリ

Athena で必要な情報をクエリします。本エントリでは「インスタンスごとの月間稼働時間」でした。

マネジメントコンソールで athena を開きます。

左側メニューから クエリエディタ を開きます。

前の手順の CloudFormation スタックが成功していれば、データベース athenacurcfn_~~ と2つのテーブルができているはずです。

ステータスを確認してみます。以下のクエリを実行し「READY」が返ってくることを確認します。「UPDATING」になる場合は「READY」になるまで待ちます。

select status from cost_and_usage_data_status

インスタンスごとの稼働時間

EC2 インスタンスの稼働時間を集計します。
インスタンス ID とインスタンスタイプごとに lineItem/UsageAmount を sum しています。単位は時間です。
FROM はご自身の環境に合わせて変更ください。
CAST(bill_billing_period_start_date as varchar) は取得したい月を指定ください。
line_item_usage_type で指定している APN1 は東京リージョンです。ご自身の環境に合わせて変更ください。

SELECT line_item_resource_id, product_instance_type, sum(line_item_usage_amount) as usage_amount
FROM "athenacurcfn_awscur"."awscur"
WHERE 
  CAST(bill_billing_period_start_date as varchar) = '2023-05-01 00:00:00.000'
  AND line_item_product_code = 'AmazonEC2'
  AND line_item_usage_type like 'APN1-BoxUsage%'
GROUP by line_item_resource_id, product_instance_type

クエリ結果です。

クラスメソッドメンバーズのお客様

クラスメソッドメンバーズをご契約いただいているお客様向けは、クラスメソッドメンバーズ特有の CUR を提供しておりますのでこちらも合わせてお使いください。

まとめ

CUR にはとても細かい利用明細が記録されます。Cost Explorer で拾いきれない明細がほしいケースで役に立ちます。
今回は Athena でしたが、Quicksight で可視化することも選択肢にあると思います。

参考

AWS コストと使用状況レポートとは
AWS CloudFormation テンプレートを使用した Athena のセットアップ

以上、吉井 亮 がお届けしました。