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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 05:12:01