【问题标题】:使用 boto3 获取使用 boto3 的 ec2 实例的总价格
【发布时间】:2021-05-17 03:38:03
【问题描述】:
reservations = client.describe_instances()['Reservations']

我已经使用 describeinstances() 获取实例 id 以首先获取每个实例。有没有办法使用 get_cost_and_usage() 使用此函数使用实例 id 获取每个实例的价格?

【问题讨论】:

  • 您希望确定特定实例类型的每小时成本,还是特定 EC2 实例迄今为止的总成本?
  • @jarmod 使用实例 ID 的特定 EC2 实例迄今为止的总成本。
  • 总成本,还是实例成本?实例可能会做一些会增加运行成本的事情(使用其他 S3 服务、EBS、带宽等中的资源)。
  • Cost Explorer 可能是一个不错的选择。您可以按服务和区域报告/可视化成本,然后根据日期范围、资源类型、标签等进行过滤。这不会,afaik,让您获得特定的 EC2 实例 ID,但它可能会有所帮助。

标签: python python-3.x django amazon-web-services boto3


【解决方案1】:

对我来说,它有助于为实例添加一个单独的标签(例如Id),然后按该标签进行分组:

response = client.get_cost_and_usage(
    TimePeriod={
        'Start': 'string',
        'End': 'string'
    },
    Granularity='DAILY'',
    Metrics=['BlendedCost','UnblendedCost'],
    GroupBy=[
        {
            'Type': 'TAG',
            'Key': 'Id'
        },
    ],
    NextPageToken='string'
)

【讨论】:

    【解决方案2】:

    您可以编写一些代码来计算,没有直接的 API 可用于通过实例 id 计算。

    你可以做的是结合各种 API 调用:

    1. 您可以使用DescribeServices ,您可以获得所有服务中的所有attributes,或者如果您想拥有一个特定的服务,您可以提供名称。 Boto3 致电describe_services

    返回一项服务的元数据或所有服务的元数据列表

    response = client.describe_services(
        FormatVersion='aws_v1',
        MaxResults=1,
        ServiceCode='AmazonEC2',
    )
    

    以上调用为您提供了您想要为下一步创建过滤器的必要属性

    
    {
        'FormatVersion': 'aws_v1',
        'NextToken': 'abcdefg123',
        'Services': [
            {
                'AttributeNames': [
                    'volumeType',
                    'maxIopsvolume',
                    'instanceCapacity10xlarge',
                    'locationType',
                    'operation',
                ],
                'ServiceCode': 'AmazonEC2',
            },
        ],
        'ResponseMetadata': {
            '...': '...',
        },
    }
    
    1. 那么你需要使用GetAttributeValues来确定属性的可能值。 Boto3 致电get_attribute_values
    response = client.get_attribute_values(
        AttributeName='volumeType',
        MaxResults=2,
        ServiceCode='AmazonEC2',
    )
    
    print(response)
    
    {
        'AttributeValues': [
            {
                'Value': 'Throughput Optimized HDD',
            },
            {
                'Value': 'Provisioned IOPS',
            },
        ],
        'NextToken': '',
        'ResponseMetadata': {
            '...': '...',
        },
    }
    
    1. 最后,根据前面步骤中收集的属性,您可以为get_producs 构建过滤器
    FLT = '[{{"Field": "tenancy", "Value": "shared", "Type": "TERM_MATCH"}},'\
          '{{"Field": "operatingSystem", "Value": "{o}", "Type": "TERM_MATCH"}},'\
          '{{"Field": "preInstalledSw", "Value": "NA", "Type": "TERM_MATCH"}},'\
          '{{"Field": "instanceType", "Value": "{t}", "Type": "TERM_MATCH"}},'\
          '{{"Field": "location", "Value": "{r}", "Type": "TERM_MATCH"}},'\
          '{{"Field": "capacitystatus", "Value": "Used", "Type": "TERM_MATCH"}}]'
        
    data = client.get_products(ServiceCode='AmazonEC2', Filters=json.loads(f))
    
    1. 根据实例开始时间确定实例价格后,您只需进行简单的乘法运算即可获得总成本。

    Use boto3 to price for given EC2 instance type

    get ec2 pricing programmatically?

    【讨论】:

      猜你喜欢
      • 2019-01-11
      • 1970-01-01
      • 2021-07-05
      • 1970-01-01
      • 2015-12-28
      • 2019-11-21
      • 2020-09-30
      • 1970-01-01
      • 2016-04-16
      相关资源
      最近更新 更多