如何获取Auto Scaling组内实例的ID?以及修复获取Auto Scaling组内已停止实例ID的Bash脚本返回空值问题
有两种实用方法,优先推荐使用Auto Scaling专用的CLI命令,它直接从ASG的管理数据中拉取信息,比EC2标签过滤更准确可靠:
使用
aws autoscaling命令(推荐):aws autoscaling describe-auto-scaling-groups \ --auto-scaling-group-names devASG-123 \ --query "AutoScalingGroups[].Instances[].InstanceId" \ --output text \ --profile dev这个命令会返回指定ASG下当前所有关联的实例ID,无论实例处于什么生命周期状态。
使用
aws ec2命令通过标签过滤:
每个隶属于ASG的实例都会被自动打上aws:autoscaling:groupName标签,值对应所属ASG的名称,因此可以通过标签过滤查询:aws ec2 describe-instances \ --filter "Name=tag:aws:autoscaling:groupName,Values=devASG-123" \ --query "Reservations[].Instances[].InstanceId" \ --output text \ --profile dev注意:如果实例已经被ASG移除(比如停止后被自动终止或移出组),这种方法就无法查到对应实例了。
你的脚本返回空值大概率是下面两个原因之一,我们逐一排查解决:
原因1:JMESPath查询语法错误
你在--query参数里的条件State.Name==stopped存在语法问题——在JMESPath语法中,字符串类型的取值必须用引号包裹,你直接写stopped会让JMESPath无法识别这是字符串值,自然匹配不到任何实例。
修正后的命令需要给stopped加上单引号(因为整个query参数已经用双引号包裹,避免符号冲突):
aws ec2 describe-instances \ --filter "Name=tag:aws:autoscaling:groupName,Values=devASG-123" \ --query "Reservations[].Instances[?State.Name=='stopped'].InstanceId" \ --output text \ --profile dev
原因2:已停止的实例已被Auto Scaling组移除
默认情况下,当Auto Scaling组检测到实例处于停止状态时,会自动将其从组中移除(甚至根据配置终止实例),此时这些实例的aws:autoscaling:groupName标签会被删除,用标签过滤自然找不到。
如果是这种情况,你需要用aws autoscaling命令结合实例生命周期状态查询(ASG的生命周期状态和EC2的实例状态是两个独立概念):
aws autoscaling describe-auto-scaling-groups \ --auto-scaling-group-names devASG-123 \ --query "AutoScalingGroups[].Instances[?LifecycleState=='Stopped'].InstanceId" \ --output text \ --profile dev
这个命令会返回ASG中标记为Stopped生命周期状态的实例ID,即使EC2实例本身处于停止状态且仍在ASG关联列表中。
建议先尝试第一个修正后的EC2命令,如果还是返回空,再用ASG命令检查这些停止的实例是否还隶属于目标ASG。
内容的提问来源于stack exchange,提问作者TheWalkingMalteser

