AWS SAM воссоздает таблицу DynamoDB при добавлении SortKey или GlobalSecondaryIndex

Я использую AWS SAM для развертывания таблицы DynamoDB, и мой 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 и/или 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

В соответствии с документами, обновляющими эти поля должны быть возможны (без прерывания). Но в моем случае команда deploy всегда воссоздает всю таблицу (удаляя все данные). Я делаю что-то не так здесь?

Редактировать

Может быть, мое объяснение было неясным по этому поводу. Я пытался добавить оба (GSI и sortKey), но я также пробовал добавлять каждый по одному, т.е. просто добавляя GSI.


person mRcSchwering    schedule 05.01.2021    source источник


Ответы (2)


Схему ключей таблиц DynamoDb и LSI можно задать только во время создания таблицы, а позже можно будет добавить только GSI.

Просто чтобы добавить к этому, мы должны добавить атрибут имени в Sam/CloudFormation к ресурсам, таким как базы данных, таблицы Dynamo и т. д., чтобы избежать удаления. Когда ресурс нуждается в замене, произойдет сбой развертывания, а не его удаления и замены новым ресурсом. Бывший:

DynamoDBTable:
   Type: AWS::DynamoDB::Table
   Properties:
     TableName: "test-table"
     BillingMode: PAY_PER_REQUEST
person Balu Vyamajala    schedule 05.01.2021
comment
TableName был ключом. Спасибо - person mRcSchwering; 07.01.2021

Добавление ключа сортировки или иное изменение KeySchema требует замены таблицы. См. правильные документы для определение таблицы.

введите здесь описание изображения

Добавление/изменение LSI также требует замены. Добавление GSI может быть выполнено без перерыва.

Хотя я думаю, что изменение ключевой схемы GSI потребует также замены GSI ... документы, похоже, подразумевают, что это не так.

person Charles    schedule 05.01.2021
comment
Как указано выше. Если я добавлю только GSI (не касаясь KeySchema), он попытается воссоздать таблицу. - person mRcSchwering; 07.01.2021