执行Bash脚本遇ValidationException:获取K8s Worker节点AMI ID失败
解决Bash脚本获取EKS优化AMI ID时的ValidationException错误
问题背景
我编写了一个Bash脚本用于获取EKS Worker节点的最新优化AMI ID,但运行./build-versions.sh时总是报错。我先设置了VERSION=v1.23再执行脚本,单独执行脚本里的AWS命令时可以正常运行。
报错信息如下:
调用GetParameter操作时出现ValidationException,提示参数名称不能以“ssm”为前缀(不区分大小写),若为路径格式,需由斜杠分隔的子路径组成,子路径可包含字母、数字及.-_符号。
脚本代码:
#!/bin/bash VERSION=$1 SOURCE_AMI_ID=$(aws ssm get-parameter --name /aws/service/eks/optimized-ami/${VERSION}/amazon-linux-2/recommended/image_id --region us-west-2 --query "Parameter.Value" --output text) SOURCE_AMI_NAME=$(aws ec2 describe-images --image-ids ${SOURCE_AMI_ID} | jq -r '.Images[0].Name') AMI_NAME=$(echo "${SOURCE_AMI_NAME}" | sed 's/amazon/kube-infra/g') jq -n \ --arg source_ami_id "${SOURCE_AMI_ID}" \ --arg source_ami_name "${SOURCE_AMI_NAME}" \ --arg cp_ami_name "${CP_AMI_NAME}" \ '{source_ami_id: $source_ami_id, source_ami_name: $source_ami_name, ami_name: $ami_name}'
问题分析
- 核心错误原因:脚本中
VERSION变量是从命令行第一个参数$1获取的,但你是通过设置环境变量VERSION=v1.23传递版本号,没有在运行脚本时传入参数,导致VERSION变量为空。这会让SSM参数路径变成/aws/service/eks/optimized-ami//amazon-linux-2/recommended/image_id(出现连续斜杠),不符合AWS SSM参数路径的格式要求,从而触发ValidationException错误。 - 次要问题:脚本最后jq命令中使用了未定义的
${CP_AMI_NAME}变量,应该改为${AMI_NAME},否则输出的对应字段会是空值。
解决方案
方案1:直接传递命令行参数运行
运行脚本时将版本号作为参数传入,无需提前设置环境变量:
./build-versions.sh v1.23
方案2:修改脚本支持环境变量/命令行参数双模式
修改脚本中VERSION的赋值逻辑,优先读取环境变量,若环境变量不存在再读取命令行参数,同时修复jq变量错误:
#!/bin/bash # 优先从环境变量获取VERSION,否则取命令行第一个参数 VERSION=${VERSION:-$1} # 检查VERSION是否为空,为空则报错退出 if [ -z "${VERSION}" ]; then echo "错误:请设置VERSION环境变量或传递版本号作为命令行参数" exit 1 fi SOURCE_AMI_ID=$(aws ssm get-parameter --name /aws/service/eks/optimized-ami/${VERSION}/amazon-linux-2/recommended/image_id --region us-west-2 --query "Parameter.Value" --output text) SOURCE_AMI_NAME=$(aws ec2 describe-images --image-ids ${SOURCE_AMI_ID} | jq -r '.Images[0].Name') AMI_NAME=$(echo "${SOURCE_AMI_NAME}" | sed 's/amazon/kube-infra/g') jq -n \ --arg source_ami_id "${SOURCE_AMI_ID}" \ --arg source_ami_name "${SOURCE_AMI_NAME}" \ --arg ami_name "${AMI_NAME}" \ '{source_ami_id: $source_ami_id, source_ami_name: $source_ami_name, ami_name: $ami_name}'
修改后,你既可以通过VERSION=v1.23 ./build-versions.sh运行,也可以通过./build-versions.sh v1.23运行,同时解决了jq输出字段为空的问题。
内容的提问来源于stack exchange,提问作者Satyam Pandey
相关产品推荐
相关产品推荐

