【问题标题】:REST API - AWS EC2 Pricing Per HourREST API - AWS EC2 每小时定价
【发布时间】:2019-01-22 00:44:20
【问题描述】:

我想以编程方式检索 AWS EC2 实例的给定实例 ID 的价格列表。 我正在尝试通过普通的 REST API 调用(即没有框架)来做到这一点。

我想提供一个实例 ID 列表:

i-12345   
i-45678
...

并最终检索他们的每小时价格:

i-12345 = $0.032
i-45678 = $0.56
...

我正在尝试将 Postman 与我的 AccessKeySecretKey 一起使用,但是当我使用时得到一个 401 Unauthorizedhttps://ec2.amazonaws.com/?Action=DescribeInstances&Filter.1.Name=instance-id&Filter.1.Value=i-12345

很可能我需要多个 REST 调用:

  1. 描述实例以获取实例大小和区域。
  2. 调用定价端点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 天中的成本并由此推断?

【问题讨论】:

  • 我觉得你的方法不会像现在这样工作。 AWS Rest API 的身份验证 is pretty involved 并且需要代码来计算 SHA1 哈希。然后,充其量您可以访问您的 实例信息。现在你必须加入定价信息。您可以从 here(警告 - 9MB)获取全球信息,但现在您必须找到区域和实例类型。你真的需要一些代码。

标签: amazon-web-services amazon-ec2 postman ec2-api-tools


【解决方案1】:

有一个定价 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

【讨论】:

    猜你喜欢
    • 2020-06-12
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-03
    • 2019-07-08
    • 1970-01-01
    相关资源
    最近更新 更多