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']
我在 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']