我尝试在无服务器的aws lambda中应用一个dynamodb。 我的文件就像:
resources:
Resources:
StoreDynamoDbTable:
Type: 'AWS::DynamoDB::Table'
DeletionPolicy: Retain
Properties:
AttributeDefinitions:
- AttributeName: id
AttributeType: S
- AttributeName: lat
AttributeType: N
- AttributeName: lng
AttributeType: N
KeySchema:
- AttributeName: id
KeyType: HASH
ProvisionedThroughput:
ReadCapacityUnits: 1
WriteCapacityUnits: 1
TableName: ${self:provider.environment.TableStore}
我尝试将lat和lng用作storeTable的属性,只是该属性而不是键Schema,但是每个store元素都应具有这些属性。
但是有错误:
发生错误:StoreDynamoDbTable-属性AttributeDefinitions 与表和辅助表的KeySchema不一致 索引。
如何使lat和lng成为桅杆属性,而不是索引的关键元素?
答案 0 :(得分:2)
DynamoDB要求您仅声明构成关键架构的属性。 (See AWS docs)
如果id
是用于构成关键架构的唯一属性,则您的资源应如下所示:
resources:
Resources:
StoreDynamoDbTable:
Type: 'AWS::DynamoDB::Table'
DeletionPolicy: Retain
Properties:
AttributeDefinitions:
- AttributeName: id
AttributeType: S
KeySchema:
- AttributeName: id
KeyType: HASH
ProvisionedThroughput:
ReadCapacityUnits: 1
WriteCapacityUnits: 1
TableName: ${self:provider.environment.TableStore}
DynamoDB不在乎其他属性。插入数据后,DynamoDB将检测到新属性,而无需在架构中声明它们。这就是非关系数据库的重点。
此外,如果您想在密钥架构中使用日期作为排序密钥,则可以使用以下代码:
resources:
Resources:
StoreDynamoDbTable:
Type: 'AWS::DynamoDB::Table'
DeletionPolicy: Retain
Properties:
AttributeDefinitions:
- AttributeName: id
AttributeType: S
- AttributeName: date
AttributeType: S
KeySchema:
- AttributeName: id
KeyType: HASH
- AttributeName: date
KeyType: RANGE
ProvisionedThroughput:
ReadCapacityUnits: 1
WriteCapacityUnits: 1
TableName: ${self:provider.environment.TableStore}
键架构始终至少具有一个分区(HASH
)键,并且可以选择具有一个排序(RANGE
)键。 Check this to learn more about DynamoDB's key schema.