Python 2.7 AWS定价API不生成给定搜索条件的价格

Python 2.7 AWS定价API不生成给定搜索条件的价格,python-2.7,amazon-web-services,amazon-ec2,pagination,boto3,Python 2.7,Amazon Web Services,Amazon Ec2,Pagination,Boto3,我使用AWS boto3定价api获取实例的价格 但我没有得到组合的结果(us west 2,r3.2x大型,Linux,未安装预安装软件,租赁=共享) 这是我的密码: pricing = boto3.client('pricing', region_name='us-east-1') hourlyTermCode = 'JRTCKXETXF' rateCode = '6YS6EN2CT7' token = '' while True: paginator = pricing.get_p

我使用AWS boto3定价api获取实例的价格

但我没有得到组合的结果(us west 2,r3.2x大型,Linux,未安装预安装软件,租赁=共享)

这是我的密码:

pricing = boto3.client('pricing', region_name='us-east-1')
hourlyTermCode = 'JRTCKXETXF'
rateCode = '6YS6EN2CT7'
token = ''
while True:
    paginator = pricing.get_paginator('get_products')
    pages = paginator.paginate(
        ServiceCode='AmazonEC2',
        Filters=[
            {'Type': 'TERM_MATCH', 'Field': 'operatingSystem', 'Value': 'Linux'},
            {'Type': 'TERM_MATCH', 'Field': 'location', 'Value': 'US West (Oregon)'}

        ],

        PaginationConfig={
            'StartingToken':token
        }
    )

    for response in pages:
        for price in response['PriceList']:
            resp = json.loads(price)
            product = resp['product']  # ['attributes']['']
            sku = product['sku']

            if product['productFamily'] == 'Compute Instance':
                if str(product['attributes']['instanceType']) == str(amazon_instance_type) :
                    if str(product['attributes']['operatingSystem']) == 'Linux':
                        if str(product['attributes']['preInstalledSw']) == 'NA':
                            if str(product['attributes']['tenancy']) == 'Shared':
                                sku_key = resp['terms']['OnDemand'].get(sku)
                                if sku_key:
                                    price = sku_key[sku + '.' + hourlyTermCode + '.' + rateCode]['pricePerUnit']['USD']
                                    print 'here 7'
                                    print price

        try:
            token = response['NextToken']
        except KeyError:
            pass
这项工作:

import json
import boto3

client = boto3.client('pricing', region_name='us-east-1')

response = client.get_products(
    ServiceCode='AmazonEC2',
    Filters=[
        {'Type': 'TERM_MATCH', 'Field': 'operatingSystem', 'Value': 'Linux'},
        {'Type': 'TERM_MATCH', 'Field': 'location', 'Value': 'US West (Oregon)'},
        {'Type': 'TERM_MATCH', 'Field': 'instanceType', 'Value': 'r3.2xlarge'},
        {'Type': 'TERM_MATCH', 'Field': 'tenancy', 'Value': 'Shared'},
        {'Type': 'TERM_MATCH', 'Field': 'preInstalledSw', 'Value': 'NA'}
    ]
)

for pricelist_json in response['PriceList']:
    pricelist = json.loads(pricelist_json)
    product = pricelist['product']

    if product['productFamily'] == 'Compute Instance':
        print pricelist['terms']['OnDemand'].values()[0]['priceDimensions'].values()[0][u'pricePerUnit']['USD']
它基于以下各项的输出:

{u'FormatVersion': u'aws_v1', u'PriceList': [u'{
            "product": {
                "productFamily": "Compute Instance",
                "attributes": {
                    "enhancedNetworkingSupported": "Yes",
                    "memory": "61 GiB",
                    "vcpu": "8",
                    "capacitystatus": "Used",
                    "locationType": "AWS Region",
                    "storage": "1 x 160 SSD",
                    "instanceFamily": "Memory optimized",
                    "operatingSystem": "Linux",
                    "physicalProcessor": "Intel Xeon E5-2670 v2 (Ivy Bridge)",
                    "clockSpeed": "2.5 GHz",
                    "ecu": "26",
                    "networkPerformance": "High",
                    "servicename": "Amazon Elastic Compute Cloud",
                    "instanceType": "r3.2xlarge",
                    "tenancy": "Shared",
                    "usagetype": "USW2-BoxUsage:r3.2xlarge",
                    "normalizationSizeFactor": "16",
                    "processorFeatures": "Intel AVX; Intel Turbo",
                    "servicecode": "AmazonEC2",
                    "licenseModel": "No License required",
                    "currentGeneration": "No",
                    "preInstalledSw": "NA",
                    "location": "US West (Oregon)",
                    "processorArchitecture": "64-bit",
                    "operation": "RunInstances"
                },
                "sku": "GMTWE5CTY4FEUYDN"
            },
            "serviceCode": "AmazonEC2",
            "terms": {
                "OnDemand": {
                    "GMTWE5CTY4FEUYDN.JRTCKXETXF": {
                        "priceDimensions": {
                            "GMTWE5CTY4FEUYDN.JRTCKXETXF.6YS6EN2CT7": {
                                "unit": "Hrs",
                                "endRange": "Inf",
                                "description": "$0.665 per On Demand Linux r3.2xlarge Instance Hour",
                                "appliesTo": [],
                                "rateCode": "GMTWE5CTY4FEUYDN.JRTCKXETXF.6YS6EN2CT7",
                                "beginRange": "0",
                                "pricePerUnit": {
                                    "USD": "0.6650000000"
                                }
                            }
                        },
                        "sku": "GMTWE5CTY4FEUYDN",
                        "effectiveDate": "2018-07-01T00:00:00Z",
                        "offerTermCode": "JRTCKXETXF",
                        "termAttributes": {}
                    }
                },
                ...
            },
            "version": "20180726190848",
            "publicationDate": "2018-07-26T19:08:48Z"
        }'
    ]
}

我建议您采取让代码首先返回某些内容的策略。减少限制。添加一些“其他”分支以打印不匹配的值,以供检查。打印出整个响应或价格,并进行目视检查。这可能是因为您使用的是不适用于us-west-2的小时条款代码和/或费率代码。嗨@Michael sqlbot:是的,我试过了,对于我在报价文件中找到的匹配密钥,api不知何故给出了匹配sku的密钥错误。非常感谢。此解决方案非常完美,消除了对sku或报价代码或费率代码的依赖。然而,我们为什么不要求分页呢?这方面的用例是什么?为什么不适用于这种情况?附加的过滤器意味着返回的结果很少(一个?)。因此,分页是不必要的。如果过滤器较少,将返回更多结果,因此可能需要分页。