Cost and Usage Report(CUR、コストと使用状況レポート)を出力する
コーヒーが好きな emi です。
AWS には 「Cost and Usage Report(CUR、コストと使用状況レポート)」 という、AWS サービスの利用状況やコストに関する詳細なデータを提供するレポートがあります。CUR を活用することで、AWS リソースの使用状況やコストの内訳をより細かく分析でき、コスト管理や最適化のための意思決定に役立てることができます。
今回はこの Cost and Usage Report(CUR)を出力する手順について、クラスメソッドのようなリセラー経由のアカウントと、リセラーを介さない通常のアカウントの両方で試してみました。
Cost and Usage Report(CUR、コストと使用状況レポート)を出力する
リセラー経由のアカウントでない場合
以下手順はクラスメソッドなどのリセラー経由で AWS アカウントを払い出して いない 場合の手順になっています。クラスメソッドメンバーズのお客様は本ブログ下部の「クラスメソッドメンバーズの場合」をご参照ください。
まず AWS マネジメントコンソールで「請求とコスト管理ホーム」に移動します。
右上のユーザー名をクリックしてメニューを開き「Billing and Cost Management」をクリックすると移動できます。
以下の画面で 「レガシー」 メニューを開き 「コストと使用状況レポート」 を開くと、以下メッセージが表示されています。
コストと使用状況レポートの従来のページは非推奨となります
データエクスポートは、コストと使用状況レポートなどをエクスポートするための新しいエクスペリエンスです。これを受けて、コストと使用状況レポートの従来のページは非推奨となる予定です。コストと使用状況レポート、顧客のカーボンフットプリントツール、およびデータエクスポートの AWS 使用状況レポートには引き続きアクセスできます。
では、推奨された通り 「データエクスポート」 から設定します。以下ドキュメントも参考にしてください。
「作成」 をクリックします。
以下項目を設定していきます。
- 標準データをエクスポート
- クリックしてもチェックされないのですが、以下の設定項目は表示されます。
- エクスポート名(任意のエクスポート名)
- CUR 2.0
- リソース ID を含める
- 「コスト配分データを分割」 は ECS・EKS 用みたいです。今回はチェックしませんでした。
- 時間粒度
- 時間単位、日次、月次から選択できます。今回は時間単位にしました。
「SQL ステートメント」 で含める列を選択します。デフォルトでは全部チェックされています。
「SQL クエリとテーブル設定をプレビュー」 をクリックすると以下のようにカラムがプレビューされます。
「クエリをコピー」 でコピーできた内容
{"QueryStatement":"SELECT bill_bill_type, bill_billing_entity, bill_billing_period_end_date, bill_billing_period_start_date, bill_invoice_id, bill_invoicing_entity, bill_payer_account_id, bill_payer_account_name, cost_category, discount, discount_bundled_discount, discount_total_discount, identity_line_item_id, identity_time_interval, line_item_availability_zone, line_item_blended_cost, line_item_blended_rate, line_item_currency_code, line_item_legal_entity, line_item_line_item_description, line_item_line_item_type, line_item_net_unblended_cost, line_item_net_unblended_rate, line_item_normalization_factor, line_item_normalized_usage_amount, line_item_operation, line_item_product_code, line_item_resource_id, line_item_tax_type, line_item_unblended_cost, line_item_unblended_rate, line_item_usage_account_id, line_item_usage_account_name, line_item_usage_amount, line_item_usage_end_date, line_item_usage_start_date, line_item_usage_type, pricing_currency, pricing_lease_contract_length, pricing_offering_class, pricing_public_on_demand_cost, pricing_public_on_demand_rate, pricing_purchase_option, pricing_rate_code, pricing_rate_id, pricing_term, pricing_unit, product, product_comment, product_fee_code, product_fee_description, product_from_location, product_from_location_type, product_from_region_code, product_instance_family, product_instance_type, product_instancesku, product_location, product_location_type, product_operation, product_pricing_unit, product_product_family, product_region_code, product_servicecode, product_sku, product_to_location, product_to_location_type, product_to_region_code, product_usagetype, reservation_amortized_upfront_cost_for_usage, reservation_amortized_upfront_fee_for_billing_period, reservation_availability_zone, reservation_effective_cost, reservation_end_time, reservation_modification_status, reservation_net_amortized_upfront_cost_for_usage, reservation_net_amortized_upfront_fee_for_billing_period, reservation_net_effective_cost, reservation_net_recurring_fee_for_usage, reservation_net_unused_amortized_upfront_fee_for_billing_period, reservation_net_unused_recurring_fee, reservation_net_upfront_value, reservation_normalized_units_per_reservation, reservation_number_of_reservations, reservation_recurring_fee_for_usage, reservation_reservation_a_r_n, reservation_start_time, reservation_subscription_id, reservation_total_reserved_normalized_units, reservation_total_reserved_units, reservation_units_per_reservation, reservation_unused_amortized_upfront_fee_for_billing_period, reservation_unused_normalized_unit_quantity, reservation_unused_quantity, reservation_unused_recurring_fee, reservation_upfront_value, resource_tags, savings_plan_amortized_upfront_commitment_for_billing_period, savings_plan_end_time, savings_plan_instance_type_family, savings_plan_net_amortized_upfront_commitment_for_billing_period, savings_plan_net_recurring_commitment_for_billing_period, savings_plan_net_savings_plan_effective_cost, savings_plan_offering_type, savings_plan_payment_option, savings_plan_purchase_term, savings_plan_recurring_commitment_for_billing_period, savings_plan_region, savings_plan_savings_plan_a_r_n, savings_plan_savings_plan_effective_cost, savings_plan_savings_plan_rate, savings_plan_start_time, savings_plan_total_commitment_to_date, savings_plan_used_commitment FROM COST_AND_USAGE_REPORT"}
{"TableConfigurations":{"COST_AND_USAGE_REPORT":{"INCLUDE_RESOURCES":"TRUE","INCLUDE_SPLIT_COST_ALLOCATION_DATA":"FALSE","TIME_GRANULARITY":"HOURLY"}}}
今回はデフォルトのまま進めます。
続いてデータエクスポートオプションでファイル形式やバージョニングを設定します。
圧縮タイプとファイル形式には Parquet を選択してみました。S3 に配置し、Athena や QuickSight で分析する場合は、Parquet の方がクエリパフォーマンスが高く、処理コストも抑えられるため、より効率的です。
一方で、ファイルをダウンロードしてローカルで確認するようなケースでは、gzip 圧縮のテキスト/CSV 形式の方が扱いやすいかもしれません。
ファイルのバージョニングに関しては 「既存のデータエクスポートファイルを上書き」 にしました。日付でプレフィックスが分かれていくので基本は上書きは発生しないはずです。
CUR を出力する S3 バケットを設定します。今回は以前 請求書画面から請求明細の CSV ファイル(単月分)をダウンロードする | DevelopersIO で作成した S3 バケットを指定してみました。 「S3 バケットポリシーを上書きすることに同意します」 にチェックして 「バケットを選択」 します。
表示された S3 バケットポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "EnableAWSDataExportsToWriteToS3AndCheckPolicy",
"Effect": "Allow",
"Principal": {
"Service": [
"billingreports.amazonaws.com",
"bcm-data-exports.amazonaws.com"
]
},
"Action": [
"s3:PutObject",
"s3:GetBucketPolicy"
],
"Resource": [
"arn:aws:s3:::<S3 Bucket Name>",
"arn:aws:s3:::<S3 Bucket Name>/*"
],
"Condition": {
"StringLike": {
"aws:SourceArn": [
"arn:aws:cur:us-east-1:123456789012:definition/*",
"arn:aws:bcm-data-exports:us-east-1:123456789012:export/*"
],
"aws:SourceAccount": "123456789012"
}
}
}
]
}
S3 プレフィックスを設定します。cur としてみました。
最後に 「作成」 をクリックします。
これで完了です。作成したエクスポートが表示されています。
クラスメソッドメンバーズの場合
クラスメソッドメンバーズをご利用の皆様は以下の手順を参照ください。
「1. CloudFormationでS3バケットを作成」 という項目の中に 「Launch Stack」 ボタンがあるので、クリックして CloudFormation スタック作成画面に遷移します。
スタック名はデフォルトで 「cm-cur-bucket」 と入力されており、このままで OK です。
パラメーターで任意の S3 バケット名を指定したら 「スタックの作成」 をクリックします。
スタックのステータスが 「CREATE_COMPLETE」 になれば OK です。
こんな S3 バケットができています。S3 バケット名をコピーしておいて下さい。
ここからはクラスメソッドメンバーズポータルでの作業です。
クラスメソッドメンバーズポータル(CMP)にログインし、「AWS アカウント」 メニューから料金の明細を見たい AWS アカウントの詳細に遷移します。
「ご利用料金詳細」 をクリックすると、「CURエクスポート設定」 というボタンがあるのでクリックします。
組織 CUR を作成する場合
組織 CUR を作成する場合は、画面右上の組織名をクリックすると 「組織CURエクスポート設定」 という項目が出てきます。こちらから設定してください。
「新規登録」 をクリックします。
以下を設定します。
- エクスポート名(任意のエクスポート名)
- フォーマット(CSV もしくは Parquet)
- S3バケット(CloudFormation で先ほど作成した S3 バケットを指定)
- S3パスプレフィックス
- デフォルトで
cur/<AWS アカウント ID>
というパスが設定されているのでこのまま
- デフォルトで
フォーマットは CSV か Parquet が選択できます。Parquer の場合は上書きとなりますが、日付でパスが分かれていくので基本は上書きは発生しないはずです。
「保存」 をクリックすると確認画面が出るので 「OK」 で進めます。
これで完了です。作成したエクスポートが表示されています。
ここまでで設定したクラスメソッドメンバーズの CUR を使って、以下ブログのように Athena を使った分析をしたり、QuickSight を使ったコストダッシュボードを作成することができます。
余談
以下のブログで紹介した単月分の料金明細を CSV 形式でダウンロードする際、S3 バケットを設定しました。今回の CUR の設定ではこの時作成した S3 バケットを指定したのですが、S3 バケットポリシーを上書きしたためか設定が外れてしまっていました。
単月分の料金明細を CSV 形式でダウンロードするための S3 バケットと CUR を出力する S3 バケットは分けた方がよさそうです。
ちなみにクラスメソッドメンバーズでは単月分の料金明細はクラスメソッメンバーズポータル(CMP)からデフォルトで提供されているため、特に S3 バケットの設定は不要です。
おわりに
「Cost and Usage Report(CUR、コストと使用状況レポート)」 の出力を試しました。
クラスメソッドメンバーズでも 「Cost and Usage Report(CUR、コストと使用状況レポート)」 をご利用いただけます。
本記事への質問やご要望については画面下部のお問い合わせ「DevelopersIO について」からご連絡ください。記事に関してお問い合わせいただけます。
参考