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']
のOnDemand
をReserved
にするとリザーブドインスタンスの料金も取得できます。
稼働中のインスタンス取得のAPIと組み合わせると稼働中のインスタンスの料金を計算できるようになります。
また、同様の方法で他サービスの料金も取得できます。