Skip to content

Instantly share code, notes, and snippets.

@shinsaka
Last active September 17, 2019 04:14
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save shinsaka/e4e90a5db60d0f94443f to your computer and use it in GitHub Desktop.
Save shinsaka/e4e90a5db60d0f94443f to your computer and use it in GitHub Desktop.
AWS RDS RI pricing parser
#!/usr/bin/env ruby
require 'json'
def parse(uri)
JSON.parse `curl -s #{uri}`.gsub(/\/\*(?:(?!\*\/).)*\*\//m, '').strip.gsub(/^callback\(/, '').gsub(/\);/, '').gsub(/([a-zA-Z]+[0-9]*):/, '"\1":')
end
puts %w(
platform
region
type
term
purchase_option
savingsOverOD
upfront
monthlyStar
effectiveHourly
onDemandHourlyPrice
).join("\t")
sources = {
# "aurora.multi" => "https://a0.awsstatic.com/pricing/1/rds/reserved-instances/aurora-multiAZ.min.js",
"aurora.multi.1" => "https://a0.awsstatic.com/pricing/1/rds/reserved-instances/aurora-standard.min.js",
"mariadb.multi" => "https://a0.awsstatic.com/pricing/1/rds/reserved-instances/mariadb-multiAZ.min.js",
"mariadb.single" => "https://a0.awsstatic.com/pricing/1/rds/reserved-instances/mariadb-standard.min.js",
"mysql.multi" => "https://a0.awsstatic.com/pricing/1/rds/reserved-instances/mysql-multiAZ.min.js",
"mysql.multi.1" => "https://a0.awsstatic.com/pricing/1/rds/previous-generation/reserved-instances/mysql-multiAZ.min.js",
"mysql.single" => "https://a0.awsstatic.com/pricing/1/rds/reserved-instances/mysql-standard.min.js",
"mysql.single.1" => "https://a0.awsstatic.com/pricing/1/rds/previous-generation/reserved-instances/mysql-standard.min.js",
"oracle-se1-li.multi" => "https://a0.awsstatic.com/pricing/1/rds/reserved-instances/oracle-se1-license-included-multiAZ.min.js",
"oracle-se1-li.multi.1" => "https://a0.awsstatic.com/pricing/1/rds/previous-generation/reserved-instances/oracle-se1-license-included-multiAZ.min.js",
"oracle-se1-li.single" => "https://a0.awsstatic.com/pricing/1/rds/reserved-instances/oracle-se1-license-included-standard.min.js",
"oracle-se1-li.single.1" => "https://a0.awsstatic.com/pricing/1/rds/previous-generation/reserved-instances/oracle-se1-license-included-standard.min.js",
"oracle-se1-byol.multi" => "https://a0.awsstatic.com/pricing/1/rds/reserved-instances/oracle-se1-byol-multiAZ.min.js",
"oracle-se1-byol.multi.1" => "https://a0.awsstatic.com/pricing/1/rds/previous-generation/reserved-instances/oracle-se1-byol-multiAZ.min.js",
"oracle-se1-byol.single" => "https://a0.awsstatic.com/pricing/1/rds/reserved-instances/oracle-se1-byol-standard.min.js",
"oracle-se1-byol.single.1" => "https://a0.awsstatic.com/pricing/1/rds/previous-generation/reserved-instances/oracle-se1-byol-standard.min.js",
"oracle-se2-li.multi" => "https://a0.awsstatic.com/pricing/1/rds/reserved-instances/oracle-se2-license-included-multiAZ.min.js",
"oracle-se2-li.single" => "https://a0.awsstatic.com/pricing/1/rds/reserved-instances/oracle-se2-license-included-standard.min.js",
"oracle-se2-byol.multi" => "https://a0.awsstatic.com/pricing/1/rds/reserved-instances/oracle-se2-byol-multiAZ.min.js",
"oracle-se2-byol.single" => "https://a0.awsstatic.com/pricing/1/rds/reserved-instances/oracle-se2-byol-standard.min.js",
"oracle-se-byol.multi" => "https://a0.awsstatic.com/pricing/1/rds/reserved-instances/oracle-se-byol-multiAZ.min.js",
"oracle-se-byol.single" => "https://a0.awsstatic.com/pricing/1/rds/reserved-instances/oracle-se-byol-standard.min.js",
"oracle-ee-byol.multi" => "https://a0.awsstatic.com/pricing/1/rds/reserved-instances/oracle-ee-byol-multiAZ.min.js",
"oracle-ee-byol.single" => "https://a0.awsstatic.com/pricing/1/rds/reserved-instances/oracle-ee-byol-standard.min.js",
"postgresql.multi" => "https://a0.awsstatic.com/pricing/1/rds/reserved-instances/postgresql-multiAZ.min.js",
"postgresql.multi.1" => "https://a0.awsstatic.com/pricing/1/rds/previous-generation/reserved-instances/postgresql-multiAZ.min.js",
"postgresql.single" => "https://a0.awsstatic.com/pricing/1/rds/reserved-instances/postgresql-standard.min.js",
"postgresql.single.1" => "https://a0.awsstatic.com/pricing/1/rds/previous-generation/reserved-instances/postgresql-standard.min.js",
"sql-server-ee-byol.multi" => "https://a0.awsstatic.com/pricing/1/rds/reserved-instances/sql-server-ee-byol-multiAZ.min.js",
"sql-server-ee-byol.single" => "https://a0.awsstatic.com/pricing/1/rds/reserved-instances/sql-server-ee-byol-standard.min.js",
"sql-server-ee-li.multi" => "https://a0.awsstatic.com/pricing/1/rds/reserved-instances/sql-server-ee-license-included-multiAZ.min.js",
"sql-server-ee-li.single" => "https://a0.awsstatic.com/pricing/1/rds/reserved-instances/sql-server-ee-license-included-standard.min.js",
"sql-server-se-li.multi" => "https://a0.awsstatic.com/pricing/1/rds/reserved-instances/sql-server-se-license-included-multiAZ.min.js",
"sql-server-se-li.multi.1" => "https://a0.awsstatic.com/pricing/1/rds/previous-generation/reserved-instances/sql-server-se-license-included-multiAZ.min.js",
"sql-server-se-li.single" => "https://a0.awsstatic.com/pricing/1/rds/reserved-instances/sql-server-se-license-included-standard.min.js",
"sql-server-se-li.single.1" => "https://a0.awsstatic.com/pricing/1/rds/previous-generation/reserved-instances/sql-server-se-license-included-standard.min.js",
"sql-server-se-byol.multi" => "https://a0.awsstatic.com/pricing/1/rds/reserved-instances/sql-server-se-byol-multiAZ.min.js",
"sql-server-se-byol.single" => "https://a0.awsstatic.com/pricing/1/rds/reserved-instances/sql-server-se-byol-standard.min.js",
"sql-server-web-li.single" => "https://a0.awsstatic.com/pricing/1/rds/reserved-instances/sql-server-web-license-included-standard.min.js",
"sql-server-web-li.single.1" => "https://a0.awsstatic.com/pricing/1/rds/previous-generation/reserved-instances/sql-server-web-license-included-standard.min.js",
"sql-server-ex-li.single" => "https://a0.awsstatic.com/pricing/1/rds/reserved-instances/sql-server-express-license-included-standard.min.js",
}
sources.each do |platform, uri|
table = parse(uri)
table['config']['regions'].each do |region_table|
current_region = region_table["region"]
region_table["instanceTypes"].each do |type_group|
current_type = type_group['type']
type_group["terms"].each do |type_table|
on_demand_price = ""
type_table["onDemandHourly"].each do |on_demand|
on_demand_price = on_demand["prices"]["USD"]
end
current_term = type_table["term"]
type_table['purchaseOptions'].each do |options|
purchase_option = options['purchaseOption']
savings_over_od = options['savingsOverOD']
upfront = options['valueColumns'].find{|x| x["name"] == "upfront"}["prices"]["USD"]
monthly_star = options['valueColumns'].find{|x| x["name"] == "monthlyStar"}["prices"]["USD"]
effectiveHourly = options['valueColumns'].find{|x| x["name"] == "effectiveHourly"}["prices"]["USD"]
puts [platform.gsub(/\.\d+$/, ""), current_region, current_type, current_term, purchase_option, savings_over_od, upfront, monthly_star, effectiveHourly, on_demand_price].join("\t")
end
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment