使用AWS官方boto3代码传文件至S3遇NoCredentialsError问题排查
错误原因
这个错误本质是boto3找不到有效的AWS身份凭证,无法完成S3服务的身份校验。AWS要求所有访问云服务的请求必须携带合法凭证,用来确认请求者的身份和操作权限。
修复方案
下面是几种常用的凭证配置方式,按生产环境推荐度排序:
1. 使用AWS凭证配置文件(本地开发首选)
这是本地调试最安全、最常用的方式:
- 先在本地创建凭证文件:
- Windows路径:
C:\Users\<你的用户名>\.aws\credentials - macOS/Linux路径:
~/.aws/credentials
- Windows路径:
- 文件格式如下,替换成你自己的实际凭证:
[default] aws_access_key_id = 你的AWS访问密钥ID aws_secret_access_key = 你的AWS秘密访问密钥 - 注意:这两个密钥需要从AWS控制台的IAM用户页面获取,且该IAM用户必须拥有s3:PutObject权限(可通过IAM策略配置)。
2. 设置系统环境变量
临时测试或者不想修改配置文件时可以用这种方式:
- 在终端/命令行中设置环境变量:
- macOS/Linux:
export AWS_ACCESS_KEY_ID="你的AWS访问密钥ID" export AWS_SECRET_ACCESS_KEY="你的AWS秘密访问密钥" - Windows(命令提示符):
set AWS_ACCESS_KEY_ID="你的AWS访问密钥ID" set AWS_SECRET_ACCESS_KEY="你的AWS秘密访问密钥" - Windows(PowerShell):
$env:AWS_ACCESS_KEY_ID="你的AWS访问密钥ID" $env:AWS_SECRET_ACCESS_KEY="你的AWS秘密访问密钥"
- macOS/Linux:
- 设置完成后,重新运行你的Python代码即可。
3. 代码中直接指定凭证(仅临时测试用,不推荐)
虽然可以直接在代码里传入凭证,但硬编码敏感信息会带来泄露风险,只适合临时调试:
修改创建s3_client的代码段:
s3_client = boto3.client( 's3', aws_access_key_id='你的AWS访问密钥ID', aws_secret_access_key='你的AWS秘密访问密钥' )
4. 使用IAM角色(AWS云环境内运行首选)
如果你的代码是在EC2实例、ECS容器或者Lambda等AWS服务中运行,推荐给对应资源绑定IAM角色,boto3会自动获取角色凭证,无需手动配置:
- 给目标AWS资源(比如EC2)附加具备S3上传权限的IAM角色
- 代码无需修改,boto3会自动从元数据服务获取凭证
额外注意事项
- 权限校验:确保你的IAM用户/角色拥有足够权限,至少要允许
s3:PutObject操作,且资源范围要包含目标存储桶(比如arn:aws:s3:::call-lists/*) - 凭证正确性:复制密钥时注意不要带多余空格或字符错误
- 多配置文件:如果本地有多个AWS配置文件,可以在代码中指定使用的配置文件:
boto3.client('s3', profile_name='你的配置文件名称')
内容的提问来源于stack exchange,提问作者Mark Hardy
相关产品推荐
相关产品推荐

