⚠この記事はブログ移転前のアーカイブです

通常サイトへはこちら

AWS EC2のスポットインスタンスは安くて嬉しいのですが,全データセンターの中で最も安いゾーンを調べるのは骨が折れるのでスクリプト書きました.汚いけど許して

python3.6+ でどうぞ.

リージョンを手動で選択できるとは言え,全データセンターから検索しますからネットワークの品質が重要視される用途には向きません.機械学習等の計算資源を安く手に入れたい人向けです.

boto3が必要です.

# -*- coding: utf_8 -*-
from datetime import datetime, timedelta, timezone
import boto3

## init
aws_key="XXXXXXXXXXKEY"
aws_secret_key="YYYYYYYYYYYYYYYYYYYYYYYYYYSECRET"
instance_types= ['p2.8xlarge']
os_types= ['Linux/UNIX'] # Windows, SUSE Linux...
regions = ['ap-south-1', 'eu-west-2', 'eu-west-1', 'ap-northeast-2', 'ap-northeast-1', 'sa-east-1', 'ca-central-1', 'ap-southeast-1', 'ap-southeast-2', 'eu-central-1', 'us-east-1', 'us-east-2', 'us-west-1', 'us-west-2', ]
history_time = (datetime.now(timezone.utc) + timedelta(hours=-24))
price_list =[]
tmp_list=[]
tmp_list2=[]

## search the price histories and filter the latest price
for re in regions:
    print("Seaching " + re)
    boto3_session = boto3.session.Session(aws_access_key_id=aws_key,
                                        aws_secret_access_key=aws_secret_key,
                                        region_name=re)
    ec2 = boto3_session.client('ec2')
    spot_price_history = ec2.describe_spot_price_history(
        InstanceTypes=instance_types,
        ProductDescriptions=os_types,
        StartTime=history_time.isoformat()
    )
    appended_list = []
    for h in spot_price_history.get('SpotPriceHistory'):
        tmp_list2=[]
        for h2 in spot_price_history.get('SpotPriceHistory'):
            if h2['AvailabilityZone'] in appended_list:
                pass
            elif h['AvailabilityZone'] == h2['AvailabilityZone']:
                tmp_list2.append(h2)
                tmp = h2
        if len(tmp_list2) > 0:
            appended_list.append(tmp['AvailabilityZone'])
            price_list.append(max(tmp_list2, key=(lambda x :x['Timestamp'])))

print("\n" + str(instance_types)+ "\n-------------------------------\n"+"The availability zone with the most lowest price at all AWS data centers is..." )
print(min(price_list, key=(lambda x :x['SpotPrice'])))
print("\n")

このように動作します.

$ python3 main.py
Seaching ap-south-1
Seaching eu-west-2
Seaching eu-west-1
Seaching ap-northeast-2
Seaching ap-northeast-1
Seaching sa-east-1
Seaching ca-central-1
Seaching ap-southeast-1
Seaching ap-southeast-2
Seaching eu-central-1
Seaching us-east-1
Seaching us-east-2
Seaching us-west-1
Seaching us-west-2

['p2.8xlarge']
-------------------------------
The availability zone with the most lowest price at all AWS data centers is...
{'AvailabilityZone': 'ap-northeast-2c', 'InstanceType': 'p2.8xlarge', 'ProductDescription': 'Linux/UNIX', 'SpotPrice': '10.400600', 'Timestamp': datetime.datetime(2017, 12, 5, 1, 49, 31, tzinfo=tzutc())}

p2.8xlarge ソウルのデータセンターが最も安いようですね.

AWSのAPIキーが必要です.APIキーはIAMで作ることが出来ます.

https://console.aws.amazon.com/iam/home

EC2のスポットインスタンスの価格取得が可能なロールを設定してください.

  • aws_key にAWSのAPIキーを入れてください
  • aws_secret_keyはAWS APIキーのシークレットの方を
  • instance_typesは検索したいインスタンスタイプ1種類
    • c4.xlarge
    • p2.2xlarge
    • r4.8xlarge
    • ti.micro
    • などなど.
  • os_types= [‘Linux/UNIX’]
    • Windows
    • SUSE Linux
    • などなど

パラメータの詳しい種類などはここを参照

http://docs.aws.amazon.com/cli/latest/reference/ec2/describe-spot-price-history.html