This repository has been archived by the owner. It is now read-only.
Uses the AWS price API to generate a mapping of OnDemand prices by instance type and region.
Switch branches/tags
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.



illustration by Joseph Wilkins

Price Pigeon

The answer to inconsistent spot price bids.

Uses the AWS Price List API to generate a mapping of OnDemand prices by instance type. This mapping can be used during instance creation to make accurate spot bid prices.

*Note: The price supplied is the highest OnDemand price for that instance type across the following regions:

        'US East (N. Virginia)': 'us-east-1',
        'US West (N. California)': 'us-west-1',
        'US West (Oregon)': 'us-west-2',
        'Asia Pacific (Sydney)': 'ap-southeast-2',
        'EU (Ireland)': 'eu-west-1',

Using Price Pigeon

  • install price-pigeon and add to your package.json:
npm install @mapbox/price-pigeon --save
  • [Optional] Update the price map to use the most recent OnDemand prices:
cd node_modules/price-pigeon
npm run price-pigeon-update
  • Add your InstanceType to the template Parameters if it isn't there already. The template will use a function that refers to InstanceType to get the correct price. Here's an example:
'Parameters' : {
  'InstanceType' : {
    'Description' : 'Type of spot instance to launch',
    'Type' : 'String',
    'Default' : 'm3.xlarge', /* This is the type of instance you're launching */
    'AllowedValues' : ['m3.xlarge', 'r3.large']

  • Include the price map directly in your CloudFormation template.js (check out price-pigeon/examples/ for a sample template):
// require the price-mapping function
var priceMapper = require('@mapbox/price-pigeon').priceMapper;
// get a price map with 50% off prices
var priceMap = priceMapper(0.5);
// If you want to use the actual price, you don't need to supply a ratio:
priceMap = priceMapper();

// Don't forget to add the rest of your template to this stub!
module.exports = {
  'AWSTemplateFormatVersion' : '2010-09-09',
  'Description' : 'price pigeon',
  'Mappings' :   {
    'Prices' : priceMap
  'Resources' : {
    'LaunchConfiguration' : {
      'Properties' : {
        'SpotPrice' : {
          'Fn::FindInMap' : ['Prices', {'Ref' : 'InstanceType'}, 'price']
  'Parameters' : {
    'InstanceType' : {
      'Description' : 'Type of spot instance to launch',
      'Type' : 'String',
      'Default' : 'm3.xlarge',
      'AllowedValues' : ['m3.xlarge', 'r3.xlarge']