You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写脚本批量检查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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 09:19:37