AWS SAM 在添加 SortKey 或 GlobalSecondaryIndex 时重新创建 DynamoDB Table
AWS SAM recreates DynamoDB Table when adding SortKey or GlobalSecondaryIndex
我正在使用 AWS SAM 部署 DynamoDB table 我的 template.yaml 看起来像这样:
AWSTemplateFormatVersion: "2010-09-09"
Transform: AWS::Serverless-2016-10-31
DynamoDBTable:
Type: AWS::DynamoDB::Table
Properties:
BillingMode: PAY_PER_REQUEST
AttributeDefinitions:
- AttributeName: owner
AttributeType: S
KeySchema:
- AttributeName: owner
KeyType: HASH
我sam build && sam deploy
(重新)部署它。
当我添加 sortKey and/or 和 GlobalSecondaryIndex 时,yaml 文件看起来像这样:
AWSTemplateFormatVersion: "2010-09-09"
Transform: AWS::Serverless-2016-10-31
DynamoDBTable:
Type: AWS::DynamoDB::Table
Properties:
BillingMode: PAY_PER_REQUEST
AttributeDefinitions:
- AttributeName: owner
AttributeType: S
- AttributeName: Timestamp
AttributeType: S
KeySchema:
- AttributeName: owner
KeyType: HASH
- AttributeName: Timestamp
KeyType: RANGE
GlobalSecondaryIndexes:
- IndexName: TestIndex
KeySchema:
- AttributeName: owner
KeyType: HASH
- AttributeName: Timestamp
KeyType: RANGE
Projection:
ProjectionType: KEYS_ONLY
根据 docs 更新这些字段应该是可能的(不会中断)。
但在我的例子中,部署命令总是重新创建整个 table(删除所有数据)。
我是不是做错了什么?
编辑
也许我的解释不清楚。我尝试同时添加(GSI 和 sortKey),但我也尝试逐一添加,即 仅添加 GSI。
添加排序键或以其他方式更改 KeySchema 需要替换 table。请参阅 table 定义的正确 docs。
Adding/Changing LSI也需要更换。
可以不间断地添加 GSI。
虽然我认为更改 GSI KeySchema 也需要更换 GSI...文档似乎暗示它不需要。
DynamoDb tables key schema 和 LSI 只能在 table 创建期间设置,以后只能添加 GSI。
补充一下,我们必须在 Sam/CloudFormation 中为数据库、Dynamo 表等资源添加名称属性,以免被删除。当资源需要替换时,部署会失败,而不是删除并用新资源替换它。
例如:
DynamoDBTable:
Type: AWS::DynamoDB::Table
Properties:
TableName: "test-table"
BillingMode: PAY_PER_REQUEST
我正在使用 AWS SAM 部署 DynamoDB table 我的 template.yaml 看起来像这样:
AWSTemplateFormatVersion: "2010-09-09"
Transform: AWS::Serverless-2016-10-31
DynamoDBTable:
Type: AWS::DynamoDB::Table
Properties:
BillingMode: PAY_PER_REQUEST
AttributeDefinitions:
- AttributeName: owner
AttributeType: S
KeySchema:
- AttributeName: owner
KeyType: HASH
我sam build && sam deploy
(重新)部署它。
当我添加 sortKey and/or 和 GlobalSecondaryIndex 时,yaml 文件看起来像这样:
AWSTemplateFormatVersion: "2010-09-09"
Transform: AWS::Serverless-2016-10-31
DynamoDBTable:
Type: AWS::DynamoDB::Table
Properties:
BillingMode: PAY_PER_REQUEST
AttributeDefinitions:
- AttributeName: owner
AttributeType: S
- AttributeName: Timestamp
AttributeType: S
KeySchema:
- AttributeName: owner
KeyType: HASH
- AttributeName: Timestamp
KeyType: RANGE
GlobalSecondaryIndexes:
- IndexName: TestIndex
KeySchema:
- AttributeName: owner
KeyType: HASH
- AttributeName: Timestamp
KeyType: RANGE
Projection:
ProjectionType: KEYS_ONLY
根据 docs 更新这些字段应该是可能的(不会中断)。 但在我的例子中,部署命令总是重新创建整个 table(删除所有数据)。 我是不是做错了什么?
编辑
也许我的解释不清楚。我尝试同时添加(GSI 和 sortKey),但我也尝试逐一添加,即 仅添加 GSI。
添加排序键或以其他方式更改 KeySchema 需要替换 table。请参阅 table 定义的正确 docs。
Adding/Changing LSI也需要更换。 可以不间断地添加 GSI。
虽然我认为更改 GSI KeySchema 也需要更换 GSI...文档似乎暗示它不需要。
DynamoDb tables key schema 和 LSI 只能在 table 创建期间设置,以后只能添加 GSI。
补充一下,我们必须在 Sam/CloudFormation 中为数据库、Dynamo 表等资源添加名称属性,以免被删除。当资源需要替换时,部署会失败,而不是删除并用新资源替换它。 例如:
DynamoDBTable:
Type: AWS::DynamoDB::Table
Properties:
TableName: "test-table"
BillingMode: PAY_PER_REQUEST