AWS凭证在配置文件可用但环境变量不可用问题排查
问题
直接执行aws s3 ls可正常运行,但运行以下bash脚本时出现签名不匹配错误:
#! /usr/bin/env bash env_vars=$(cat ~/.aws/credentials | tail -n +2 | sed -e 's/ *//g' | tr 'a-z' 'A-Z' | tr '\n' ' ') echo ${env_vars} env ${env_vars} aws s3 ls
错误信息:
An error occurred (SignatureDoesNotMatch) when calling the ListBuckets operation: The request signature we calculated does not match the signature you provided. Check your key and signing method.
已确认凭证完全一致,添加--region us-west-2参数也无法解决问题。
原因与解决方法
环境变量传递格式错误:你的脚本将
~/.aws/credentials内容转大写后直接用空格拼接成字符串,再通过env ${env_vars}传递时,bash会对字符串进行分词拆分,导致AWS所需的环境变量(AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY)没有被正确识别为键值对。比如原文件的键值对经过处理后变成AWS_ACCESS_KEY_ID=AKIAXXX AWS_SECRET_ACCESS_KEY=abc123,但env命令无法正确解析这种空格分隔的字符串为有效环境变量。特殊字符处理隐患:如果凭证密钥包含空格、
&等特殊字符,原脚本的字符串拼接方式会直接破坏密钥完整性,进一步导致签名验证失败。修正后的脚本示例:
#! /usr/bin/env bash # 逐行读取credentials文件(跳过第一行配置段头),处理后导出为环境变量 while IFS='=' read -r raw_key raw_value; do # 清除键值两端空格并将键名转大写 key=$(echo "$raw_key" | sed 's/^ *//;s/ *$//' | tr 'a-z' 'A-Z') value=$(echo "$raw_value" | sed 's/^ *//;s/ *$//') export "$key=$value" done < <(tail -n +2 ~/.aws/credentials) aws s3 ls该脚本通过逐行读取并导出环境变量的方式,确保键值对被正确识别,同时避免了特殊字符的拆分问题。
内容的提问来源于stack exchange,提问作者Foobar
相关产品推荐
相关产品推荐

