EC2实例容器调用AWS接口报InvalidClientTokenId错误求助
解决AWS CLI InvalidClientTokenId错误的排查步骤
1. 修复环境变量导出的引号问题
你的脚本中使用jq获取密钥时未加-r参数,导致输出的密钥带有双引号,直接导出会让环境变量值包含引号,这是最常见的触发错误的原因。修改脚本如下:
export $(printf "AWS_ACCESS_KEY_ID=%s AWS_SECRET_ACCESS_KEY=%s" \ $(aws secretsmanager get-secret-value \ --secret-id arn:aws-cn:secretsmanager:********* \ --query 'SecretString' --output=text | jq -r '.ACCESS_KEY_TEST,.SECRET_KEY_TEST')) unset AWS_SESSION_TOKEN unset AWS_PROFILE # 额外清理可能的配置文件干扰 # 验证变量是否正确 echo "Access Key: $AWS_ACCESS_KEY_ID" echo "Secret Key: $AWS_SECRET_ACCESS_KEY" aws sts get-caller-identity --region <目标区域>
jq -r会输出原始字符串(不带引号),确保环境变量值是纯密钥内容。
2. 排查容器内的其他凭证来源
- 检查容器内是否存在
~/.aws/credentials文件,如果有,删除或重命名它,避免该文件内的凭证覆盖环境变量:rm -f ~/.aws/credentials - 检查是否有
AWS_PROFILE环境变量,它会让CLI优先使用指定配置文件的凭证,直接unset即可(如上脚本所示)。
3. 验证密钥本身的有效性
从Secrets Manager中提取密钥值,在本地环境测试:
export AWS_ACCESS_KEY_ID="你的密钥ID" export AWS_SECRET_ACCESS_KEY="你的密钥Secret" aws sts get-caller-identity --region <目标区域>
如果这里也报错,说明密钥本身无效:
- 确认密钥属于目标AWS账号,且未被禁用/过期
- 联系目标账号管理员重新生成有效密钥
4. 排除实例元数据的干扰
如果容器仍在使用EC2实例的Instance Profile凭证,可以在调用CLI时强制指定使用环境变量:
aws sts get-caller-identity --region <目标区域> \ --aws-access-key-id $AWS_ACCESS_KEY_ID \ --aws-secret-access-key $AWS_SECRET_ACCESS_KEY
这种方式会绕过所有其他凭证来源,直接使用你指定的密钥。
内容的提问来源于stack exchange,提问作者gigatt
相关产品推荐
相关产品推荐

