SAM部署报错botocore.exceptions.NoCredentialsError如何解决
SAM部署报
botocore.exceptions.NoCredentialsError排查思路 核心前提:aws s3 ls可正常运行仅代表当前用户下的AWS CLI基础凭证配置有效,SAM无法定位凭证均为凭证加载链路不匹配导致,按以下顺序逐一排查即可:
- 对齐SAM执行的上下文环境
首先在执行SAM部署命令的同一个终端、同权限级别下执行aws sts get-caller-identity验证凭证有效性:- 如果该命令也报凭证错误,说明执行上下文不一致:如果是加了sudo跑SAM,补加
-E参数保留当前用户环境变量,或直接取消sudo用普通用户执行SAM;如果是在conda/venv虚拟环境内执行,先在当前虚拟环境重装awscli对齐botocore的凭证加载逻辑,避免虚拟环境内独立安装的旧版botocore不识别本地凭证格式。 - 如果是在容器化环境、WSL2内执行SAM,需要确认当前环境是否能正确挂载宿主机的
~/.aws目录,跨环境执行时凭证不会自动同步。
- 如果该命令也报凭证错误,说明执行上下文不一致:如果是加了sudo跑SAM,补加
- 排查高优先级凭证配置冲突
botocore加载凭证的优先级从高到低为:命令行显式传入参数 > 进程环境变量 > 容器/EC2实例角色 >~/.aws/credentials配置项 >~/.aws/config配置项 > 元数据服务。
执行env | grep AWS_检查当前终端是否存在残留的错误环境变量:包括失效的AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY/AWS_SESSION_TOKEN、指向不存在配置的AWS_PROFILE,这类变量优先级高于本地配置文件,哪怕本地配置正确也会触发凭证错误。存在残留变量直接执行unset 对应变量名清除即可,也可以在执行SAM命令时显式指定正确的配置文件:sam deploy --profile 你本地可用的配置文件名。 - 修复SAM版本与缓存问题
1.70版本前的SAM CLI存在已知的凭证缓存bug,之前使用过临时凭证后切换为永久凭证时,会持续读取失效的缓存凭证路径。先执行sam --version确认版本,低于1.70先升级到稳定版,再删除SAM本地缓存:- Linux/macOS执行
rm -rf ~/.aws-sam/cache - Windows执行
rd /s /q %USERPROFILE%\.aws-sam\cache
清理完成后重新执行部署命令。
- Linux/macOS执行
- 排查构建容器的凭证透传问题
如果部署时使用了SAM的容器构建能力(加了--use-container参数),构建容器默认不会自动读取宿主机的AWS配置,需要显式透传凭证参数:执行部署命令时追加--container-env-var AWS_PROFILE=你本地的配置文件名,或直接将有效凭证通过环境变量透传到容器内,否则容器内运行的botocore会直接报找不到凭证。
快速定位技巧:执行SAM命令时加
--debug参数打印完整日志,过滤凭证相关日志可以直接定位加载失败的具体原因:sam deploy --debug 2>&1 | grep -i credential
内容的提问来源于stack exchange,提问作者Youssef Ahmed
相关产品推荐
相关产品推荐

