タイトルの通りですが、Azure のコストの分析をしたかったので、Parquet ファイルでエクスポートして、SQL で検索をしたという無いようです。
Contents
コストのエクスポート
コストのエクスポートですが、Cost Management のエクスポート機能を使用して Parquet ファイルでストレージアカウントにエクスポートすることができます。
これを次のように設定をし、デイリーでエクスポートするように設定しています。
データのエクスポートはデイリーで実行されますが、ディレクトリには該当月の最新データのみが存在するようにしてデータが保存されるようですので、以下の設定であればファイルのライフサイクル管理は意識しなくても良いかと。毎日エクスポートタイミングの最新のデータが保存された状態となります。
どのようなスキーマで出力されるかについては、契約形態によって異なりますが Cost Management データセットスキーマインデックス でスキーマを確認することができます。
SQL による確認
SQL による確認は、Azure ストレージに対して SQL を実行する方法であれば何でも良いかと。私はアドホックにクエリが実行できれば良いので、OPENROWSET BULK を使用して検索を行っています。
Azure 上で完結指せるなら Synapse Analytics の Serverless SQL Pool が手軽ではないでしょうか。
次のようなクエリで出力先のストレージの 外部データソース を作成し、
(以下のクエリは ADLS Gen2 を想定したもの)
CREATE EXTERNAL DATA SOURCE CostContainer WITH( LOCATION = 'abfss://cost@xxxxxx.dfs.core.windows.net' ) GO
次のようなクエリで検索を行います。
SELECT
*,
CAST(BilledCost / SUM(BilledCost) OVER() * 100 AS numeric(5,2)) AS CostRatio,
SUM(BilledCost) OVER() AS Total
FROM
(
SELECT
ResourceType,
ChargeDescription,
SkuMeter,
x_ResourceGroupName,
ResourceName,
CAST(SUM(PricingQuantity) AS numeric(12,4)) AS PricingQuantity,
PricingUnit,
CAST(SUM(BilledCost) AS numeric(12,4)) AS BilledCost,
BillingCurrency,
MAX(x_BillingExchangeRate) AS BillingExchangeRate,
CAST(MAX(ChargePeriodStart) AS date) AS Last_ChargePeriodStart
FROM
OPENROWSET (
BULK '/*/*/202512*/*/*.parquet',
DATA_SOURCE = 'CostContainer',
FORMAT = 'PARQUET'
) AS T
GROUP BY
ResourceType, ChargeDescription, SkuMeter, x_ResourceGroupName, ResourceName, PricingUnit, BillingCurrency
) AS T2
ORDER BY
BilledCost DESC
GO
次の画像が実際にクエリを実行して取得した情報となります。(リソース名等に関しては削除しています)
Azure Storage Discovery を一時的に Standard に変更し、その後 Free に戻すことを忘れていたので、コストが発生していることに今日気がづきました…。