[AWS]boto3でEC2のインスタンス料金を取得する


python boto3でec2の料金を取得する

インスタンスの料金を自動で取れたら便利だなーと思っていたら、
料金取得APIがあるようなので叩いてみました。

コード

pricingクライアント生成と、APIを実行しレスポンス取得

api実行.py
import boto3

# pricingを指定
pricing = boto3.client("pricing",
                          aws_access_key_id='access_key',
                          aws_secret_access_key='secret_key',
                          region_name='us-east-1')

response = pricing.get_products(
            ServiceCode='AmazonEC2',
            # フィルタ条件。
            Filters=[
              {
                'Type': 'TERM_MATCH',
                'Field': 'instanceType',
                'Value': 't2.micro'
              },
              {
                  'Type': 'TERM_MATCH',
                  'Field': 'termType',
                  'Value': 'OnDemand'
              },
              {
                  'Type': 'TERM_MATCH',
                  'Field': 'location',
                  'Value': 'Asia Pacific (Tokyo)'
              },
              {
                  'Type': 'TERM_MATCH',
                  'Field': 'operatingSystem',
                  'Value': 'Linux'
              }
            ]
        )

※注意事項

  • 東京リージョンには存在しないAPIなのでregion_nameの指定には注意
  • フィルタ条件を指定しないと全料金が返却されるので量がとんでもないです。

私の場合は、インスタンスサイズの料金が1件のみ返却されるようにフィルタ条件を調整しています。
フィルタ条件の属性等については、参考のリンク先を参照してください。

以下、レスポンスから1時間当たりの値段を取得するコード。

responseから料金取得.py
import json

response = json.loads(response['PriceList'][0])

# 1時間当たりの料金を取得する
hour_fee = 0
for v in response['terms']['OnDemand'].values():
  for v2 in v['priceDimensions'].values():
    hour_fee = float(v2['pricePerUnit']['USD'])

print('1時間あたりの料金:', hour_fee)

取得できるオンデマンドのインスタンス料金は時間単位です。

その他

response['terms']['OnDemand']OnDemandReservedにするとリザーブドインスタンスの料金も取得できます。

稼働中のインスタンス取得のAPIと組み合わせると稼働中のインスタンスの料金を計算できるようになります。

また、同様の方法で他サービスの料金も取得できます。

参考

AWS 料金表 API の更新 – 新しいクエリとメタデータ関数