AWS ECS Bash脚本更新服务报错:无效版本号问题排查
问题原因与解决方案
这个问题我太熟悉了!核心问题出在你用jq获取的ARN值带了双引号,而AWS CLI并不需要这些引号作为参数的一部分。
为什么手动复制命令能运行?
当你把echo输出的命令复制到终端时,shell会把双引号当作参数的分隔符处理——它会去掉引号,只把里面的ARN字符串传给AWS CLI,所以命令能正常执行。但在脚本里,变量里的双引号会被直接当作参数的一部分传给AWS CLI,导致它识别成无效的任务定义/服务ARN(因为ARN本身不包含引号),于是抛出InvalidParameterException错误。
修复步骤
你只需要在所有jq命令后加上-r参数(raw output模式),让jq输出不带JSON格式双引号的原始字符串:
修改后的关键代码片段:
# 获取服务ARN(去掉双引号) serviceName=$(aws ecs list-services --cluster $cluster | jq -r '.serviceArns[0]') # 获取所有任务定义ARN(去掉双引号) allTaskDefs=$(aws ecs list-task-definitions | jq -r '.taskDefinitionArns') # 获取最新任务定义ARN(去掉双引号) taskDefLength=$(echo $allTaskDefs | jq '. | length') latestTaskDefArn=$(echo $allTaskDefs | jq -r '.['`expr $taskDefLength - 1`']')
更简洁的写法(推荐)
你可以不用手动计算数组长度,直接用jq的last函数获取最后一个元素,代码更简洁且不易出错:
# 直接获取最新任务定义ARN latestTaskDefArn=$(aws ecs list-task-definitions | jq -r '.taskDefinitionArns | last')
验证修复
修改后,你再运行脚本,变量serviceName和latestTaskDefArn里的值就是纯ARN字符串(不带双引号),传给aws ecs update-service命令时就能被正确识别,不会再出现参数错误了。
内容的提问来源于stack exchange,提问作者user1872371
相关产品推荐
相关产品推荐

