如何编写脚本批量检查EC2非对称集群中EBS卷的优化完成状态?
如何编写脚本批量检查EC2非对称集群中EBS卷的优化完成状态?
嘿,我太懂手动在AWS控制台蹲EBS卷优化状态有多闹心了——尤其是非对称集群,节点配置参差不齐,很容易漏看或者看错。我之前处理类似场景时,也踩过手动检查的坑,后来写了个脚本自动化这个流程,给你分享下思路和具体实现:
第一步:批量获取目标集群的EBS卷ID
你已经找到了获取实例和关联卷的命令,我们可以在此基础上,把所有符合条件的卷ID提取出来(用jq处理JSON输出会更省心,建议提前安装好jq):
# 先定义你的配置参数,替换成自己的实际值 PROFILE="your-aws-profile" REGION="your-aws-region" PREFIX="your-instance-name-prefix" # 提取所有目标实例关联的EBS卷ID,自动去重 VOLUME_IDS=$(aws --profile "$PROFILE" ec2 describe-instances --region "$REGION" \ --filters "Name=tag:Name,Values=${PREFIX}*" \ --query 'Reservations[*].Instances[*].BlockDeviceMappings[*].Ebs.VolumeId' \ | jq -r 'flatten | unique | .[]')
如果没有安装jq,也可以用grep+awk来提取,但处理起来会麻烦些,比如:
VOLUME_IDS=$(aws --profile "$PROFILE" ec2 describe-instances --region "$REGION" \ --filters "Name=tag:Name,Values=${PREFIX}*" \ --query 'Reservations[*].Instances[*].BlockDeviceMappings[*].Ebs.VolumeId' \ | grep -o '"vol-[a-f0-9]*"' | tr -d '"' | sort -u)
第二步:批量检查卷的优化状态
拿到卷ID后,我们用ec2 describe-volumes-modifications命令批量查询这些卷的修改状态——这个命令专门用来查看EBS卷扩容后的优化进度:
# 批量查询卷的修改状态,只返回关键信息 aws --profile "$PROFILE" ec2 describe-volumes-modifications --region "$REGION" \ --volume-ids $VOLUME_IDS \ --query 'VolumesModifications[*].[VolumeId, ModificationState, TargetSize]' \ --output table
输出里的ModificationState字段就是我们要重点关注的:
- 如果是
optimizing:说明卷还在优化中,不能执行那些敏感操作 - 如果是
completed:优化已经完成,可以放心操作 - 如果卷从来没做过修改,不会出现在这个命令的结果里,默认就是状态正常的
第三步:封装成自动化脚本(带状态判断)
如果要实现“检查通过再执行后续操作”的逻辑,可以把上面的步骤整合成一个完整脚本,自动判断是否有卷在优化:
#!/bin/bash # 配置参数,替换成你的实际值 PROFILE="your-aws-profile" REGION="your-aws-region" PREFIX="your-instance-name-prefix" # 获取目标卷ID VOLUME_IDS=$(aws --profile "$PROFILE" ec2 describe-instances --region "$REGION" \ --filters "Name=tag:Name,Values=${PREFIX}*" \ --query 'Reservations[*].Instances[*].BlockDeviceMappings[*].Ebs.VolumeId' \ | jq -r 'flatten | unique | .[]') # 判断是否找到卷 if [ -z "$VOLUME_IDS" ]; then echo "⚠️ 没有找到符合条件的EBS卷" exit 0 fi # 检查是否有卷在优化中 OPTIMIZING_VOLUMES=$(aws --profile "$PROFILE" ec2 describe-volumes-modifications --region "$REGION" \ --volume-ids $VOLUME_IDS \ --query 'VolumesModifications[?ModificationState==`optimizing`]') if [ "$OPTIMIZING_VOLUMES" != "[]" ]; then echo "❌ 以下EBS卷正在优化中,暂时无法执行敏感操作:" aws --profile "$PROFILE" ec2 describe-volumes-modifications --region "$REGION" \ --volume-ids $VOLUME_IDS \ --query 'VolumesModifications[?ModificationState==`optimizing`].[VolumeId, TargetSize]' \ --output table exit 1 else echo "✅ 所有EBS卷均已完成优化,可以执行后续操作!" # 在这里添加你需要执行的操作命令,比如集群配置更新、重启节点等 # example: aws --profile "$PROFILE" ec2 reboot-instances --region "$REGION" --instance-ids $(your-instance-id-command) fi
小提示
- 如果你的集群节点很多,这个脚本会比手动检查高效太多,而且能避免人为错误
- 可以把这个脚本加到定时任务里,或者集成到你的CI/CD流程中,自动触发检查
备注:内容来源于stack exchange,提问作者symcbean
相关产品推荐
相关产品推荐

