配置~/.aws/credentials等信息后调用S3出现NoCredentialsError如何解决
解决boto3调用S3报NoCredentialsError的方案
1. 校验本地AWS配置文件的路径、格式和权限
- 配置文件默认需要放在用户目录的
.aws文件夹下,路径不对会导致boto3无法读取:- Linux/macOS路径:
~/.aws/credentials、~/.aws/config - Windows路径:
C:\Users\你的用户名\.aws\credentials、C:\Users\你的用户名\.aws\config
- Linux/macOS路径:
- 检查文件内容格式:你当前的配置项等号后有多余空格,建议删除避免解析异常,修正后示例:
# credentials文件 [default] aws_access_key_id=my_key_id aws_secret_access_key=my_secret_access# config文件 [default] region=ap-southeast-1 - Linux/macOS下需要给credentials文件设置600权限,权限过高会被boto3拒绝读取,执行命令:
chmod 600 ~/.aws/credentials
2. 校验环境变量配置
- boto3识别的固定环境变量名为
AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_DEFAULT_REGION,注意大小写不要写错 - 确认执行脚本的终端和配置环境变量的终端为同一个,或配置的是全局环境变量:
- Linux/macOS执行
echo $AWS_ACCESS_KEY_ID确认变量是否生效 - Windows执行
echo %AWS_ACCESS_KEY_ID%确认变量是否生效
- Linux/macOS执行
3. 脚本显式传入配置(快速验证用)
如果上述配置确认无误,可以先在脚本中显式传入密钥测试,排除密钥本身无效的问题:
import boto3 # 替换为你的实际密钥信息 s3 = boto3.client( 's3', aws_access_key_id='你的实际access_key_id', aws_secret_access_key='你的实际secret_access_key', region_name='ap-southeast-1' ) s3.put_object(Body='testing', Bucket='file-server-datalake', Key='test.txt')
如果该代码可正常运行,说明密钥本身有效,问题出在boto3读取默认配置的环节。
4. 其他排查点
- 安装awscli后执行
aws configure list,可直接查看当前生效的AWS配置,确认default profile的参数是否和你填写的一致 - 升级boto3到最新版本:
pip install --upgrade boto3,排除版本兼容问题 - 确认你的密钥未过期、未被禁用,且对应账号拥有S3存储桶的
putObject权限
内容的提问来源于stack exchange,提问作者victorxu2
相关产品推荐
相关产品推荐

