LoginSignup
1
1

More than 1 year has passed since last update.

[AWS] Pythonを使ってAWSの不安(コスト)を取り除く!!

Last updated at Posted at 2022-12-04

AWSで初めて使う人には、コストが心配になりますよね。

でも、Boto3を使えば安心です。

Boto3はAWSのPython用SDKで、AWSのさまざまなサービスにプログラムからアクセスするためのライブラリです。

Boto3を使えば、あらかじめテンプレートを作っておけば安全にAWSを操作できます。

この記事の内容はPython初心者でも簡単に使えます。

ただし、Pythonの環境構築ができていることとaws configureコマンドでAWSにアクセスできるようにしておく必要があります。

注意点

  • コストのアラートはcloudwatchのメトリクスアラームを使ってトリガーを作ることが出来るのでスクリプトを組まなくても通知をする方法は別にある
  • 今回はcronを使うことを想定

boto3を使って直近xヶ月の料金を取得するための前準備

まずは今の月の最終日と3ヶ月前の月の一日を取得します。

今回は使う日にちのフォーマットは『YYYY-MM-DD』です。

今月最後の日を取得


def get_last_day_cuurent_month():
    # 今月最後の日を取得
    last_day = calendar.monthrange(date.today().year, date.today().month)[1]

    # formatを整える
    last_day_formatted = date.today().strftime("%Y-%m-") + str(last_day)

    return last_day_formatted

3ヶ月前に一日を取得


def get_firstday_three_month_ago():
    # 3ヶ月前の日にち
    start_date = date.today() - timedelta(days=90)
    start_date = start_date.replace(day=1)
    # Format the start date in the format YYYY-MM-DD
    start_date_formatted = start_date.strftime("%Y-%m-%d")

    return start_date_formatted

取得した日にちを元にコストを取得する

最後に取得したデータを元にAWSのコストを取得します。


# AWS の Cost Explorer クライアントを作成する
client = boto3.client('ce')

def get_costs(start_date: str, end_date: str):
    # 分析する期間を設定する
    start_date = str(start_date)
    end_date = str(end_date)

    # 指定された期間の利用料金データを取得する
    response = client.get_cost_and_usage(
        TimePeriod={
            'Start': start_date,
            'End': end_date
        },
        Granularity='MONTHLY',
        Metrics=['BlendedCost']
    )

    # レスポンスから利用料金データを抽出する
    cost_data = response['ResultsByTime']

    # TimePeriod.End の値に基づいて、辞書のリストを降順で並べ替える
    sorted_list = sorted(
        cost_data, key=lambda item: datetime.strptime(item['TimePeriod']['End'], 
        '%Y-%m-%d'), 
        reverse=True
    )

    return sorted_list


下のスクリプトで試しにコストを出力してみる


# 今月のコスト
print(cost_list[0]["Total"]['BlendedCost']["Amount"])
# 先月のコスト
print(cost_list[1]["Total"]['BlendedCost']["Amount"])

警告を表示してみる


# 現在の利用料金が $10 を超えている場合は警告する
if current_cost > 10:
    print("Warning: Current cost is over $10.")

まとめ

AWS を利用する上で、利用料金がいくらまで許容できるかは、企業や組織によって異なります。まずは、予算を設定しておくことで、利用料金が許容範囲内かどうかを把握することができます。

想定していた利用料金を超えた場合、今回はLambdaを使って警告を出し、その後の処理を書くことを想定しています。

またboto3では、今回は紹介していませんがどのサービスがいくら使われているかを把握することもできます。

その機能を使うことで、使われているサービスを分析し、必要ないものを停止するなどの処理を行うこともできます(時間があれば記事書きます)。

今回はboto3ですべ処理することを想定していますがAWSの利用料金が想定している限りを超えた時にBudgetsというツールを使って利用料金の警告を設定することができます。

Budgetsを使うことで、利用料金が想定した限りを超えた場合に通知を受け取ることができますのでなるべくスクリプトを組みたくない方はそちらを使うことをお勧めします。

1
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1