aws-sdk-coreを利用してSpot Instanceの価格履歴を取れるだけ取ってみる。
とれるだけといいつつ、AWSコンソール上でSpot Instanceの価格履歴を見る場合3ヶ月前までしかみれないので、その程度までなら取れるかなと予想しつつ…
とりあえずコード(詳細はコメント)
SDKで利用してるのはスポットインスタンスの履歴取得の部分だけ
spot.rb
#! /usr/bin/env ruby
require 'aws-sdk-core'
require 'date'
# リージョンを東京に指定
Aws.config[:region] = 'ap-northeast-1'
EC2 = Aws::EC2::Client.new
historys = []
token = ''
# Linux/UNIXのVPCだけを対象
products = ['Linux/UNIX (Amazon VPC)']
while true do
# Spot Instanceの課金履歴を取得して結果を格納
response = EC2.describe_spot_price_history(
max_results:1000, # 最大1000件まで取得
instance_types:["m1.medium"], # |(パイプ)でつないだりすると取得する対象が増える
filters:[{name:'product-description',values:products}], # LinuxやらWindowsやらSuseやら指定
next_token:token
# 1000件で取りきれなかった場合トークンが返ってくる。
# トークンを一緒につけてリクエストし直すと続きから返ってくる。
# すべて返しきったらトークンがなくなる。
)
# 取得した履歴を格納
historys.concat(response[:spot_price_history])
# トークンを格納
token = response[:next_token]
break if token == '' # トークンが空の場合終了
end
# タイムスタンプでソート
historys = historys.sort_by{|val| val[:timestamp]}
# 履歴の件数と、最新の履歴と最古の履歴の出力
puts historys.size
puts historys[0][:timestamp]
puts historys[-1][:timestamp]
とりあえず実行してみた
$ ruby spot.rb
1409
2014-08-14 23:11:42 UTC
2014-10-14 11:24:23 UTC
約1400件の履歴を取得、最低でも2回はループが回ったはず、
しかし2ヶ月分しか取れてない。
今度は取得期間を指定してみる。
追加分
require 'date'
# Startに今から5ヶ月前の日時を、Endに今の日時を格納
Now = DateTime.now
Start = Now << 5
End = Now
変更分
response = EC2.describe_spot_price_history(
start_time:Start, # 5ヶ月前の日時を指定
end_time:End, # 今の日時を指定
max_results:1000, # 最大1000件まで取得可能?
instance_types:["m1.medium"], # |(パイプ)でつないだりすると取得する対象が
filters:[{name:'product-description',values:products}], # LinuxやらWindowsやらSuseやら指定
next_token:token
# 1000件で取りきれなかった場合トークンが返ってくる。
# トークンを一緒につけてリクエストし直すと続きから返ってくる。
# すべて返しきったらトークンがなくなる。
)
再度実行してみる。
$ ruby spot.rb
1499
2014-07-15 22:38:53 UTC
2014-10-14 11:24:23 UTC
再度実行した所取得件数は増えました。
しかし5ヶ月前から取得するようにしていたが、3ヶ月分しか取得できなかった。
なので、当初の予想どおりっちゃ予想通り。
とりあえずこれでSpot Instanceの履歴を取れるだけ撮れるようになったのかなと思います。
あとはフィルターの値を変更すれば応用は利くかと…
また、出力をうまいことして、Rなどで整形すればSpot Instanceの価格変動の様子とか結果的に一番お得なインスタンスとかみれるかもしれませんかね?
その辺りはまたやっていこうかと…
以上!