开发者

get ec2 pricing programmatically?

Is there a way to get AWS pricing programmatically (cost per hour of each instance type, cost per GB/month of storage on S3, and etc)?

Also, are there cost monitoring tools? For example, is there a tool that can report your EC2 ins开发者_如何学Pythontance usage on an hourly basis (versus a monthly basis, which is what Amazon does)?

Thanks in advance.


UPDATE:

There is now AWS pricing API: https://aws.amazon.com/blogs/aws/new-aws-price-list-api/

Orginal answer:

The price lists are available in form of JSONP files (you need to strip off function call) which are used by the AWS pricing pages. Each table (and each tab for table) has separate JSON file. It is not an API maybe, but definitely computer digestible. Here is a list that supports EC2 pricing page (as of 17 December 2014):

  • On-demand Linux: http://a0.awsstatic.com/pricing/1/ec2/linux-od.min.js
  • On-demand RedHat: http://a0.awsstatic.com/pricing/1/ec2/rhel-od.min.js
  • On-demand SUSE: http://a0.awsstatic.com/pricing/1/ec2/sles-od.min.js
  • On-demand Windows: http://a0.awsstatic.com/pricing/1/ec2/mswin-od.min.js
  • On-demand SQL Standard: http://a0.awsstatic.com/pricing/1/ec2/mswinSQL-od.min.js
  • On-demand SQL Web: http://a0.awsstatic.com/pricing/1/ec2/mswinSQLWeb-od.min.js
  • Reserved Linux: http://a0.awsstatic.com/pricing/1/ec2/ri-v2/linux-unix-shared.min.js
  • Reserved RedHat: http://a0.awsstatic.com/pricing/1/ec2/ri-v2/red-hat-enterprise-linux-shared.min.js
  • Reserved SUSE: http://a0.awsstatic.com/pricing/1/ec2/ri-v2/suse-linux-shared.min.js
  • Reserved Windows: http://a0.awsstatic.com/pricing/1/ec2/ri-v2/windows-shared.min.js
  • Reserved SQL Standard: http://a0.awsstatic.com/pricing/1/ec2/ri-v2/windows-with-sql-server-standard-shared.min.js
  • Reserved SQL Web: http://a0.awsstatic.com/pricing/1/ec2/ri-v2/windows-with-sql-server-web-shared.min.js
  • Reserved Spot instances: http://spot-price.s3.amazonaws.com/spot.js
  • Data transfer: http://a0.awsstatic.com/pricing/1/ec2/pricing-data-transfer-with-regions.min.js
  • EBS optimized: http://a0.awsstatic.com/pricing/1/ec2/pricing-ebs-optimized-instances.min.js
  • EBS: http://a0.awsstatic.com/pricing/1/ebs/pricing-ebs.min.js
  • Elastic IP: http://a0.awsstatic.com/pricing/1/ec2/pricing-elastic-ips.min.js
  • CloudWatch: http://a0.awsstatic.com/pricing/1/cloudwatch/pricing-cloudwatch.min.js
  • ELB: http://a0.awsstatic.com/pricing/1/ec2/pricing-elb.min.js
  • EMR: https://a0.awsstatic.com/pricing/1/emr/pricing-emr.min.js

WARNING: The endpoints change from time to time and often old URL is still there with old values. It is best to check what is the current status rather than relying on links provided in this thread.

So, here is a short command to get current set or URLs from any AWS pricing page. Example based on EC2. Run it on Linux or Cygwin. Actually this command was used to create the list above.

curl http://aws.amazon.com/ec2/pricing/ 2>/dev/null | grep 'model:' | sed -e "s/.*'\(.*\)'.*/http:\\1/"

For those who don't like command line, you can also check in a web browser network console (you get there with F12), filter with JS objects:

get ec2 pricing programmatically?


Just to let you know that they seem to have changed the JSON addresses. It includes the new C3 instance types

Update 01/21/2014: addresses changed again. Please note that these are JS files with a callback function that should be removed so that it becomes a parsable JSON.

Update 09/21/2014: addresses changed once again and include the new T2 instace types. To be treated as JSON files, the initial comments and the callback function should be removed and the keys should be wrapped in double quotes.

On Demand

  • Linux: http://a0.awsstatic.com/pricing/1/ec2/linux-od.min.js
  • Windows: http://a0.awsstatic.com/pricing/1/ec2/mswin-od.min.js
  • RHEL: http://a0.awsstatic.com/pricing/1/ec2/rhel-od.min.js
  • SLES: http://a0.awsstatic.com/pricing/1/ec2/sles-od.min.js
  • Windows w/ SQL Std: http://a0.awsstatic.com/pricing/1/ec2/mswinSQL-od.min.js
  • Windows w/ SQL Web: http://a0.awsstatic.com/pricing/1/ec2/mswinSQLWeb-od.min.js

Reserved Light

  • Linux: http://a0.awsstatic.com/pricing/1/ec2/linux-ri-light.min.js
  • Windows: http://a0.awsstatic.com/pricing/1/ec2/mswin-ri-light.min.js
  • RHEL: http://a0.awsstatic.com/pricing/1/ec2/rhel-ri-light.min.js
  • SLES: http://a0.awsstatic.com/pricing/1/ec2/sles-ri-light.min.js
  • Windows w/ SQL Std: http://a0.awsstatic.com/pricing/1/ec2/mswinSQL-ri-light.min.js
  • Windows w/ SQL Web: http://a0.awsstatic.com/pricing/1/ec2/mswinSQLWeb-ri-light.min.js

Reserved Medium

  • Linux: http://a0.awsstatic.com/pricing/1/ec2/linux-ri-medium.min.js
  • Windows: http://a0.awsstatic.com/pricing/1/ec2/mswin-ri-medium.min.js
  • RHEL: http://a0.awsstatic.com/pricing/1/ec2/rhel-ri-medium.min.js
  • SLES: http://a0.awsstatic.com/pricing/1/ec2/sles-ri-medium.min.js
  • Windows w/ SQL Std: http://a0.awsstatic.com/pricing/1/ec2/mswinSQL-ri-medium.min.js
  • Windows w/ SQL Web: http://a0.awsstatic.com/pricing/1/ec2/mswinSQLWeb-ri-medium.min.js

Reserved Heavy

  • Linux: http://a0.awsstatic.com/pricing/1/ec2/linux-ri-heavy.min.js
  • Windows: http://a0.awsstatic.com/pricing/1/ec2/mswin-ri-heavy.min.js
  • RHEL: http://a0.awsstatic.com/pricing/1/ec2/rhel-ri-heavy.min.js
  • SLES: http://a0.awsstatic.com/pricing/1/ec2/sles-ri-heavy.min.js
  • Windows w/ SQL Std: http://a0.awsstatic.com/pricing/1/ec2/mswinSQL-ri-heavy.min.js
  • Windows w/ SQL Web: http://a0.awsstatic.com/pricing/1/ec2/mswinSQLWeb-ri-heavy.min.js

Other

  • Spot Instances: http://spot-price.s3.amazonaws.com/spot.js
  • Data Transfer: http://a0.awsstatic.com/pricing/1/ec2/pricing-data-transfer-with-regions.min.js
  • EBS-Optimized Instances Surcharge: http://a0.awsstatic.com/pricing/1/ec2/pricing-ebs-optimized-instances.min.js
  • EBS: http://a0.awsstatic.com/pricing/1/ec2/pricing-ebs.min.js
  • Elastic IP: http://a0.awsstatic.com/pricing/1/ec2/pricing-elastic-ips.min.js
  • CloudWatch: http://a0.awsstatic.com/pricing/1/ec2/pricing-cloudwatch.min.js
  • ELB: http://a0.awsstatic.com/pricing/1/ec2/pricing-elb.min.js

Previous endpoint: http://aws-assets-pricing-prod.s3.amazonaws.com/pricing/ec2/linux-od.js


using the aws cli (in the examples below, I have also included how the same thing can be executed using jq)

to get a list of service codes:

aws pricing describe-services --region us-east-1

to get a list of service codes (with jq):

aws pricing describe-services --region us-east-1 | jq -r '.Services[] | .ServiceCode'

which will return values like:

AmazonEC2
AmazonS3
AmazonRoute53
[...]



to get a list of attributes for a given service code:

aws pricing describe-services --service-code AmazonEC2 --region us-east-1

to get a list of attributes for a given service code (with jq):

aws pricing describe-services --service-code AmazonEC2 --region us-east-1 | jq -r '.Services[] | .AttributeNames[]'

which will return values like:

instancesku
location
memory
vcpu
volumeType
[...]



to get pricing info now that you have a service code and attribute:

(this will take a while since it is every sku for the service code, so I will show examples using filtering further down)

aws pricing get-products --service-code AmazonEC2 --region us-east-1

to get pricing info now that you have a service code and attribute using a filter on instanceType and another for location:

aws pricing get-products --service-code AmazonEC2 --filters "Type=TERM_MATCH,Field=instanceType,Value=m5.xlarge" "Type=TERM_MATCH,Field=location,Value=US East (N. Virginia)" --region us-east-1

to get pricing info now that you have a service code and attribute using a filter on instanceType and another for location (with jq):

aws pricing get-products --service-code AmazonEC2 --filters "Type=TERM_MATCH,Field=instanceType,Value=m5.xlarge" "Type=TERM_MATCH,Field=location,Value=US East (N. Virginia)" --region us-east-1 | jq -rc '.PriceList[]' | jq -r '[ .product.attributes.servicecode, .product.attributes.location, .product.attributes.instancesku?, .product.attributes.instanceType, .product.attributes.usagetype, .product.attributes.operatingSystem, .product.attributes.memory, .product.attributes.physicalProcessor, .product.attributes.processorArchitecture, .product.attributes.vcpu, .product.attributes.currentGeneration, .terms.OnDemand[].priceDimensions[].unit, .terms.OnDemand[].priceDimensions[].pricePerUnit.USD, .terms.OnDemand[].priceDimensions[].description] | @csv'

which will return values like:

"AmazonEC2","US East (N. Virginia)","EWZRARGKPMTYQJFP","m5.xlarge","UnusedDed:m5.xlarge","Linux","16 GiB","Intel Xeon Platinum 8175 (Skylake)","64-bit","4","Yes","Hrs","0.6840000000","$0.684 per Dedicated Unused Reservation Linux with SQL Std m5.xlarge Instance Hour"
[...]


In addition to @arturhoo's answer which provides the EC2 spots

You can obtain the historic prices with the CLI tool

aws ec2 describe-spot-price-history \
    --instance-types m1.xlarge \
    --product-description "Linux/UNIX (Amazon VPC)" \
    --start-time 2016-10-31T03:00:00 \
    --end-time 2016-10-31T03:16:00 \
    --query 'SpotPriceHistory[*].[Timestamp,SpotPrice]'

which takes the spot price between 3:00am and 3:16am Monday 31st October 2016 (UTC)

[
    [
        "2016-10-31T03:06:12.000Z", 
        "0.041500"
    ], 
    [
        "2016-10-31T03:00:26.000Z", 
        "0.041600"
    ], 
    [
        "2016-10-31T02:59:14.000Z", 
        "0.041500"
    ], 
    [
        "2016-10-31T02:00:18.000Z", 
        "0.040600"
    ], 
    [
        "2016-10-30T23:55:06.000Z", 
        "0.043200"
    ]
]


Beside the official AWS JSON endpoint, https://ec2.shop is also an option. It respond both to json and text based(so you can use grep, awk etc).

curl -L 'ec2.shop?filter=.large'
Instance Type    Memory             vCPUs  Storage               Network             Price       Monthly     Spot Price
m6g.large        8 GiB            2 vCPUs  EBS only              Up to 10 Gigabit    0.0770      56.210      0.0357
t3.large         8 GiB            2 vCPUs  EBS only              Up to 5 Gigabit     0.0832      60.736      0.0250
m5a.large        8 GiB            2 vCPUs  EBS only              Up to 10 Gigabit    0.0860      62.780      0.0345
i3en.large       16 GiB           2 vCPUs  1 x 1250 NVMe SSD     Up to 25 Gigabit    0.2260      164.980     0.0678
r4.large         15.25 GiB        2 vCPUs  EBS only              Up to 10 Gigabit    0.1330      97.090      0.0343
r5.large         16 GiB           2 vCPUs  EBS only              Up to 10 Gigabit    0.1260      91.980      0.0356
r5a.large        16 GiB           2 vCPUs  EBS only              10 Gigabit          0.1130      82.490      0.0356
r5dn.large       16 GiB           2 vCPUs  1 x 75 NVMe SSD       Up to 25 Gigabit    0.1670      121.910     0.0356
t3a.large        8 GiB            2 vCPUs  EBS only              Up to 5 Gigabit     0.0752      54.896      0.0226
m4.large         8 GiB            2 vCPUs  EBS only              Moderate            0.1000      73.000      0.0362
i3.large         15.25 GiB        2 vCPUs  1 x 475 NVMe SSD      Up to 10 Gigabit    0.1560      113.880     0.0468
m5dn.large       8 GiB            2 vCPUs  1 x 75 NVMe SSD       Up to 25 Gigabit    0.1360      99.280      0.0340
m5d.large        8 GiB            2 vCPUs  1 x 75 NVMe SSD       Up to 10 Gigabit    0.1130      82.490      0.0340
t2.large         8 GiB            2 vCPUs  EBS only              Low to Moderate     0.0928      67.744      0.0278
z1d.large        16 GiB           2 vCPUs  1 x 75 NVMe SSD       Up to 10 Gigabit    0.1860      135.780     0.0558
c5.large         4 GiB            2 vCPUs  EBS only              Up to 10 Gigabit    0.0850      62.050      0.0324
m5ad.large       8 GiB            2 vCPUs  1 x 75 NVMe SSD       Up to 10 Gigabit    0.1030      75.190      0.0345
r6g.large        16 GiB           2 vCPUs  EBS only              Up to 10 Gigabit    0.1008      73.584      0.0374
r5d.large        16 GiB           2 vCPUs  1 x 75 NVMe SSD       10 Gigabit          0.1440      105.120     0.0356
r5n.large        16 GiB           2 vCPUs  EBS only              Up to 25 Gigabit    0.1490      108.770     0.0356
r5ad.large       16 GiB           2 vCPUs  1 x 75 NVMe SSD       10 Gigabit          0.1310      95.630      0.0356
c6g.large        4 GiB            2 vCPUs  EBS only              Up to 10 Gigabit    0.0680      49.640      0.0340
m5n.large        8 GiB            2 vCPUs  EBS only              Up to 25 Gigabit    0.1190      86.870      0.0340
c4.large         3.75 GiB         2 vCPUs  EBS only              Moderate            0.1000      73.000      0.0308
c5a.large        4 GiB            2 vCPUs  EBS only              Up to 10 Gigabit    0.0770      56.210      0.0324
c5d.large        4 GiB            2 vCPUs  1 x 50 NVMe SSD       Up to 10 Gigabit    0.0960      70.080      0.0324
m5.large         8 GiB            2 vCPUs  EBS only              Up to 10 Gigabit    0.0960      70.080      0.0341
c5n.large        5.25 GiB         2 vCPUs  EBS only              Up to 25 Gigabit    0.1080      78.840      0.0326
a1.large         4 GiB            2 vCPUs  EBS only              Up to 10 Gigabit    0.0510      37.230      0.0227
c3.large         3.75 GiB         2 vCPUs  2 x 16 SSD            Moderate            0.1050      76.650      0.0294
r3.large         15.25 GiB        2 vCPUs  1 x 32 SSD            Moderate            0.1660      121.180     0.0323
m1.large         7.5 GiB          2 vCPUs  2 x 420 SSD           Moderate            0.1750      127.750     0.0175
m3.large         7.5 GiB          2 vCPUs  1 x 32 SSD            Moderate            0.1330      97.090      0.0308

Also JSON like this:

curl -sL 'ec2.shop?filter=m4' -H 'accept: json' | jq .
{
  "Prices": [
    {
      "InstanceType": "m4.16xlarge",
      "Memory": "256 GiB",
      "VCPUS": 64,
      "Storage": "EBS only",
      "Network": "20 Gigabit",
      "Cost": 3.2,
      "MonthlyPrice": 2336,
      "SpotPrice": "0.9479"
    },
    {
      "InstanceType": "m4.large",
      "Memory": "8 GiB",
      "VCPUS": 2,
      "Storage": "EBS only",
      "Network": "Moderate",
      "Cost": 0.1,
      "MonthlyPrice": 73,
      "SpotPrice": "0.0362"
    },
    {
      "InstanceType": "m4.2xlarge",
      "Memory": "32 GiB",
      "VCPUS": 8,
      "Storage": "EBS only",
      "Network": "High",
      "Cost": 0.4,
      "MonthlyPrice": 292,
      "SpotPrice": "0.1504"
    },
    {
      "InstanceType": "m4.4xlarge",
      "Memory": "64 GiB",
      "VCPUS": 16,
      "Storage": "EBS only",
      "Network": "High",
      "Cost": 0.8,
      "MonthlyPrice": 584,
      "SpotPrice": "0.3168"
    },
    {
      "InstanceType": "m4.xlarge",
      "Memory": "16 GiB",
      "VCPUS": 4,
      "Storage": "EBS only",
      "Network": "High",
      "Cost": 0.2,
      "MonthlyPrice": 146,
      "SpotPrice": "0.0661"
    },
    {
      "InstanceType": "m4.10xlarge",
      "Memory": "160 GiB",
      "VCPUS": 40,
      "Storage": "EBS only",
      "Network": "10 Gigabit",
      "Cost": 2,
      "MonthlyPrice": 1460,
      "SpotPrice": "0.7050"
    }
  ]
}


This ruby gem wraps the JSON pricing data provided by Amazon and provides a simple interface, which takes care of mapping the region and instance type names to the ones used in the EC2 API.

https://github.com/sonian/amazon-pricing


If you are using golang, I wrote a library that can query the data using the "https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/{offer_code}/current/index.{format}" format.

https://github.com/Chronojam/aws-pricing-api

import (
        "github.com/chronojam/aws-pricing-api/types/schema"
)

func main() {
        ec2 := &schema.AmazonEC2{}

        // Populate this object with new pricing data
        err := ec2.Refresh()
        if err != nil {
                panic(err)
        }

        // Get the price of all c4.Large instances,
        // running linux, on shared tenancy
        c4Large := []*schema.AmazonEC2_Product{}
        for _, p := range ec2.Products {
               if p.Attributes.InstanceType == "c4.large" &&
                       p.Attributes.OperatingSystem == "Linux" &&
                       p.Attributes.Tenancy == "Shared" {
                       c4Large = append(c4Large, p)
               }
        }
}


AWS has launched the new price list API for programming integration.

URL Syntax:

https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/{offer_code}/current/index.{format}

To get list of supporting services:

https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/index.json

AWS blog Referance: https://aws.amazon.com/blogs/aws/new-aws-price-list-api/


I am the author of an open-source tool called ec2-cost-calculate that will "report your EC2 instance usage on an hourly basis" - the tool is available at awsmissingtools.com. Output can be hourly, daily, monthly. Two versions of the tool exist, one written in Ruby and another written in bash.


As Amazon has recently changed the pricing scheme for EC2 instances (no more Medium or Light, only Heavy which has multiple payment options - allUpfront, partialUpfront, noUpfront) and also some time ago separated the old generation instances from the current ones, the list of undocumented pricing API links has changed as well the structure of JSON provisioned by these links. The full list if links of EC2 pricing undocumented API with descriptions, as well as the Python module for convenient access and structured output of pricing in JSON, CSV or Table formats can be found in the following repository:

https://github.com/ilia-semenov/awspricingfull


If you're using Go, I wrote a package to decode the data into a struct, based on the files linked to in @okrasz's answer

https://github.com/recursionpharma/ec2prices

Feel free to contribute with more pricing data.


here's a bash implementation, maintained as a gist that will give you pricing in a concise csv file for on-demand, license-free instances.

it works by parsing the nearly 3gb ec2 pricing file and filtering out all the reserved instance and private customer prices that are inexplicably included in the only free mechanism aws provides for obtaining programmatically parse-able pricing data and results in a price.csv file of just over 7000 lines.

#!/usr/bin/env bash

# csv filenames
raw_path=/tmp/ec2.csv
machine_path=/tmp/machine.csv
price_path=/tmp/price.csv
region_path=/tmp/region.csv

# dependencies
for package in coreutils curl datamash grep miller python3-csvkit; do
  if ! dnf list installed ${package} &> /dev/null; then
    sudo dnf install -y ${package}
  fi
done

# fetch raw data from aws
if [ ! -s ${raw_path} ]; then
  curl -Lo ${raw_path} https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonEC2/current/index.csv
fi

# build machine list
if [ ! -s ${machine_path} ]; then
  echo '"id","current-generation","family","vcpu","processor","clock","memory","storage","network","architecture"' > ${machine_path}
  tail -n +7 ${raw_path} | cut -d , -f 20-29 | grep -v '"AWS Region"' | grep -v '"NA","NA","NA"' | grep -v ',,,,,,,,,' | sort -u >> ${machine_path}
fi

# build price list, filtering out everything but license-free, on-demand instances in regions available to the public
if [ ! -s ${price_path} ]; then
  echo machine,region,price > ${price_path}
  cat ${raw_path} | grep '"Linux","No License required"' | grep -v 'SQL' | grep -v '"Reserved"' | grep -v '"0.0000000000"' | grep -v 'Unused Reservation' | grep -v 'Dedicated' | cut -d , -f 10,20,85 | egrep '"(af|ap|ca|eu|me|sa|us)-(north|south|east|west|central)(east|west)?-[1-3]"' | mlr --csv --implicit-csv-header reorder -f 2,3,1 | grep -v '2,3,1' | sort >> ${price_path}
fi

# build region list, filtering out private customer regions
if [ ! -s ${region_path} ]; then
  echo '"id","name"' > ${region_path}
  tail -n +7 ${raw_path} | cut -d , -f 18,85 | sort -u | datamash -t , reverse | egrep '"(af|ap|ca|eu|me|sa|us)-(north|south|east|west|central)(east|west)?-[1-3]"' | sort >> ${region_path}
fi
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜