スポットインスタンスの価格をCloudWatchに投入するスクリプト
スポットインスタンスを使っていると、自分が使っているインスタンスタイプが現在どれくらいの価格となっているか気になると思います。
スポットインスタンスの価格変動はPricing Historyから簡単に確認する事が出来るのですが、もう少し使いやすくならないかなと思いました。
というわけで以下のようなスクリプトを作ってみました。
スポットインスタンスに配置して、自分自身のインスタンスタイプやアベイラビリティゾーンから現在の価格データをCloudWatchに入れていきます。
※cronとかで定期的に実行させて下さい。
スクリプト
Amazon Linuxでしかテストしてねーですー( ꒪⌓꒪)
# -*- coding: utf-8 -*- require 'net/http' require 'aws-sdk' ec2_region = 'ec2.' + Net::HTTP.get('169.254.169.254', '/latest/meta-data/placement/availability-zone').chop + '.amazonaws.com' cw_region = 'monitoring.' + Net::HTTP.get('169.254.169.254', '/latest/meta-data/placement/availability-zone').chop + '.amazonaws.com' instance_id = Net::HTTP.get('169.254.169.254', '/latest/meta-data/instance-id') instance_type = Net::HTTP.get('169.254.169.254', '/latest/meta-data/instance-type') az = Net::HTTP.get('169.254.169.254', '/latest/meta-data/placement/availability-zone') @ec2 = AWS::EC2.new( :ec2_endpoint => ec2_region ).client @cw = AWS::CloudWatch.new( :cloud_watch_endpoint => cw_region ).client spot_instance_request_id = @ec2.describe_instances(:instance_ids => [instance_id])[:reservation_set][0][:instances_set][0][:spot_instance_request_id] product_description = @ec2.describe_spot_instance_requests(:spot_instance_request_ids => [spot_instance_request_id])[:spot_instance_request_set][0][:product_description] price = @ec2.describe_spot_price_history( :instance_types => [instance_type], :product_descriptions => [product_description], :availability_zone => az, :max_results => 1 )[:spot_price_history_set][0][:spot_price] data = @cw.put_metric_data( :namespace => 'AWS/EC2', :metric_data => [{:metric_name => 'SpotInstancePricing', :dimensions => [{:name => 'InstanceId', :value => instance_id}], :value => price, :unit => 'Count'}] ) puts price
まとめ
今回はCloudWatchにデータを入れましたが、CloudWatchや監視サーバにデータを入れると閾値を設定して何かしらのアクションを実行しやすくなりますね。