使用AWS CLI获取命令状态触发ValidationException错误如何解决
问题原因
你调用jq提取JSON字段时,默认输出会携带外层双引号,因此$command_id变量的实际值为带双引号的"67fb9aed-00bf-4741-ae1a-736ddbfba498",而非你手动输入的纯UUID字符串:
- 带双引号的字符串总长度为38,超出AWS要求的commandId最大长度36位的限制
- 带双引号的内容不符合UUID的正则校验规则,因此触发
ValidationException报错。
修复方法
1. 修正jq提取逻辑
给jq添加-r参数,输出原始无引号的字符串值:
将command_id=$(echo $sh_command_id | jq '.Command.CommandId')修改为:
command_id=$(echo $sh_command_id | jq -r '.Command.CommandId')
同理建议同步修改EC2实例状态提取的代码,简化后续判断逻辑:
# 提取实例状态时也加-r参数 status=$(echo $start | jq -r '.InstanceStatuses[0].InstanceState.Name') # 循环判断无需再匹配带引号的"running" while [ "$status" != "running" ]
2. 修复脚本内的笔误
你现有脚本的循环逻辑存在两处拼写错误,会导致实例启动等待逻辑永久卡住:
- 循环内的
$star变量名拼写错误,应为$start - 循环内jq调用的
InstanceStatueses键名拼写错误,正确为InstanceStatuses
3. 补充SSM命令执行等待逻辑
你当前脚本发送完SSM命令后立刻查询状态、关停实例,会导致命令还没执行完成就被终止,建议添加SSM命令执行状态轮询逻辑:
# 轮询等待SSM命令执行完成 command_status="" while [[ "$command_status" != "Success" && "$command_status" != "Failed" && "$command_status" != "TimedOut" ]] do sleep 10 full_status=$(aws ssm list-commands --command-id $command_id) command_status=$(echo $full_status | jq -r '.Commands[0].Status') done
内容的提问来源于stack exchange,提问作者Henry C Wong
相关产品推荐
相关产品推荐

