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

执行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}'

问题分析

  1. 核心错误原因:脚本中VERSION变量是从命令行第一个参数$1获取的,但你是通过设置环境变量VERSION=v1.23传递版本号,没有在运行脚本时传入参数,导致VERSION变量为空。这会让SSM参数路径变成/aws/service/eks/optimized-ami//amazon-linux-2/recommended/image_id(出现连续斜杠),不符合AWS SSM参数路径的格式要求,从而触发ValidationException错误。
  2. 次要问题:脚本最后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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 14:45:28