amazon web services定价有没有API?

是否有任何API在Amazon Web Services上具有最新的定价? 例如,可以查询某个地区的最新价格S3或EC2等。

谢谢

这是我之前要求的(通过AWS传福音和调查),但还没有到来。 我想AWS的人们会有更多有趣的创新。

正如@brokenbeatnik指出的那样,现货价格历史有一个API。 API文档在这里: http : //docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeSpotPriceHistory.html

我发现现货价格历史上有一个官方的 API,但是他们没有在同一时间按需服务。 无论如何,回答这个问题, 是的,你可以查询广告的 AWS定价

我所能想到的最好的办法是检查各种服务定价页面的(客户端)来源。 在那里你会发现这些表是用JS构build的,并且填充了JSON数据,你可以自己获取数据。 例如:

这只是战斗的一半,接下来你必须select对象格式来获得你想要的值,例如,在Python中,这将获得Virginia的Hi-CPU按需超大型Linux实例定价:

 >>> 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' 

免责声明:显然,这不是一个AWS认可的API,因此我不build议您期望数据格式的稳定性,甚至是源的持续存在。 但它是在那里,它打败了定价数据转换成静态configuration/源文件!

对于想使用amazon api数据的人来说,这里使用的是“t1.micro”,这里是一个翻译数组

 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' } 

我在Python中创build了一个快捷的API,用于访问这些JSON文件中的定价数据并将其转换为相关的值(正确的翻译和正确的实例types)。

你可以在这里获得代码: https : //github.com/erans/ec2instancespricing

并阅读更多关于它在这里: http : //forecastcloudy.net/2012/04/03/quick-dirty-api-for-accessing-amazon-web-services-aws-ec2-pricing-data/

你可以使用这个文件作为一个模块,并调用函数来获得一个Python字典的结果,或者你可以使用它作为一个命令行工具来获取输出是一个人类可读的表,JSON或CSV与其他命令行工具。

有一个很好的API可以通过下面的链接查询AWS定价。

http://info.awsstream.com

如果你用filter玩了一下,你可以看到如何构build一个查询来返回你所在的特定信息,例如region,instance type等。例如,要返回一个包含eu-west- 1个区域的linux实例,你可以按照下面的格式来查询你的查询。

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

只需在上面的查询中用xmlreplacejson即可返回xml格式的信息。

注意 – 与上面其他贡献者发布的url类似,我不相信这是官方认可的AWS API。 然而,根据我在过去几天所做的一些抽查,我可以确认在发布时价格信息似乎是正确的。

我不相信有一个API涵盖了标准服务的一般当前价格。 但是,特别是对于EC2,您可以看到现货价格历史,以便您不必猜测现货实例的市场价格。 更多信息,请访问:

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

我也需要一个API来检索AWS定价。 我惊讶地发现没有什么特别的,因为有大量的AWS资源可用的API。

我的首选语言是Ruby,所以我写了一个名为AWSCosts的Gem,它提供了对AWS定价的编程访问。

以下是一个如何findm1.medium Linux实例的按需价格的示例。

。AWSCosts.region( '美东-1')ec2.on_demand(:Linux的)。价格( 'm1.medium')

对于需要全面的AWS实例定价数据(EC2,RDS,ElastiCache和Redshift)的用户,以下是由Eran Sandler提出的Python模块:

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

它包含上一代实例以及当前代实例(包括最新的d2家族),预留和按需定价。 JSON,表格和CSV格式可用。

我在Yaml做了一个正向和反向名字的Gist ,如果有人需要Rails等等。

另一个快速和肮脏,但与转换到一个更方便的最终数据格式

  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: # ┃ # ┗━━[<region>]: 7 x ∈ { 'us-east', ... } # ┗━━[<os>]: 2 x ∈ { 'linux', 'mswin' } # oses # ┗━━[<type>]: 7 x ∈ { 'm1', ... } # ┗━━[<scheduling>]: 2 x ∈ { 'ondemand', 'reserved' } # ┗━━[<size>]: 4 x ∈ { 'small', ... } # ┗━━[<use>]: 3 x ∈ { 'light', 'medium', ... } # ┗━━[<currency>]: ∈ { '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'] = [<region>...] 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 

这是另一个未经批准的“api”,涵盖了保留的实例: http : //aws.amazon.com/ec2/pricing/pricing-reserved-instances.json

没有定价API,但有上面提到的非常好的价格。 除了ec2价格松土,我想分享我的rds和elasticache价格松土:

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

有一个类似问题的回复,其中列出了所有包含价格的.js文件,这些文件几乎不包含JSON文件(仅包含callback(...);删除语句)。

以下是Linux On Demand价格的示例: http : //aws-assets-pricing-prod.s3.amazonaws.com/pricing/ec2/linux-od.js

( 直接在答复中获得完整列表)