InternalServerError (HTTP 500)

TL;DR — DynamoDB 无法处理该请求;故障在服务端,而重试是文档中记载的应对方式——AWS 声明这些错误在表的生命周期中是预期之内的,失败的请求可以立即重试。唯一的微妙之处:一次_写入_上的 500 是有歧义的(它可能成功了也可能失败了),所以在盲目重新应用之前,先把项目读回来或使用一个幂等模式。

含义

InternalServerError: The server encountered an internal error trying to
fulfill the request.

与本板块上的 400 系列错误不同,一个 5xx 并不意味着你的请求错了——它意味着 DynamoDB 在处理它时遇到了一个内部故障。相关的 ServiceUnavailable(HTTP 503)表示一个临时的可用性问题,同样可以重试。AWS SDK 已经用指数退避自动重试两者,因此你通常只会在 SDK 的重试耗尽之后才看到一个 500 浮现。

为什么会发生

  • 瞬时的服务端故障——AWS 记载偶发的内部错误在一张表的生命周期中是预期之内的;它们不是由你的请求形态引起的。
  • 一个真正的服务事件——如果 5xx 响应在多次重试后仍然持续,检查 AWS Health Dashboard 看你所在区域是否有运营问题。

如何修复

  1. 用指数退避重试——或者干脆让 SDK 来做;每个 AWS SDK 都会自动重试 5xx 响应。只有在持续失败之后,你才应该把它当作一次事故来处理。
  2. 处理写入歧义——PutItem/UpdateItem/DeleteItem 上的一个 500 可能已经被应用了。文档记载的选项:
    • 在重试之前读取项目的状态,和/或

    • 用一个条件表达式守护重试,让它无论第一次尝试是否落地都保持正确,例如一个版本检查:

      ConditionExpression: 'version = :expected',
      ExpressionAttributeValues: {':expected': {'N': '7'}}
    • 当幂等是硬性要求时,使用带 ClientRequestTokenTransactWriteItems——在 token 窗口内的重复尝试只计一次。

  3. TransactWriteItems 上的一个 500 可以原样安全重试——事务要么提交了要么没有;token 会去重。
  4. 只在它持续时才上报——跨越数分钟的持续 5xx 是一个服务问题:检查 health dashboard,并用失败响应中的 RequestId 开一个支持工单。

在一次有歧义的写入之后,在重新运行你的任务之前先看看实际存储的内容——DynoTable 桌面应用一眼显示实时的项目状态,而如果你在重新驱动一个批次,DynamoDB 定价计算器帮你估算重试流量的规模。

相关错误

References

最后核实于 2026-07-13,依据上方链接的 AWS 官方文档。

无需控制台即可使用 DynamoDB

DynoTable 是面向 DynamoDB 的快速桌面客户端 —— 浏览表、运行 SQL 风格的查询,并在本地编辑项。