Local secondary indexes must be specified at table creation
TL;DR — 本地二级索引(LSI)只能在其表被创建的那一刻创建;之后无法添加、更改或移除。UpdateTable 没有针对 LSI 的操作,因此任何向活动表添加 LSI 的尝试都会验证失败。要得到一个新的 LSI,你必须创建一张新表(带该 LSI)并迁移数据——或者使用一个全局二级索引(GSI),它_可以_在线添加。
含义
ValidationException: One or more parameter values were invalid: Local secondary
indexes can only be created when a table is created一个 LSI 与基础表共享分区键并添加一个备用排序键;DynamoDB 在写入时把它与项目的分区放在一起。由于这种物理耦合,LSI 必须从表的第一次写入起就存在——UpdateTable 支持添加/移除 GSI,但根本没有 LSI 参数,因此你甚至无法发送任何能够事后补加它的请求。确切的消息因路径而异(SDK/CLI 调用可能在客户端参数验证失败;IaC 工具会呈现它们自己的措辞),但服务端形式是一个 HTTP 400 ValidationException,且不可重试:这个操作在已有的表上根本不受支持。
为什么会发生
- 向活动表添加 LSI——调用
UpdateTable(或编辑 CloudFormation/Terraform 模板)在一张已存在的表上引入一个新的LocalSecondaryIndexes条目。 - 更改现有的 LSI——其键模式或投影在创建时就固定了;编辑会被拒绝。
- 重建而非更新的 IaC 差异——工具尝试就地更新一个 DynamoDB 只允许在创建时进行的 LSI 变更。
如何修复
- 创建一张新表,预先定义好 LSI,然后迁移数据(扫描并写入,或按需导出/导入)。
- 如果访问模式允许,改用 GSI——GSI 可以在线添加到已有的表,且不要求相同的分区键:
aws dynamodb update-table --table-name <Table> \ --attribute-definitions AttributeName=gsi_sk,AttributeType=S \ --global-secondary-index-updates '[{"Create":{"IndexName":"gsi1", ...}}]' - 在建模阶段规划 LSI——在表存在之前就决定好备用排序键,因为它们无法事后补加。
在 DynoTable 中检查大小
在为 LSI 重建表之前,请验证 DynoTable 中的访问模式 — 使用 ⌘K 打开表并测试 GSI 查询是否满足相同的需求。 Query Builder 生成新索引必须提供的 KeyConditionExpression。使用 pricing calculator 将 LSI 写入放大与 GSI 替代方案进行比较。使用 ⌘P 切换配置文件;参见连接 AWS和安装。
来源
- Local secondary indexes(2026-07-13 验证)
- UpdateTable — Amazon DynamoDB API Reference(2026-07-13 验证)
相关错误
- Attempting to modify a GSI that is being created——一个 GSI 在索引构建期间被阻止的变更。
- Requested resource not found / index not found——查询一个不存在的索引名称。
- ValidationException (overview)
- 学习:GSI vs LSI · 索引
参考资料
- Local secondary indexes — Amazon DynamoDB Developer Guide
- UpdateTable — Amazon DynamoDB API Reference
- Quotas in Amazon DynamoDB — Amazon DynamoDB Developer Guide
最后核实于 2026-07-13,依据上方链接的 AWS 官方文档。