0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

現在のインスタンス料金を取得する script: EC2 編

Last updated at Posted at 2017-08-22

http://qiita.com/bells17/items/5326d11edc6acc4feea2
の EC2 版です

注意点として OS を Linux、 tenancy を Shared に絞っています

ec2.rb
require 'json'
require 'bigdecimal'

results = {}
json_data = open(ARGV[0]) {|io| JSON.load(io) }

# product 情報を取得
json_data['products'].keys.each do |skuNo|
	product = json_data['products'][skuNo]

	if (product['productFamily'] == 'Compute Instance' and
		  product['attributes']['locationType'] == 'AWS Region' and
		  product['attributes']['location'] == 'Asia Pacific (Tokyo)' and
		  product['attributes']['operatingSystem'] == 'Linux' and
		  product['attributes']['tenancy'] == 'Shared')

		results[product['sku']] = {
			sku: product['sku'],
			location: product['attributes']['location'],
			instanceType: product['attributes']['instanceType'],
			instanceTypePrefix: product['attributes']['instanceType'].split('.')[0],
			instanceFamily: product['attributes']['instanceFamily'],
			vcpu: product['attributes']['vcpu'],
			memory: product['attributes']['memory'],
			storage: product['attributes']['storage'],
			clockSpeed: product['attributes']['clockSpeed'],
			networkPerformance: product['attributes']['networkPerformance'],
			ecu: product['attributes']['ecu'],
			currentGeneration: product['attributes']['currentGeneration'],
			price_unit: 'USD'
		}

	end
end


# price

## on demand
json_data['terms']['OnDemand'].keys.each do |skuNo|
	if (results[skuNo])
		results[skuNo][:price_per_hour] = Proc.new {
			skuTerm = json_data['terms']['OnDemand'][skuNo][json_data['terms']['OnDemand'][skuNo].keys[0]]
			priceInfo = skuTerm['priceDimensions'][skuTerm['priceDimensions'].keys[0]]
			sprintf('%.3f', BigDecimal(priceInfo['pricePerUnit']['USD']).floor(3).to_f.to_s)
		}.call
		results[skuNo][:price_per_day] = sprintf('%.3f', (BigDecimal(results[skuNo][:price_per_hour]) * BigDecimal("24")).floor(3).to_f.to_s)
		results[skuNo][:price_per_month] = sprintf('%.3f', (BigDecimal(results[skuNo][:price_per_day]) * BigDecimal("30")).floor(3).to_f.to_s)
	end
end

## reserved 
json_data['terms']['Reserved'].keys.each do |skuNo|
	if (results[skuNo])

		plans = json_data['terms']['Reserved'][skuNo].values.select do |plan|
			plan['termAttributes']['PurchaseOption'] == "All Upfront" # "All Upfront" のものだけ取得したい
		end

		results[skuNo][:price_reserved_1year_purchased_all_upfront] = sprintf('%.3f', plans.find { |plan|
			plan['termAttributes']['LeaseContractLength'] == '1yr'
		}['priceDimensions'].values.find {|priceDimension|
			priceDimension['description'] == "Upfront Fee"
		}['pricePerUnit']['USD'])

		results[skuNo][:price_reserved_3year_purchased_all_upfront] = sprintf('%.3f', plans.find { |plan|
			plan['termAttributes']['LeaseContractLength'] == '3yr'
		}['priceDimensions'].values.find {|priceDimension|
			priceDimension['description'] == "Upfront Fee"
		}['pricePerUnit']['USD'])

	end
end


# sort
sorted_result = {}
results.values.each do |row|
	sorted_result[row[:currentGeneration]] ||= {}
	sorted_result[row[:currentGeneration]][row[:instanceFamily]] ||= {}
	sorted_result[row[:currentGeneration]][row[:instanceFamily]][row[:instanceTypePrefix]] ||= []
	sorted_result[row[:currentGeneration]][row[:instanceFamily]][row[:instanceTypePrefix]].push row
end

results = []
['Yes', 'No'].each do |currentGeneration| # 現行世代のものから並べる
	sorted_result[currentGeneration].keys.sort.each do |instanceFamily| # インスタンスファミリー毎に並べる
		sorted_result[currentGeneration][instanceFamily].keys.sort.each do |instanceTypePrefix|
			results.concat sorted_result[currentGeneration][instanceFamily][instanceTypePrefix].sort_by { |row| row[:price_per_hour] }
		end
	end
end

p results.to_json

上記を保存して以下のように実行する

curl https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonEC2/current/index.json > price-AmazonEC2.json
ruby ec2.rb price-AmazonEC2.json | sed -e s/^\"// | sed -e s/\"$// | sed -e 's/\\"/"/g' | jq .

以下のような感じで結果が取れる

[
  {
    "sku": "Q4QTSF7H37JFW9ER",
    "location": "Asia Pacific (Tokyo)",
    "instanceType": "c3.large",
    "instanceTypePrefix": "c3",
    "instanceFamily": "Compute optimized",
    "vcpu": "2",
    "memory": "3.75 GiB",
    "storage": "2 x 16 SSD",
    "clockSpeed": "2.8 GHz",
    "networkPerformance": "Moderate",
    "ecu": "7",
    "currentGeneration": "Yes",
    "price_unit": "USD",
    "price_per_hour": "0.128",
    "price_per_day": "3.072",
    "price_per_month": "92.160",
    "price_reserved_1year_purchased_all_upfront": "753.000",
    "price_reserved_3year_purchased_all_upfront": "1528.000"
  },
  {
    "sku": "HTNXMK8Z5YHMU737",
    "location": "Asia Pacific (Tokyo)",
    "instanceType": "c3.xlarge",
    "instanceTypePrefix": "c3",
    "instanceFamily": "Compute optimized",
    "vcpu": "4",
    "memory": "7.5 GiB",
    "storage": "2 x 40 SSD",
    "clockSpeed": "2.8 GHz",
    "networkPerformance": "Moderate",
    "ecu": "14",
    "currentGeneration": "Yes",
    "price_unit": "USD",
    "price_per_hour": "0.255",
    "price_per_day": "6.120",
    "price_per_month": "183.600",
    "price_reserved_1year_purchased_all_upfront": "1505.000",
    "price_reserved_3year_purchased_all_upfront": "3032.000"
  },
  {
    "sku": "YR67H6NVBRN37HRZ",
    "location": "Asia Pacific (Tokyo)",
    "instanceType": "c3.2xlarge",
    "instanceTypePrefix": "c3",
    "instanceFamily": "Compute optimized",
    "vcpu": "8",
    "memory": "15 GiB",
    "storage": "2 x 80 SSD",
    "clockSpeed": "2.8 GHz",
    "networkPerformance": "High",
    "ecu": "28",
    "currentGeneration": "Yes",
    "price_unit": "USD",
    "price_per_hour": "0.511",
    "price_per_day": "12.264",
    "price_per_month": "367.920",
    "price_reserved_1year_purchased_all_upfront": "3012.000",
    "price_reserved_3year_purchased_all_upfront": "8132.000"
  },
...
]
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?