Windows Server 2021运行Django S3上传命令时出现botocore.exceptions.NoCredentialsError的排查求助
解决Windows Server 2021上Django S3上传命令的NoCredentialsError问题
这个问题我碰到过类似的场景,虽然你代码里硬编码了AWS密钥,但Windows Server环境下仍出现凭证找不到的错误,大概率是以下几个原因之一,咱们逐一排查:
1. 代码中S3资源初始化未传入密钥(最可能的原因)
看你的代码,你创建client_s3时正确传入了AWS密钥,但创建s3_resource的时候却没有指定密钥参数:
# 这里没有传入密钥,会使用默认凭证链查找凭证 s3_resource = boto3.resource("s3", region_name="eu-west-2")
而你后续上传文件用的是s3_resource对应的Bucket对象:
my_bucket = s3_resource.Bucket(bucket_name) my_bucket.upload_file(...)
本地Windows 10环境可能因为你之前配置过AWS CLI(比如~/.aws/credentials文件)或者设置了相关环境变量,所以s3_resource能自动找到凭证;但Windows Server上没有这些默认凭证,就会触发NoCredentialsError。
解决方法:创建s3_resource时也传入密钥参数,和client_s3保持一致:
s3_resource = boto3.resource( "s3", region_name="eu-west-2", aws_access_key_id=access_key, aws_secret_access_key=access_secret )
2. Python依赖包版本不一致
本地和服务器上的boto3/botocore版本可能存在差异,旧版本的包可能在处理硬编码密钥时有逻辑问题。
解决方法:
- 在本地运行
pip show boto3和pip show botocore记录版本号 - 在服务器上执行以下命令升级到对应版本:
pip install --upgrade boto3==<本地版本号> botocore==<本地版本号>
3. 服务器环境存在干扰性的AWS凭证源
boto3会按照固定顺序查找凭证(硬编码密钥 → 环境变量 → AWS配置文件 → IAM角色等),如果服务器上存在其他凭证源且内容无效,可能会干扰硬编码密钥的使用:
- 检查服务器是否设置了
AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY环境变量:在CMD中运行echo %AWS_ACCESS_KEY_ID%和echo %AWS_SECRET_ACCESS_KEY%,如果有值且不正确,删除这些环境变量 - 检查服务器用户目录下是否有
~/.aws/credentials文件,如果存在且内容无效,暂时重命名该文件后重试
4. 代码文件权限问题
如果运行Django命令的用户(比如loc用户)没有读取代码文件的权限,可能导致硬编码的密钥无法被正常读取。
解决方法:右键代码文件 → 「属性」→ 「安全」标签,确保运行命令的用户拥有「读取」权限。
内容的提问来源于stack exchange,提问作者user16773013
相关产品推荐
相关产品推荐

