如何统计AWS Spot Fleet累计启动的实例总数量?
我完全懂你的困扰——ami-launch-index确实只能反映当前Spot Fleet批次内的实例索引,一旦实例意外终止被替换,新实例的索引会直接重置为0,根本没法用来统计累计启动的总数。下面给你几个实用的解决方案:
方法1:通过Spot Fleet历史事件统计
AWS Spot Fleet会记录所有关键操作的历史事件,其中就包含实例启动的记录。你可以用AWS CLI直接查询这些事件并计数:
# 替换sfr-xxxxxx为你的Spot Fleet请求ID,调整start-time为统计起始时间 aws ec2 describe-spot-fleet-request-history \ --spot-fleet-request-id sfr-xxxxxx \ --start-time 2024-01-01T00:00:00Z \ --query 'HistoryRecords[?Event.EventType==`instanceLaunched`]' \ --output text | wc -l
这个命令会筛选出所有类型为instanceLaunched的历史事件,最后通过wc -l统计总数,结果就是累计启动的实例数量。
方法2:利用实例标签统计所有曾启动的实例
Spot Fleet的每个实例都会自动带上aws:ec2spot:fleet-request-id标签,标记它所属的Fleet。你可以通过查询所有(包括已终止)带有该标签的实例来统计总数:
# 替换sfr-xxxxxx为你的Spot Fleet请求ID aws ec2 describe-instances \ --filters "Name=tag:aws:ec2spot:fleet-request-id,Values=sfr-xxxxxx" \ --include-all-instances \ --query 'Reservations[].Instances[].InstanceId' \ --output text | wc -l
注意一定要加上--include-all-instances参数,否则默认只会返回当前运行中的实例。这个方法的优势是能直接统计所有曾经属于该Fleet的实例,不管现在是否还在运行。
方法3:用CloudTrail跟踪实例启动事件
如果需要更精细化的审计,你可以通过CloudTrail的RunInstances事件来统计。每个Spot Fleet启动实例都会触发这个事件,你可以通过查询CloudTrail日志,筛选出关联到目标Fleet的事件并计数:
# 替换对应的region、start-time和fleet请求ID aws cloudtrail lookup-events \ --region us-east-1 \ --start-time 2024-01-01T00:00:00Z \ --lookup-attributes AttributeKey=EventName,AttributeValue=RunInstances \ --query 'Events[?CloudTrailEvent.contains(@, `sfr-xxxxxx`)]' \ --output text | wc -l
不过这个方法需要确保CloudTrail已经启用,并且日志保存时间覆盖了你需要统计的范围,可能会有一定的延迟。
总结一下:如果只是需要快速统计累计启动数,方法1和方法2最直接好用;如果需要审计级别的记录,方法3更合适。ami-launch-index因为是批次内索引,确实没法满足累计统计的需求,只能放弃啦。
内容的提问来源于stack exchange,提问作者ikask

