Мы строим систему для отслеживания затрат облачной инфраструктуры в реальном времени (целевая задержка ~ 10 мин) с помощью графиков и уведомлений.
Мы начали с AWS, но также планируем поддерживать Azure и GCP.
В настоящее время наша цель - отслеживать затраты на инстансы EC2 On-Demand. Нас интересуют только затраты на время работы экземпляра, поэтому мы не заинтересованы в отслеживании исходящего трафика, использования EBS или каких-либо других показателей, связанных с ec2.
Чтобы отслеживать, когда каждый экземпляр был запущен / остановлен, мы используем CloudWatch Events (уведомление об изменении состояния экземпляра EC2). Каждое событие изменения состояния содержит instanceId.
Для получения цен мы используем API-интерфейс AWS Price List.
Чтобы рассчитать стоимость, нам нужно найти цены на наши экземпляры в списке, предоставляемом API прайс-листа.
Чтобы иметь возможность связать instanceId с ценой, нам нужно знать эту информацию об экземпляре (на данный момент мы используем только экземпляры On-Demand):
Некоторые части этой информации (тип и расположение экземпляра) вместе с imageId могут быть легко получены с помощью команды «describe-instance».
Остальное очень проблематично: операционная система, модель лицензии, предустановленное ПО.
Операционная система отображается в консоли AWS, но API для ее получения программным способом отсутствует:
Существует команда "describe-images", которая может предоставить некоторую информацию об изображении (по imageId), которое использует экземпляр EC2, но нет прямой ссылки на тип ОС:
{
"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, который может отображать цены на изображения в пользовательском интерфейсе, но не предоставляет общедоступный API и не отображает imageIds:
Теперь у нас есть следующие варианты получения цены экземпляра:
Подскажите, пожалуйста, другие способы.