[プレビュー] AWS 上のコストと使用量のデータを FOCUS 1.0 スキーマでエクスポート出来るようなったようなので Amazon Athena から参照してみた

[プレビュー] AWS 上のコストと使用量のデータを FOCUS 1.0 スキーマでエクスポート出来るようなったようなので Amazon Athena から参照してみた

Clock Icon2024.06.26 00:56

いわさです。

AWS の請求&コスト管理機能のひとつにデータエクスポート機能があります。
CUR (Cost and Usage) と呼ばれるコストと使用量の明細データを一定間隔で出力し、コスト分析ツールや BI ツールなどで参照することが出来ます。

従来は AWS 独自の CUR 形式(レガシー/2.0)でのエクスポートが可能だったのですが、先日のアップデートで FOCUS 1.0 形式でのエクスポートをプレビューリリースとして対応しました。

実際にとある AWS アカウントで FOCUS 1.0 形式でのエクスポート設定を行い、出力されたデータを Amazon Athena で確認する機会があったのでその様子を紹介します。

本日時点では FOCUS 1.0 形式のデータエクスポートはプレビュー機能となっています。今後変更や廃止される可能性があります。

FOCUS 1.0 とは

FOCUS (FinOps Cost and Usage Specification) はクラウドサービスのコストと使用量データなど請求データに関する統一された規格です。
FinOps Foundation Project のひとつとして進められており、コントリビューターとして Google Cloud や Microsoft、AWS や Oracle Cloud Infrastructure など多くの企業が参加しています。

この仕様が標準になると、異なるクラウドや SaaS プロダクトの使用量や料金を共通の分析ツールで扱うことが出来るようになります。
先週の 2024 年 6 月 20 日には FOCUS 1.0 が GA となりました。

各クラウドサービスプロバイダーごとに少しづつ FOCUS のサポートが進んでいる状態です。
今回のプレビューではありますが、AWS でもコストと使用量のデータを FOCUS 形式で出力出来るようになりました。

データエクスポート設定

まず、データエクスポートの設定です。
もともと AWS のコスト&請求機能にはデータエクスポート機能がありました。
レガシー CUR あるいは CUR 2.0 でのエクスポートが可能です。

今回のアップデートでエクスポート設定時に「FOCUS 1.0」を指定出来るようになっています。

注意点が画面へも表示されていますが、プレビュー機能なので運用環境の分析用途では使用しないようにしましょう。

データテーブルの指定をよく見てみると「FOCUS 1.0 with AWS columns」と表記されています。
こちらを選択するとエクスポートする列を選択するのですが、48 列エクスポートする形となっています。

列情報は以下の公式ドキュメントに記述されていまして、FOCUS 1.0 標準では 43 列が定められています。
x_CostCategoriesなどx_から始める列が 5 つ存在していまして、この 5 つの列は AWS 独自で追加したカラムとなっています。

今回は全て出力対象としました。
出力頻度は日次のみが指定可能です。

圧縮タイプ・バージョニング・エクスポート先 S3 バケットなどを設定します。
今回は Parquet を指定しました。画面だと Parquet - Parquet になっていますが、圧縮形式は Snappy っぽかったので、Snappy - Parquet が正しい気がします。

データエクスポート一覧では次のようにデータテーブル名を確認することが出来ます。

データを参照してみる

翌日くらいでしょうか、早速ファイルが出力されていることを確認しました。
5:00 JST 前後に出力されてますね。

ファイル名から Snappy 圧縮されていることが推測出来ます。 Snappy.Parquet は Athena が標準サポートしている形式でもあるので、今回は Athena で参照してみましょう。

手順は省略しますが Glue クローラーでテーブル作成しました。
次のような DDL になってます。

CREATE EXTERNAL TABLE `focuspewviewdata`(
  `availabilityzone` string, 
  `billedcost` double, 
  `billingaccountid` string, 
  `billingaccountname` string, 
  `billingcurrency` string, 
  `billingperiodend` timestamp, 
  `billingperiodstart` timestamp, 
  `chargecategory` string, 
  `chargeclass` string, 
  `chargedescription` string, 
  `chargefrequency` string, 
  `chargeperiodend` timestamp, 
  `chargeperiodstart` timestamp, 
  `commitmentdiscountcategory` string, 
  `commitmentdiscountid` string, 
  `commitmentdiscountname` string, 
  `commitmentdiscountstatus` string, 
  `commitmentdiscounttype` string, 
  `consumedquantity` double, 
  `consumedunit` string, 
  `contractedcost` double, 
  `contractedunitprice` double, 
  `effectivecost` double, 
  `invoiceissuername` string, 
  `listcost` double, 
  `listunitprice` double, 
  `pricingcategory` string, 
  `pricingquantity` double, 
  `pricingunit` string, 
  `providername` string, 
  `publishername` string, 
  `regionid` string, 
  `regionname` string, 
  `resourceid` string, 
  `resourcename` string, 
  `resourcetype` string, 
  `servicecategory` string, 
  `servicename` string, 
  `skuid` string, 
  `skupriceid` string, 
  `subaccountid` string, 
  `subaccountname` string, 
  `tags` map<string,string>, 
  `x_costcategories` map<string,string>, 
  `x_discounts` map<string,string>, 
  `x_operation` string, 
  `x_servicecode` string, 
  `x_usagetype` string)
PARTITIONED BY ( 
  `billing_period` string)
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION
  's3://hogeusagereportfocus/awsfocus/hogeusagereportfocus/data/'
TBLPROPERTIES (
  'CrawlerSchemaDeserializerVersion'='1.0', 
  'CrawlerSchemaSerializerVersion'='1.0', 
  'UPDATED_BY_CRAWLER'='focuspreview', 
  'averageRecordSize'='10', 
  'classification'='parquet', 
  'compressionType'='none', 
  'objectCount'='1', 
  'partition_filtering.enabled'='true', 
  'recordCount'='85334', 
  'sizeKey'='651866', 
  'typeOfData'='file')

今回エクスポート設定をしたのは、AWS Organizations を有効化した管理アカウントで設定しました。
アカウント状況によると思うので全く参考にならない気がしますが、件数は次のような感じでした。

billedcostが発生した料金のようです。
そしてchargecategoryを確認すると Credit や TAX、Usage などのカテゴリが存在するので、クレジットを除外した料金なども確認することが出来そうです。

統一規格のはずですが、ずいぶんと馴染のあるフィールドが多くてどのフィールドを参照すれば良いのかイメージしやすいなと思いました。
特定アカウントの料金をサービス別にまとめるクエリを適当に作ってみました。使用量と料金が確認出来ますね。色々出来そうです。

まとめ

本実は AWS 上のコストと使用量のデータを FOCUS 1.0 スキーマでエクスポート出来るようなったようなので Amazon Athena から参照してみました。

マルチクラウドのコスト管理は課題が多い状況かなと思っており、先日も Azure のマルチクラウドコスト管理の仕組みが廃止となりました。

この FOCUS が今後普及してくるとこのあたりも変わってきそうですね。
プレビューなのでまだ本格的な運用は推奨されませんが、マルチクラウドのコスト分析ツールを開発しているなどの評価目的で利用するのは良さそうですね。

この記事をシェアする

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.