AWS boto3 键元素与架构不匹配

AWS boto3 key element does not match schema

我在 dynamoDB 中创建了一个 table,我正在尝试读取 python。

错误消息是:“提供的关键元素与架构不匹配”

数据库只有一个主分区键:

这是我的功能:

def get_db_info(search_val='DEF123'):
    sts_client = boto3.client(
        'sts',
        region_name='us-east-1'
        )
    # Call the assume_role method of the STSConnection object and pass the role
    # ARN and a role session name.
    assumed_role_object=sts_client.assume_role(
        RoleArn="arn:aws:iam::123456789:role/Server1_role",
        RoleSessionName="AssumeRoleSession1"
    )
    
    credentials=assumed_role_object['Credentials']
    
    dynamodb = boto3.resource(
        'dynamodb', 
        region_name='us-east-1',
        aws_access_key_id=credentials['AccessKeyId'],
        aws_secret_access_key=credentials['SecretAccessKey'],
        aws_session_token=credentials['SessionToken'],
    )
    
    table = dynamodb.Table('defect-tracking')
    
    try:
        response = table.get_item(Key={"defect_id": search_val})
    except ClientError as e:
        return 'this is an error: ' + e.response['Error']['Message']
    else:
        return response['Item']

为了重现您的情况,我执行了以下操作:

  • 创建了一个名为 defect-tracking 的 DynamoDB table,主键为 defect_id(字符串)
  • 运行 您的代码的这个简化版本:
import boto3

search_val = 'DEF123'

dynamodb = boto3.resource('dynamodb')

table = dynamodb.Table('defect-tracking')

response = table.get_item(Key={"defect_id": search_val})

print(response)

它对我来说很好。它使用了对 DynamoDB 具有完全访问权限的 IAM 用户凭据。

这行得通。一定是函数调用方式的问题改变了 search_val:

的默认值
def get_db_info():
    sts_client = boto3.client(
        'sts',
        region_name='us-east-1'
        )
    # Call the assume_role method of the STSConnection object and pass the role
    # ARN and a role session name.
    assumed_role_object=sts_client.assume_role(
        RoleArn="arn:aws:iam::123456789:role/Server1_role",
        RoleSessionName="AssumeRoleSession1"
    )
    
    credentials=assumed_role_object['Credentials']
    
    dynamodb = boto3.resource(
        'dynamodb', 
        region_name='us-east-1',
        aws_access_key_id=credentials['AccessKeyId'],
        aws_secret_access_key=credentials['SecretAccessKey'],
        aws_session_token=credentials['SessionToken'],
    )
    
    table = dynamodb.Table('defect-tracking')
    
    try:
        response = table.get_item(Key={"defect_id": 'DEF123'})
    except ClientError as e:
        return 'this is an error: ' + e.response['Error']['Message']
    else:
        return response['Item']