kanga333.b?log

雑な記録

AWSコストをpandasで分析するためのツールを作った

github.com

最近 cepan というAWSコスト分析用のPythonライブラリを作りました。

これは何?

JupyterのようなNotebook上でAWSコストを分析するためのツールです。

boto3のCostExplorer APIをラップしたライブラリでデータをpandas.Dataframe形式でデータを返してくれます。

boto3のAPIと”ほぼ”同じインタフェースで使うことができます。 例えば2021年2月と3月の月次コストをS3のコストに絞ってUSAGE_TYPE別に取得したい場合は以下のようなコードを書きます。

from datetime import datetime

import cepan as ce

df = ce.get_cost_and_usage(
    time_period=ce.TimePeriod(
        start=datetime(2021, 2, 1),
        end=datetime(2021, 4, 1)
    ),
    granularity="MONTHLY",
    group_by=ce.GroupBy(
        dimensions=["USAGE_TYPE"]
    ),
    filter=ce.Dimensions(key="SERVICE",values=["S3"])
)

こんな感じでデータが帰ってきます (私の個人AWSアカウントの数値なので額はしょぼい)

f:id:kangaat:20210406221114p:plain

Dataframeでデータを返すので加工はよしなに行うことができ、例えば上述のデータを加工して前月とのコスト比を出す、とかできます。

df = df.pivot(index=['USAGE_TYPE'], columns='Time', values='UnblendedCost').fillna(0)
df['Diff'] = df["2021-03-01"] - df["2021-02-01"]

f:id:kangaat:20210406221229p:plain

cepanではなるべくboto3の引数名やデータ構造を合わせつつも、ネストしたDictを要求するような複雑な引数に対してはデータ型を定義するようにしています。 そのため補完による入力補助をうけることができます。

f:id:kangaat:20210406224217g:plain

その他の便利機能として、例えばCostExplorer APIだとS3のコストだけを取得するためにはフィルターに Amazon Simple Storage Service と入力しないといけないのですが、長くて大変面倒なので、S3 と入力しても大丈夫なようにしています。その手のサービス名のエイリアスを幾つか定義しており、全量はここで見れます。

こんな感じで使っているよ

ギョームでAWSコストの分析を定期的に行って、コスト感と改善ポイントの把握する必要があり、その分析業務をcepanとJuputerで行っています。 素のboto3だと入力も戻り値も複雑にネストしたDictなので使いにくいですが、cepanだとシュッとDataframeでデータを取得できるのですぐに分析に移ることができます。

サービス別の前月コスト比や、各主要サービスの日別、USAGE_TYPE別のコストグラフなどを出すノートブックを作って定形の分析作業を半自動化しつつ、気になるデータがあったら追加で詳しく見ていくみたいな運用をしています。 またDataframeの加工のしやすさを活かして、リクエスト数のデータとAWSコストのデータをかけ合わせてリクエスト数に対するコストの推移は妥当であるか?みたいなことも見ていたりします。(アドテクはコスパが大事なので)

手軽さではコンソールのAWS CostExplorerには劣るのですが、ちょっと計算を加えたり、定形作業として複数の可視化と分析を半自動化したいみたいなケースでは便利だと思うので使ってみてください。