我们正在构建一个系统,用于实时(目标延迟约 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 控制台 (即“平台”字段) 抓取数据 - 也不是一个真正的选择
- 在创建实例期间设置标签 - 如果我们已经有一个创建的实例,这显然是不可能的。
请建议其他方法。