Shell脚本执行AWS CLI报NoCredentialsError无法定位凭证
问题根因
该报错并非遗漏配置项导致,核心原因是Shell脚本的运行上下文和交互式终端的上下文不一致,AWS CLI未正确加载SSO凭证配置,直接跳过了SSO凭证检索流程。
对比两份DEBUG日志可以直接看到差异:交互式终端执行命令时,凭证查找链路包含Looking for credentials via: sso环节,可正常读取本地缓存的SSO凭证完成鉴权;脚本执行时的凭证查找列表完全没有SSO检索步骤,从assume-role环节直接跳转至shared-credentials-file检索,遍历完所有凭证渠道都找不到有效信息后抛出NoCredentialsError。
常见触发场景:
- 执行脚本时使用了
sudo提权,sudo默认会重置用户级环境变量,切换身份后无法读取原用户home目录下的~/.aws/sso/cache缓存与AWS配置文件 - 脚本运行在crontab、systemd服务、CI流水线等非交互式Shell环境中,这类环境不会加载用户登录交互式终端时自动注入的
HOME、AWS_CONFIG_FILE等环境变量,导致AWS CLI找不到配置路径 - 脚本Shebang指定的Shell解释器和日常使用的交互式Shell不一致,不同Shell的配置文件加载逻辑不同,未继承交互式终端中设置的AWS相关环境变量
排查解决方向
- 先对齐脚本和交互式终端的运行环境
在脚本开头加入以下打印逻辑,同时在正常可用的交互式终端中执行相同命令,对比输出差异:
对比后将缺失的环境变量、路径配置在脚本开头显式声明即可。#!/bin/bash echo "运行用户: $(whoami)" echo "HOME路径: $HOME" echo "AWS相关环境变量: $(env | grep ^AWS_)" ls -l ~/.aws/sso/cache - 规范执行方式
尽量不要用sudo执行带AWS SSO鉴权的脚本,如果必须提权,添加-E参数保留当前用户的环境变量:sudo -E ./ecr_login.sh - 非交互式场景显式指定配置路径
如果是crontab、自动任务类场景,直接在脚本中显式写明AWS配置文件的绝对路径,避免依赖环境变量自动加载:# 替换为自己的用户目录实际路径 export AWS_CONFIG_FILE=/home/your_username/.aws/config export AWS_SHARED_CREDENTIALS_FILE=/home/your_username/.aws/credentials aws ecr get-login-password --region xxx --profile xxx | docker login --username AWS --password-stdin xxxxxx.amazonaws.com - 确认SSO凭证有效性
执行脚本前确认已经在对应运行用户下执行过aws sso login --profile 你的配置名,本地存在未过期的SSO缓存文件(默认有效期8小时)。
内容的提问来源于stack exchange,提问作者Andrei Lupuleasa
相关产品推荐
相关产品推荐

