amazon-web-services - REST API - AWS EC2 每小时定价
问题描述
我想以编程方式检索 AWS EC2 实例的给定实例 ID 的价格列表。我试图通过普通的 REST API 调用(即没有框架)来做到这一点。
我想提供一个实例 ID 列表:
i-12345
i-45678
...
并最终检索他们每小时的价格:
i-12345 = $0.032
i-45678 = $0.56
...
我正在尝试将 Postman 与我一起使用AccessKey
,但是当我使用时SecretKey
得到一个:401 Unauthorized
https://ec2.amazonaws.com/?Action=DescribeInstances&Filter.1.Name=instance-id&Filter.1.Value=i-12345
很可能我需要多个 REST 调用:
- 描述实例以获取实例大小和区域。
- 调用定价端点
https://docs.aws.amazon.com/aws-cost-management/latest/APIReference/Welcome.html
有任何想法吗?
笔记:
我知道 JSON 的价目表,
https://aws.amazon.com/blogs/aws/new-aws-price-list-api/
但这篇文章来自 2015 年。我知道 JSON 下载
https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonEC2/current/us-east-1/index.json
,但这需要我首先知道我的每个实例在哪个区域运行,然后为每个区域下载整个 +20MB JSON。我知道定价页面:
https://aws.amazon.com/ec2/pricing/
它突出了另一个复杂性 -实例是如何创建的。
也许我正在以错误的方式解决这个问题。也许我应该查询这些cost explorer API
实例在过去X 天内的成本,从而从中推断?
解决方案
有一个定价 API,请参阅 Jeff Barr 的博客: https ://aws.amazon.com/blogs/aws/aws-price-list-api-update-new-query-and-metadata-functions/
请注意,定价记录是针对多种服务的,因此一个好的过滤器可以真正帮助您放大您返回的记录以及所需的分页 API 调用次数(转化为速度......)。
例子:
b3session = boto3.Session(region_name="us-east-1") # pricing API not supported in all regions, I default to us-east-1
pricing_client = b3session.client('pricing')
# Filter to only on-demand, no pre-isntalled SW, and Linux (to avoid adding OS cost in this example)
region_name = 'eu-west-1'
query_parameters = {
'ServiceCode': 'AmazonEC2',
'FormatVersion': 'aws_v1',
'Filters': [
{"Type": "TERM_MATCH", "Field": "regionCode", "Value": region_name},
{"Type": "TERM_MATCH", "Field": "marketoption", "Value": "OnDemand"},
{"Type": "TERM_MATCH", "Field": "preInstalledSw", "Value": "NA"},
{"Type": "TERM_MATCH", "Field": "operatingSystem", "Value": "Linux"},
{"Type": "TERM_MATCH", "Field": "productFamily", "Value": "Compute Instance"},
{"Type": "TERM_MATCH", "Field": "tenancy", "Value": "Shared"},
]
}
next_token = True
while next_token:
try:
prices = pricing_client.get_products(**query_parameters)
except Exception as e:
print("Some thing went wrong)
exit(1)
if 'NextToken' in prices.keys():
query_parameters['NextToken'] = prices['NextToken']
else:
next_token = False
for p in prices["PriceList"]:
price = json.loads(p). # (This API returns strings, not dicts)
## DO SOMETHING WITH THIS PRICING RECORD
推荐阅读
- csv - Utilities.parseCsv(csv, ";") 也以逗号分隔
- android - 在共享首选项中插入数组
- java-stream - Hazelcast Jet java.util.streaming
- tensorflow - 如何将 GCS 凭据添加到 tensorflow?
- node.js - 如何访问 bookshelf.js 中的 knex/querybuilder raw?
- sql - SQL中的慢速选择查询,表只有200万条记录
- python - RuntimeError:线程只能启动一次 Python Tkinter webserver
- ruby-on-rails - Ruby on Rails - 可能无法匹配的约束:[:id]
- java - 我们可以同时从多个线程访问同一个实例的同步方法和非同步方法吗?
- linux-kernel - Unix 共享库和 VDSO 内存映射