使用Python调用DynamoDB时出现NoCredentialsError的原因及解决方法
解决boto3调用DynamoDB时的NoCredentialsError错误
错误原因
NoCredentialsError 本质是boto3无法找到有效的AWS身份凭证,无法完成请求的身份验证。AWS所有服务调用都需要合法凭证来确认访问权限,没有凭证会直接拒绝请求。
解决方法
以下是几种常用的凭证配置方式,按安全性和推荐程度排序:
1. 配置本地AWS凭证文件(推荐)
boto3默认会读取用户目录下的.aws配置文件:
- 找到对应路径:
- Windows:
C:\Users\<你的用户名>\.aws - macOS/Linux:
~/.aws
- Windows:
- 在该目录下创建
credentials文件,写入你的AWS访问密钥:[default] aws_access_key_id = 你的AWS访问密钥ID aws_secret_access_key = 你的AWS秘密访问密钥 - 可选:创建
config文件设置默认区域,避免每次代码里指定:[default] region = us-east-1
配置完成后,boto3会自动读取这些凭证,无需在代码中额外设置。
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秘密访问密钥
设置完成后运行Python代码,boto3会自动读取环境变量中的凭证。
3. 代码中直接指定凭证(仅测试用,不推荐)
如果只是临时测试,可以在创建客户端/资源时直接传入凭证,但绝对不要在生产代码中使用这种方式,会导致密钥泄露:
import boto3 from boto3.dynamodb.conditions import Key TABLE_NAME = "RegData" # 创建客户端时传入凭证 dynamodb_client = boto3.client( 'dynamodb', region_name="us-east-1", aws_access_key_id='你的AWS访问密钥ID', aws_secret_access_key='你的AWS秘密访问密钥' ) # 创建资源时同样可以传入 dynamodb = boto3.resource( 'dynamodb', region_name="us-east-1", aws_access_key_id='你的AWS访问密钥ID', aws_secret_access_key='你的AWS秘密访问密钥' ) table = dynamodb.Table(TABLE_NAME) response = dynamodb_client.get_item( TableName=TABLE_NAME, Key={ 'BarCode': {'S': str(10)}, } ) print(response['Item'])
4. AWS服务环境中运行(如EC2、Lambda)
如果代码在AWS的服务中运行(比如EC2实例、Lambda函数),可以给对应的IAM角色附加允许访问DynamoDB的权限策略,boto3会自动通过IAM角色获取临时凭证,无需手动配置任何密钥。
额外注意
你的错误信息中Key字段写的是artist,但代码里是BarCode,如果这不是笔误,后续验证凭证正常后需要确保Key字段和表的主键一致,否则会出现ResourceNotFoundException或ValidationException。
内容的提问来源于stack exchange,提问作者Malak
相关产品推荐
相关产品推荐

