通过 instanceId 获取 EC2 价格

通过 instanceId 获取 EC2 价格

我们正在构建一个系统,用于实时(目标延迟约 10 分钟)跟踪云基础设施成本,并提供图表和通知。
我们已经开始使用 AWS,但也计划支持 Azure 和 GCP。
目前我们的重点是跟踪 EC2 按需实例的成本。我们只对实例运行时的成本感兴趣,因此我们对跟踪出口流量、EBS 使用情况或与 ec2 相关的任何其他指标不感兴趣。
为了跟踪每个实例的启动/停止时间,我们使用 CloudWatch Events(EC2 实例状态更改通知)。每个状态更改事件都包含一个 instanceId。
为了获取价格,我们使用 AWS 价格表 API。

要计算成本,我们需要在 Price List API 提供的列表中找到实例的价格。
为了能够将 instanceId 与价格联系起来,我们需要了解有关实例的以下信息(我们目前只提供按需实例):

  • ‘实例类型’ - [m4.xlarge、m4.large、i3.xlarge、r5d.8xlarge、...]
  • ‘位置’ - [us-east-1, us-east-2, us-west-1, ...]
  • “操作系统” - [RHEL、Linux、Windows、SUSE]
  • “许可模式”-[无需许可证,自带许可证]
  • “预安装软件” - [-, SQL Std, SQL Ent, SQL Web]

这些信息中的一些部分(实例类型和位置)以及 imageId 可以通过“describe-instances”命令轻松获取。
其余部分则非常成问题:操作系统、许可模式、预装软件。

操作系统显示在 AWS 控制台中,但没有 API 可以通过编程方式获取它: 图像

有一个“describe-images”命令可以提供有关 EC2 实例正在使用的图像(通过 imageId)的一些信息,但没有直接引用操作系统的类型:

{
    "Images": [
        {
            "Architecture": "x86_64",
            "CreationDate": "2019-06-19T21:59:15.000Z",
            "ImageId": "ami-0b898040803850657",
            "ImageLocation": "amazon/amzn2-ami-hvm-2.0.20190618-x86_64-gp2",
            "ImageType": "machine",
            "Public": true,
            "OwnerId": "137112412989",
            "State": "available",
            "BlockDeviceMappings": [
                {
                    "DeviceName": "/dev/xvda",
                    "Ebs": {
                        "Encrypted": false,
                        "DeleteOnTermination": true,
                        "SnapshotId": "snap-08091107f3acb12b2",
                        "VolumeSize": 8,
                        "VolumeType": "gp2"
                    }
                }
            ],
            "Description": "Amazon Linux 2 AMI 2.0.20190618 x86_64 HVM gp2",
            "EnaSupport": true,
            "Hypervisor": "xen",
            "ImageOwnerAlias": "amazon",
            "Name": "amzn2-ami-hvm-2.0.20190618-x86_64-gp2",
            "RootDeviceName": "/dev/xvda",
            "RootDeviceType": "ebs",
            "SriovNetSupport": "simple",
            "VirtualizationType": "hvm"
        }
    ]
}

还有 AWS Marketplace,它能够在 UI 中显示图像的价格,但不提供公共 API 并且不显示 imageIds: 在此处输入图片描述

现在我们获取实例价格的选项是:

  • 限制支持的图像范围 - 仅使用我们现在操作系统支持的图像
  • 从成本和使用情况报告中获取价格 - 但报告每 24 小时更新一次,因此没有实时
  • 尝试解析“describe-images”命令提供的“描述” - 但不能保证描述中包含正确的操作系统名称
  • 尝试与实例交互以确定其操作系统(可以使用 AWS Systems Manager Inventory) - 这很复杂,需要在实例上安装软件
  • 从 AWS Marketplace 抓取数据——显然没人会这么做
  • 从 AWS 控制台 (即“平台”字段) 抓取数据 - 也不是一个真正的选择
  • 在创建实例期间设置标签 - 如果我们已经有一个创建的实例,这显然是不可能的。

请建议其他方法。

相关内容