首页 > 解决方案 > Ruby:如何估算每小时的 ec2 成本?

问题描述

我希望能够使用Aws::Pricing::Client或 ruby​​ aws-sdk gem 中的其他模块来估计我的 aws 帐户中特定 ec2 实例的每小时成本。

但是,我确实发现文档有点混乱,并且可以使用一些帮助来找到如何使用这个模块的好例子。例如,我如何能够使用它来查找大小为m3.medium、 in us-east-150 gb gp2卷的 ec2 实例的成本?

更好的是,是否有一种方法可以让我为某些 aws-sdk 模块提供实例 ID 或名称并接收该实例每小时成本的估计值?

标签: rubyamazon-web-servicesamazon-ec2aws-sdk

解决方案


不幸的是,似乎没有aws-sdk可用于访问所有区域的 ec2 和 ebs 成本的直接模块。但是, AWS 定价 API似乎是最接近所有 AWS 区域的两种资源成本的解决方案。

可以在这篇文章中找到有关此 API 的更多详细信息:以编程方式获取 ec2 定价?

该 api 生成 jsonp 文件。为了使这在 ruby​​ 中易于访问,我建议查看这篇文章,该文章直接使用定价 API 中的示例:Ruby : How to parse a jsonp and save json data to database

公平警告,您需要大量解析才能访问任何信息。例如,此解决方案将提供一个哈希,其中包含一个t2.medium实例的定价数据us-west-2

#!/usr/bin/env ruby

require 'net/http'
require 'json'

ec2_linux_price = JSON.parse(
  Net::HTTP.get(
    URI.parse('http://a0.awsstatic.com/pricing/1/ec2/linux-od.min.js')
  ).split('callback(')[1].sub(');', '').gsub(/(\w+):/, '"\1":')
)

region_prices = ec2_linux_price["config"]["regions"].select{|region| 
  region["region"]=="us-west-2"
}[0]["instanceTypes"].map{|types| 
  types["sizes"]
}

cost_hash={}
region_prices.each do |size_range| 
  cost = size_range.select{|size| 
    size["size"]==instance[:instance_type]
  }[0]
  unless cost.nil?
    cost_hash["t2.medium"] = cost["valueColumns"][0]["prices"]["USD"]
  end
end

p cost_hash

推荐阅读