AWS:无法在单个更新中执行多个全局二级索引(GSI)的创建或删除。

8

我最近在进行无服务器部署时遇到了这个问题:

ServerlessError: An error occurred: MyDdbTable - Cannot perform more than one GSI creation or deletion in a single update.

我的DDB表格配置如下:
在serverless.yml中的配置
      AttributeDefinitions:
          - AttributeName: externalId
            AttributeType: S
          - AttributeName: code
            AttributeType: S
          - AttributeName: accountId
            AttributeType: S
        KeySchema:
          - AttributeName: externalId
            KeyType: HASH
          - AttributeName: code
            KeyType: RANGE
        GlobalSecondaryIndexes:
          - IndexName: gsi-account-id
            KeySchema:
              - AttributeName: accountId
                KeyType: HASH
              - AttributeName: code
                KeyType: RANGE
            Projection:
              ProjectionType: ALL
          - IndexName: externalId
            KeySchema:
              - AttributeName: externalId
                KeyType: HASH
            Projection:
              ProjectionType: ALL
          - IndexName: code
            KeySchema:
              - AttributeName: code
                KeyType: RANGE
            Projection:
              ProjectionType: ALL

附加信息:

  • 已经存在一个索引,即gsi-account-id,其中包含两个键模式: accountIdcode
  • 我添加了两个额外的索引,分别是externalIdcode

目标:

我的目标是添加这两个额外的索引(externalIdcode),但在进行无服务器部署时,我总是遇到上面提到的问题。

问题:

  1. 如果第一键模式(gsi-account-id)中已经存在该代码,我是否会遇到此问题?
  2. 如果问题1不是答案,你有任何想法/建议吗?

感谢那些将帮助我的人。 ❤️


添加GSI,部署,重复。 - jarmod
谢谢您的回复。请问添加GSI是什么意思?因为我现在遇到的问题是“无法在单个更新中执行多个GSI创建或删除”。 - Z Mars
2
您的表目前只有一个索引(GSI)。您需要3个索引。您一次只能添加一个索引。因此,请将第2个索引添加到您的模板中,部署它。然后对于剩余的第3个索引也做同样的操作。 - jarmod
哦,我现在明白了。谢谢你。让我现在就试一下,然后会更新给你们。感谢你们的帮助! - Z Mars
@jarmod 的建议有效!非常感谢你的帮助。 - Z Mars
1个回答

17
根据文档,每次 UpdateTable 操作只能创建一个全局二级索引。 你需要添加一个 GSI,部署该更改,然后再添加第二个并进行部署。

28
那很糟糕。 - Jonesie
8
AWS:“使用基础架构即代码”。此外,AWS也说:这个。 - jameslol
CDK为什么会这样?“一次只能有一个GSI”规则背后的原因是什么? - colefner
3
这不是CDK的限制,而是CloudFormation的限制。添加GSI并不是一项小任务。您实际上是在告诉DynamoDB扫描整个表格,并为GSI制作数据副本。请记住,DynamoDB不知道索引中的字段是否已经存在于数据中。因此,即使不包括在GSI中,每条记录也必须被查看。 - Jason Wadsworth
1
现在最好的是有一条前进的道路。目前你会遇到错误,然后谷歌这个错误,删除一些代码,甚至编写一些新的临时代码,反复洗刷直到你的模板恢复到你真正想要的样子。这需要相当大的努力。 - Benjamin Carlsson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接