okochangの馬鹿でありがとう

ふらふら適当に世間を生きる日々でございます

スポットインスタンスの価格を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や監視サーバにデータを入れると閾値を設定して何かしらのアクションを実行しやすくなりますね。