【问题标题】:Boto3 get_products pricing returning 0.00 USD for some instance typesBoto3 get_products 定价为某些实例类型返回 0.00 美元
【发布时间】:2021-05-12 09:19:44
【问题描述】:

我正在尝试获取欧盟(爱尔兰)区域 (eu-west-1) 的 GPU 实例价格。 然而,一些实例类型的价格为 0.00,尽管网站 (https://aws.amazon.com/ec2/pricing/on-demand/) 显示它们是可用的并且绝对不是 0.00。

我正在使用下面的代码:

session = boto3.Session(profile_name='nimbo')
instance_types = list(sorted(ec2_instance_types('eu-west-1')))
# Filter by p and g instance types (gpus)
instance_types = [inst for inst in instance_types if inst[0] in ["p", "g"]]

# Use AWS Pricing API at US-East-1
pricing = session.client('pricing', region_name='us-east-1')


for instance_type in instance_types:
    response = pricing.get_products(
        ServiceCode='AmazonEC2',
        MaxResults=1,
        FormatVersion='aws_v1',
        Filters=[
            { 'Type': 'TERM_MATCH', 'Field': 'instanceType', 'Value': instance_type },
            { 'Type': 'TERM_MATCH', 'Field': 'location', 'Value': 'EU (Ireland)' },
            { 'Type': 'TERM_MATCH', 'Field': 'operatingSystem', 'Value': 'Linux' },
        ]
    )

    inst = json.loads(response["PriceList"][0])
    inst = inst['terms']['OnDemand']
    inst = list(inst.values())[0]
    inst = list(inst["priceDimensions"].values())[0]
    inst = inst['pricePerUnit']
    currency = list(inst.keys())[0]
    price = float(inst[currency])
    print(instance_type+": "+"%0.3f %s"%(price, currency))

这会返回:

g2.2xlarge: 0.907 USD
g2.8xlarge: 0.000 USD
g3.16xlarge: 0.000 USD
g3.4xlarge: 1.331 USD
g3.8xlarge: 2.420 USD
g3s.xlarge: 0.796 USD
g4ad.16xlarge: 0.000 USD
g4ad.4xlarge: 0.000 USD
g4ad.8xlarge: 2.130 USD
g4dn.12xlarge: 4.645 USD
g4dn.16xlarge: 0.000 USD
g4dn.2xlarge: 0.838 USD
g4dn.4xlarge: 1.342 USD
g4dn.8xlarge: 0.000 USD
g4dn.metal: 8.724 USD
g4dn.xlarge: 0.625 USD
p2.16xlarge: 0.000 USD
p2.8xlarge: 7.776 USD
p2.xlarge: 0.000 USD
p3.16xlarge: 0.000 USD
p3.2xlarge: 3.305 USD
p3.8xlarge: 14.082 USD
p3dn.24xlarge: 0.000 USD
p4d.24xlarge: 0.000 USD

有人知道我在这里缺少什么吗?

【问题讨论】:

    标签: python amazon-web-services amazon-s3 amazon-ec2 boto3


    【解决方案1】:

    Amazon EC2 实例的定价有许多个维度。

    您的代码仅查看包含 100 多条记录的结果集中返回的第一个元素 (MaxResults=1)。

    当我运行你的代码时,它显示:

    • $0.907 per Dedicated Unused Reservation Linux with SQL Web g2.2xlarge Instance Hour
    • $0.00 per Reservation Linux g2.8xlarge Instance Hour

    我认为您希望按需定价而无需进行任何预订。在这种情况下,您需要额外的过滤器:

            { 'Type': 'TERM_MATCH', 'Field': 'capacitystatus', 'Value': 'Used' },
            { 'Type': 'TERM_MATCH', 'Field': 'preInstalledSw', 'Value': 'NA' },
            { 'Type': 'TERM_MATCH', 'Field': 'tenancy', 'Value': 'shared' },
    

    (感谢Use boto3 to get current price for given EC2 instance type 提供此配置!)

    那么结果是:

    g2.2xlarge: 0.702 USD
    g2.8xlarge: 2.808 USD
    

    我建议您删除MaxResults 设置,以便您可以查看何时返回更多结果。

    【讨论】:

    • 这完全正确,非常感谢。就像跟进一样:当我想使用 Boto3 启动 EC2 实例时,这些相同的设置是否适用?也就是定价和ec2结果会不会有出入?
    • 在某些情况下,是的。如果您想使用“专用租户”启动 Amazon EC2 实例,则必须在启动实例时指定。它将默认为非专用。同样,在启动实例时,您必须指定 AMI。这将确定预装软件(例如 SQL Server)是否需要额外收费。但是,其中一些是由外部确定的,例如实例是按按需收费还是按预留收费取决于已购买的预留实例以及当前正在运行的其他实例。
    猜你喜欢
    • 2019-08-03
    • 2023-03-30
    • 2019-01-11
    • 2018-12-29
    • 1970-01-01
    • 2020-04-09
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多