You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python调用DynamoDB时出现NoCredentialsError的原因及解决方法

解决boto3调用DynamoDB时的NoCredentialsError错误

错误原因

NoCredentialsError 本质是boto3无法找到有效的AWS身份凭证,无法完成请求的身份验证。AWS所有服务调用都需要合法凭证来确认访问权限,没有凭证会直接拒绝请求。

解决方法

以下是几种常用的凭证配置方式,按安全性和推荐程度排序:

1. 配置本地AWS凭证文件(推荐)

boto3默认会读取用户目录下的.aws配置文件:

  • 找到对应路径:
    • Windows:C:\Users\<你的用户名>\.aws
    • macOS/Linux:~/.aws
  • 在该目录下创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 00:43:06