Existe-t-il des API pour Amazon Web Services PRICING?

Existe-t-il des API disposant de tarifs à jour sur Amazon Web Services? Quelque chose qui peut être interrogé, par exemple, pour le dernier prix S3 pour une région donnée, ou EC2, etc.

Merci

METTRE À JOUR:

AWS a maintenant l’API de tarification: https://aws.amazon.com/blogs/aws/new-aws-price-list-api/

Réponse originale:

C’est quelque chose que j’ai déjà demandé (via les évangélistes et les sondages AWS), mais qui n’a pas été publié. Je suppose que les gens de l’AWS ont des innovations plus intéressantes à leur horizon.

Comme l’a souligné @brokenbeatnik, il existe une API pour l’historique des prix spot. Documents API ici: http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeSpotPriceHistory.html

Je trouve étrange que l’historique des prix spot ait une API officielle , mais qu’ils ne l’aient pas fait pour les services à la demande en même temps. Quoi qu’il en soit, pour répondre à la question, oui, vous pouvez interroger la tarification AWS annoncée

Le mieux que je puisse trouver consiste à examiner la source (côté client) des pages de tarification des différents services. Vous y trouverez que les tables sont construites dans JS et remplies avec des données JSON, des données que vous pouvez obtenir vous-même. Par exemple:

Ce n’est que la moitié de la bataille cependant, vous devez ensuite choisir le format de l’object pour obtenir les valeurs souhaitées, par exemple, en Python, cela permet d’obtenir le prix de l’instance Linux extra-large à la demande pour le processeur:

 >>> import json >>> import urllib2 >>> response = urllib2.urlopen('http://aws.amazon.com/ec2/pricing/pricing-on-demand-instances.json') >>> pricejson = response.read() >>> pricing = json.loads(pricejson) >>> pricing['config']['regions'][0]['instanceTypes'][3]['sizes'][1]['valueColumns'][0]['prices']['USD'] u'0.68' 

Clause de non-responsabilité: Évidemment, il ne s’agit pas d’une API sanctionnée par AWS et, par conséquent, je ne recommanderais pas d’attendre la stabilité du format de données ou même l’existence continue de la source. Mais c’est là, et ça bat la transcription des données de tarification dans des fichiers de configuration / source statiques!

Pour les personnes qui souhaitent utiliser les données de l’API d’Amazon qui utilise des choses comme “t1.micro”, voici un tableau de traduction

 type_translation = { 'm1.small' : ['stdODI', 'sm'], 'm1.medium' : ['stdODI', 'med'], 'm1.large' : ['stdODI', 'lg'], 'm1.xlarge' : ['stdODI', 'xl'], 't1.micro' : ['uODI', 'u'], 'm2.xlarge' : ['hiMemODI', 'xl'], 'm2.2xlarge' : ['hiMemODI', 'xxl'], 'm2.4xlarge' : ['hiMemODI', 'xxxxl'], 'c1.medium' : ['hiCPUODI', 'med'], 'c1.xlarge' : ['hiCPUODI', 'xl'], 'cc1.4xlarge' : ['clusterComputeI', 'xxxxl'], 'cc2.8xlarge' : ['clusterComputeI', 'xxxxxxxxl'], 'cg1.4xlarge' : ['clusterGPUI', 'xxxxl'], 'hi1.4xlarge' : ['hiIoODI', 'xxxx1'] } region_translation = { 'us-east-1' : 'us-east', 'us-west-2' : 'us-west-2', 'us-west-1' : 'us-west', 'eu-west-1' : 'eu-ireland', 'ap-southeast-1' : 'apac-sin', 'ap-northeast-1' : 'apac-tokyo', 'sa-east-1' : 'sa-east-1' } 

J’ai créé une API rapide et sale dans Python pour accéder aux données de tarification de ces fichiers JSON et les convertir aux valeurs appropriées (les traductions appropriées et les types d’instance corrects).

Vous pouvez obtenir le code ici: https://github.com/erans/ec2instancespricing

Et en lire un peu plus ici: http://forecastcloudy.net/2012/04/03/quick-dirty-api-for-accessing-amazon-web-services-aws-ec2-pricing-data/

Vous pouvez utiliser ce fichier en tant que module et appeler les fonctions pour obtenir un dictionnaire Python avec les résultats, ou vous pouvez l’utiliser comme un outil de ligne de commande pour obtenir un résultat lisible, JSON ou CSV à utiliser avec d’autres outils en ligne de commande.

Il y a une belle API disponible via le lien ci-dessous que vous pouvez interroger pour la tarification AWS.

http://info.awsstream.com

Si vous jouez un peu avec les filtres, vous pouvez voir comment construire une requête pour renvoyer les informations spécifiques que vous recherchez, par exemple, région, type d’instance, etc. Par exemple, pour renvoyer un fichier json contenant le prix EC2 1 région linux instances, vous pouvez formater votre requête comme indiqué ci-dessous.

http://info.awsstream.com/instances.json?region=eu-west-1&os=linux

Il suffit de remplacer json par xml dans la requête ci-dessus pour renvoyer les informations au format xml.

Remarque – similaire à l’URL publiée par d’autres consortingbuteurs ci-dessus, je ne crois pas qu’il s’agisse d’une API AWS officiellement autorisée. Cependant, sur la base d’un certain nombre de vérifications ponctuelles effectuées ces derniers jours, je peux confirmer qu’au moment de la publication, les informations sur les prix semblent correctes.

Je ne crois pas qu’il existe une API couvrant les prix courants généraux des services standard. Cependant, pour EC2 en particulier, vous pouvez voir l’historique des prix au comptant afin de ne pas avoir à deviner le prix du marché pour une instance ponctuelle. Plus à ce sujet est disponible à:

http://docs.amazonwebservices.com/AWSEC2/latest/DeveloperGuide/using-spot-instances-history.html

J’avais aussi besoin d’une API pour récupérer les prix AWS. J’ai été surpris de ne rien trouver en particulier compte tenu du grand nombre d’API disponibles pour les ressources AWS.

Ma langue préférée est Ruby. J’ai donc écrit un bijou appelé AWSCosts qui fournit un access par programme à la tarification AWS.

Voici un exemple de recherche du prix à la demande pour une instance Linux m1.medium.

AWSCosts.region (‘us-east-1’). Ec2.on_demand (: linux) .price (‘m1.medium’)

Pour ceux qui ont besoin des données de tarification de l’instance AWS complètes (EC2, RDS, ElastiCache et Redshift), voici le module Python développé à partir de celui suggéré ci-dessus par Eran Sandler :

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

Il contient les instances de génération précédente ainsi que celles de la génération actuelle (y compris la plus récente famille d2), la tarification réservée et à la demande. Formats JSON, Table et CSV disponibles.

J’ai fait une liste des noms avant et arrière dans Yaml si quelqu’un en avait besoin pour Rails, etc.

Un autre rapide et sale, mais avec une conversion vers un format de données final plus pratique

  class CostsAmazon(object): '''Class for general info on the Amazon EC2 compute cloud. ''' def __init__(self): '''Fetch a bunch of instance cost data from Amazon and convert it into the following form (as self.table): table['us-east']['linux']['m1']['small']['light']['ondemand']['USD'] ''' # # tables_raw['ondemand']['config']['regions' # ][0]['instanceTypes'][0]['sizes'][0]['valueColumns'][0 # ]['prices']['USD'] # # structure of tables_raw: # ┃ # ┗━━[key] # ┣━━['use'] # an input 3 x ∈ { 'light', 'medium', ... } # ┣━━['os'] # an input 2 x ∈ { 'linux', 'mswin' } # ┣━━['scheduling'] # an input # ┣━━['uri'] # an input (see dict above) # ┃ # the core output from Amazon follows # ┣━━['vers'] == 0.01 # ┗━━['config']: # * ┣━━['regions']: 7 x # ┃ ┣━━['region'] == ∈ { 'us-east', ... } # * ┃ ┗━━['instanceTypes']: 7 x # ┃ ┣━━['type']: 'stdODI' # * ┃ ┗━━['sizes']: 4 x # ┃ ┗━━['valueColumns'] # ┃ ┣━━['size']: 'sm' # * ┃ ┗━━['valueColumns']: 2 x # ┃ ┣━━['name']: ~ 'linux' # ┃ ┗━━['prices'] # ┃ ┗━━['USD']: ~ '0.080' # ┣━━['rate']: ~ 'perhr' # ┣━━['currencies']: ∈ { 'USD', ... } # ┗━━['valueColumns']: [ 'linux', 'mswin' ] # # The valueColumns thing is weird, it looks like they're trying # to constrain actual data to leaf nodes only, which is a little # bit of a conceit since they have lists in several levels. So # we can obtain the *much* more readable: # # tables['regions']['us-east']['m1']['linux']['ondemand' # ]['small']['light']['USD'] # # structure of the reworked tables: # ┃ # ┗━━[]: 7 x ∈ { 'us-east', ... } # ┗━━[]: 2 x ∈ { 'linux', 'mswin' } # oses # ┗━━[]: 7 x ∈ { 'm1', ... } # ┗━━[]: 2 x ∈ { 'ondemand', 'reserved' } # ┗━━[]: 4 x ∈ { 'small', ... } # ┗━━[]: 3 x ∈ { 'light', 'medium', ... } # ┗━━[]: ∈ { 'USD', ... } # ┗━━> ~ '0.080' or None uri_base = 'http://aws.amazon.com/ec2/pricing' tables_raw = { 'ondemand': {'scheduling': 'ondemand', 'uri': '/pricing-on-demand-instances.json', 'os': 'linux', 'use': 'light'}, 'reserved-light-linux': { 'scheduling': 'ondemand', 'uri': 'ri-light-linux.json', 'os': 'linux', 'use': 'light'}, 'reserved-light-mswin': { 'scheduling': 'ondemand', 'uri': 'ri-light-mswin.json', 'os': 'mswin', 'use': 'light'}, 'reserved-medium-linux': { 'scheduling': 'ondemand', 'uri': 'ri-medium-linux.json', 'os': 'linux', 'use': 'medium'}, 'reserved-medium-mswin': { 'scheduling': 'ondemand', 'uri': 'ri-medium-mswin.json', 'os': 'mswin', 'use': 'medium'}, 'reserved-heavy-linux': { 'scheduling': 'ondemand', 'uri': 'ri-heavy-linux.json', 'os': 'linux', 'use': 'heavy'}, 'reserved-heavy-mswin': { 'scheduling': 'ondemand', 'uri': 'ri-heavy-mswin.json', 'os': 'mswin', 'use': 'heavy'}, } for key in tables_raw: # expand to full URIs tables_raw[key]['uri'] = ( '%s/%s'% (uri_base, tables_raw[key]['uri'])) # fetch the data from Amazon link = urllib2.urlopen(tables_raw[key]['uri']) # adds keys: 'vers' 'config' tables_raw[key].update(json.loads(link.read())) link.close() # canonicalize the types - the default is pretty annoying. # self.currencies = set() self.regions = set() self.types = set() self.intervals = set() self.oses = set() self.sizes = set() self.schedulings = set() self.uses = set() self.footnotes = {} self.typesizes = {} # self.typesizes['m1.small'] = [...] self.table = {} # grovel through Amazon's tables_raw and convert to something orderly: for key in tables_raw: scheduling = tables_raw[key]['scheduling'] self.schedulings.update([scheduling]) use = tables_raw[key]['use'] self.uses.update([use]) os = tables_raw[key]['os'] self.oses.update([os]) config_data = tables_raw[key]['config'] self.currencies.update(config_data['currencies']) for region_data in config_data['regions']: region = self.instance_region_from_raw(region_data['region']) self.regions.update([region]) if 'footnotes' in region_data: self.footnotes[region] = region_data['footnotes'] for instance_type_data in region_data['instanceTypes']: instance_type = self.instance_types_from_raw( instance_type_data['type']) self.types.update([instance_type]) for size_data in instance_type_data['sizes']: size = self.instance_size_from_raw(size_data['size']) typesize = '%s.%s' % (instance_type, size) if typesize not in self.typesizes: self.typesizes[typesize] = set() self.typesizes[typesize].update([region]) self.sizes.update([size]) for size_values in size_data['valueColumns']: interval = size_values['name'] self.intervals.update([interval]) for currency in size_values['prices']: cost = size_values['prices'][currency] self.table_add_row(region, os, instance_type, size, use, scheduling, currency, cost) def table_add_row(self, region, os, instance_type, size, use, scheduling, currency, cost): if cost == 'N/A*': return table = self.table for key in [region, os, instance_type, size, use, scheduling]: if key not in table: table[key] = {} table = table[key] table[currency] = cost def instance_region_from_raw(self, raw_region): '''Return a less intelligent given EC2 pricing name to the corresponding region name. ''' regions = { 'apac-tokyo' : 'ap-northeast-1', 'apac-sin' : 'ap-southeast-1', 'eu-ireland' : 'eu-west-1', 'sa-east-1' : 'sa-east-1', 'us-east' : 'us-east-1', 'us-west' : 'us-west-1', 'us-west-2' : 'us-west-2', } return regions[raw_region] if raw_region in regions else raw_region def instance_types_from_raw(self, raw_type): types = { # ondemand reserved 'stdODI' : 'm1', 'stdResI' : 'm1', 'uODI' : 't1', 'uResI' : 't1', 'hiMemODI' : 'm2', 'hiMemResI' : 'm2', 'hiCPUODI' : 'c1', 'hiCPUResI' : 'c1', 'clusterComputeI' : 'cc1', 'clusterCompResI' : 'cc1', 'clusterGPUI' : 'cc2', 'clusterGPUResI' : 'cc2', 'hiIoODI' : 'hi1', 'hiIoResI' : 'hi1' } return types[raw_type] def instance_size_from_raw(self, raw_size): sizes = { 'u' : 'micro', 'sm' : 'small', 'med' : 'medium', 'lg' : 'large', 'xl' : 'xlarge', 'xxl' : '2xlarge', 'xxxxl' : '4xlarge', 'xxxxxxxxl' : '8xlarge' } return sizes[raw_size] def cost(self, region, os, instance_type, size, use, scheduling, currency): try: return self.table[region][os][instance_type][ size][use][scheduling][currency] except KeyError as ex: return None 

Voici une autre “api” non autorisée qui couvre les instances réservées: http://aws.amazon.com/ec2/pricing/pricing-reserved-instances.json

Il n’y a pas de prix api, mais il y a très bon prix mentionné ci-dessus. En plus du ripper de prix ec2, je voudrais partager mes rippers de prix rds et elasticache:

https://github.com/evgeny-gridasov/rdsinstancespricing https://github.com/evgeny-gridasov/elasticachepricing

Il y a une réponse à une question similaire qui répertorie tous les fichiers .js contenant les prix, qui sont à peine des fichiers JSON (avec seulement un callback(...); déclaration à supprimer).

Voici un exemple de prix pour Linux On Demand: http://aws-assets-pricing-prod.s3.amazonaws.com/pricing/ec2/linux-od.js

(Obtenez la liste complète directement sur cette réponse )