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

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相关环境变量
排查解决方向
  1. 先对齐脚本和交互式终端的运行环境
    在脚本开头加入以下打印逻辑,同时在正常可用的交互式终端中执行相同命令,对比输出差异:
    #!/bin/bash
    echo "运行用户: $(whoami)"
    echo "HOME路径: $HOME"
    echo "AWS相关环境变量: $(env | grep ^AWS_)"
    ls -l ~/.aws/sso/cache
    
    对比后将缺失的环境变量、路径配置在脚本开头显式声明即可。
  2. 规范执行方式
    尽量不要用sudo执行带AWS SSO鉴权的脚本,如果必须提权,添加-E参数保留当前用户的环境变量:
    sudo -E ./ecr_login.sh
    
  3. 非交互式场景显式指定配置路径
    如果是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
    
  4. 确认SSO凭证有效性
    执行脚本前确认已经在对应运行用户下执行过aws sso login --profile 你的配置名,本地存在未过期的SSO缓存文件(默认有效期8小时)。

内容的提问来源于stack exchange,提问作者Andrei Lupuleasa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 08:00:58