常见 DynamoDB 错误(及修复方法)
开发者最常遇到的 DynamoDB 错误——每个都说明其含义、发生原因以及确切的修复方法。
验证与表达式错误 (52)
DynamoDB ValidationException — 原因与修复方法
DynamoDB ValidationException 意味着请求在运行之前就因格式错误被拒绝。下面是常见触发原因、该怎么读那条消息,以及各自的修复方法。
"Query condition missed key schema element" — DynamoDB 修复
Query condition missed key schema element 表示你的 KeyConditionExpression 缺少对分区键的相等条件。改为查询 GSI,或者使用 Scan。
"The provided key element does not match the schema" — DynamoDB 修复
这个 ValidationException 意味着某个键属性的名称或类型与你表的 KeySchema 不匹配——缺少排序键,或者把数字当作字符串发送。
"Invalid UpdateExpression" 语法错误 — DynamoDB 修复
Invalid UpdateExpression 通常是直接用了保留字,或者缺少 #name 或 :value 占位符。下面讲解如何读懂这条消息并修复它。
"ExpressionAttributeValues contains invalid value" — DynamoDB 修复
这个 ValidationException 意味着 ExpressionAttributeValues 中的某个值为空、类型错误,或引用了一个你从未定义的占位符。下面是修复方法。
"Item size has exceeded the maximum allowed size" — DynamoDB 修复
DynamoDB 的项目上限是 400 KB。这个 ValidationException 意味着你的项目(或更新之后的项目)超出了限制。下面讲解如何检查大小并修复它。
DynamoDB ConditionalCheckFailedException — 原因与修复
ConditionalCheckFailedException 意味着你的 ConditionExpression 求值为假,因此 DynamoDB 拒绝了这次写入,项目保持不变。
DynamoDB TransactionCanceledException — 解读取消原因
TransactionCanceledException 意味着你事务中的某一个项目失败了,于是整个事务回滚。修复的办法是读取 CancellationReasons 数组。下面讲解方法。
DynamoDB SerializationException — 原因与修复
SerializationException 意味着你的 JSON 与 DynamoDB 的传输格式不匹配——通常是把数字包成了字符串。修好带类型的 AttributeValue 包裹。
"Supplied AttributeValue is empty" — DynamoDB 修复
这个 ValidationException 意味着某个 AttributeValue 根本没有带类型的值——一个空集合、一个空的键字符串,或一个未定义的字段。去掉它,或者给它一个值。
"One or more parameter values were invalid" — DynamoDB 修复
这个 ValidationException 意味着某个值违反了 DynamoDB 的规则——一个空集合、一个空的键字符串,或者类型不匹配。消息会指明具体是哪个参数。
"Invalid size for parameter" — DynamoDB 向量写入修复
当嵌入的维度数与向量索引不匹配时,DynamoDB 会拒绝这次向量写入。消息会给出属性名和两个大小。
"Search vector contains invalid values" — DynamoDB 修复
当查询向量被包在 DynamoDB 的 L 类型里或含有非浮点值时,SearchVectors 会拒绝它。这个参数是一个裸 JSON 数组,不是 List 属性。
"SearchConditionExpression must be provided" — DynamoDB 修复
带有 HASH 搜索模式键的向量索引要求每次 SearchVectors 调用都固定恰好一个分区值。这个过滤条件在索引创建时就不再是可选的了。
"Query key condition not supported" — DynamoDB 修复
DynamoDB 会拒绝使用了键 schema 不允许的运算符的 KeyConditionExpression——分区键只接受相等判断。下面是允许使用的运算符。
"Attribute name is a reserved keyword" — DynamoDB 修复
DynamoDB 会拒绝把 status、name 或 size 这类保留字用作裸属性名。用一个像 #status 这样的 ExpressionAttributeNames 占位符给它起别名。
"Float types are not supported" — DynamoDB boto3 修复
boto3 会抛出 TypeError "Float types are not supported",因为 DynamoDB 存储的是精确的十进制数。通过字符串形式把 float 转换成 decimal.Decimal。
"Number overflow" — DynamoDB 数字大小限制修复
DynamoDB 的 N 类型能容纳 38 位精度、量级最大约 9.9E+125。超过之后,请把大 ID 和高精度值改存为字符串。
"The provided expression refers to an attribute that does not exist" — 修复
你的 UpdateExpression 或 ConditionExpression 引用了一个不在项目上的路径——缺失的父级 map、拼写错误,或对缺失属性做算术。
"Provided list of item keys contains duplicates"(BatchGetItem)— 修复
当某张表的 Keys 列表里重复了同一个主键时,DynamoDB 会拒绝这次 BatchGetItem。整个批次都会失败,所以发送前先把键去重。
"Provided list of item keys contains duplicates"(BatchWriteItem)— 修复
当两个操作指向同一个主键时,DynamoDB 会拒绝这次 BatchWriteItem。一个批次不能对同一个项目操作两次,所以要合并重复项。
"Expression size has exceeded the maximum allowed size"(4 KB)— 修复
DynamoDB 把每个表达式字符串限制在 4 KB。超过这个长度的 FilterExpression、ConditionExpression 或 UpdateExpression 都会被拒绝。下面讲解如何缩短它。
"Aggregated size of all range keys has exceeded the size limit" — 修复
DynamoDB 把排序键限制在 1024 字节,把分区键限制在 2048 字节。下面是这个 ValidationException 背后的字节计算,以及如何修复你的键。
"Filter Expression can only contain non-primary key attributes" — 修复
DynamoDB 会拒绝引用了分区键或排序键的 FilterExpression。键属于 KeyConditionExpression,而非过滤器——下面讲解原因,以及如何重构查询。
DynamoDB BatchGetItem 100 个项目上限 — “Too Many Items” 修复
BatchGetItem 每次调用最多支持 100 个项目(且 16 MB)。请求更多,DynamoDB 就会拒绝整个请求。下面讲解这条限制,以及分块读取的循环。
"Too many items requested for the BatchWriteItem call" — 修复
BatchWriteItem 每次调用最多接受 25 个 put 或 delete 操作。发送更多,DynamoDB 就会以 ValidationException 拒绝整个请求。
DynamoDB "Can Not Use Both Expression and Non-Expression Parameters" — 修复
DynamoDB 会拒绝把 KeyConditions 这类旧参数与 KeyConditionExpression 混用的请求。去掉旧参数,改用表达式。
"Local secondary indexes must be specified at table creation" — 修复
本地二级索引只能在创建表时定义,事后无法添加。下面讲解这个约束为何存在,以及如何绕过它。
DynamoDB TransactionCanceledException — ConditionalCheckFailed 修复
一次 TransactWriteItems 调用因 ConditionalCheckFailed 被取消,意味着某个项目的条件失败,回滚了整个事务。下面讲解如何定位并修复它。
"Value provided in ExpressionAttributeNames unused in expressions" — 修复
如果你声明了一个没有任何表达式引用的 ExpressionAttributeNames 别名,DynamoDB 会拒绝该请求。删掉它,或者修好漏掉它的表达式。
"Value provided in ExpressionAttributeValues unused in expressions" — 修复
如果你声明了一个没有任何表达式使用的 ExpressionAttributeValues 占位符,DynamoDB 会拒绝该请求。删掉这个孤立的值,或者修好表达式。
DynamoDB S3 导入失败 — 格式无效修复
当对象与声明的 InputFormat 或压缩方式不匹配,或者项目缺少主键时,DynamoDB 从 S3 导入会失败。下面是修复方法。
"Size of hashkey has exceeded the maximum size limit of 2048 bytes" — 修复
一个 DynamoDB 分区键最多 2048 字节,排序键最多 1024 字节。超过任一限制,写入就会被以 ValidationException 拒绝——下面讲解该限制以及如何重新设计键。
DynamoDB GSI "Does Not Project" 属性 — 修复
查询一个 GSI 未投影的属性会失败——GSI 只返回键属性加上它的投影。更改投影或请求。下面讲解方法。
"Nesting Levels have exceeded supported limits" — DynamoDB 32 层修复
DynamoDB 把 map 和 list 的嵌套限制在 32 层——更深的文档会抛出 "Nesting Levels have exceeded supported limits"。下面讲解如何扁平化或拆分它们。
"Segment must be less than TotalSegments" — 并行 Scan 修复
并行 Scan 要求 0 ≤ Segment < TotalSegments,且两者必须一起发送。给每个工作进程一个从 0 到 TotalSegments − 1 的不同 Segment。
DynamoDB "Cannot Specify AttributesToGet When Select Is COUNT" — 修复
DynamoDB 会拒绝把 Select=COUNT 与 ProjectionExpression 或 AttributesToGet 一起设置的 Query 或 Scan。COUNT 只返回一个数字,所以把投影去掉。
DynamoDB Streams "The ARN provided is invalid" — 修复
DynamoDB Streams 会拒绝格式错误的、或像 /stream/latest 这样的占位符 stream ARN。请把 DescribeTable 返回的真实 LatestStreamArn 原样传入。
"Transaction request cannot include multiple operations on one item" — 修复
当两个操作指向同一个主键时,DynamoDB 会拒绝这次 TransactWriteItems 调用。合并重复项,或者把其中一个挪到单独的写入里。
DynamoDB TransactWriteItems 100 个动作上限 — 修复
TransactWriteItems 上限是 100 个动作;超出后你会拿到一个关于 TransactItems 长度的 ValidationException。把它拆开,或者改用每次 25 个的 BatchWriteItem。
DynamoDB TTL 属性必须是 Number — 原因与修复
DynamoDB TTL 只会让 TTL 属性持有 Unix 纪元秒 Number 的项目过期。一个 String、一个毫秒值或一个缺失的属性意味着项目永不过期。下面是修复方法。
DynamoDB "The expression can not be empty" — 修复
DynamoDB 会拒绝以空字符串传入的表达式参数。没有内容要发送时,就完全省略 FilterExpression 或 UpdateExpression。
"ExpressionAttributeNames contains invalid key: Syntax error" — 修复
DynamoDB 会拒绝占位符键破坏了 `#name` 语法的 ExpressionAttributeNames 映射。下面是命名规则,以及真实属性名该放在哪里。
"Two document paths overlap with each other"(DynamoDB)— 修复
当一个 UpdateExpression 同时设置父路径和嵌套在它里面的路径时,DynamoDB 会拒绝它。把子路径并入父路径,或者拆成两次更新。
"The document path provided in the update expression is invalid" — 修复
无效的文档路径意味着你嵌套属性的父级不存在,或者不是一个 map。DynamoDB 绝不会自动创建它,所以要先把父级建好。
"An operand in the update expression has an incorrect data type" — 修复
一个更新操作数的类型与存储的属性不匹配——对非数字做 ADD、对非列表做 list_append、集合类型不匹配。下面是每种操作的修复方法。
DynamoDB IdempotentParameterMismatchException — 原因与修复
在 10 分钟的幂等窗口内,若一次重试复用了 ClientRequestToken 却带着不同的载荷,TransactWriteItems 会拒绝它。下面是修复方法。
"Consistent reads are not supported on global secondary indexes" — 修复
用 ConsistentRead true 查询 GSI 会抛出 ValidationException。GSI 只提供最终一致性读取。去掉这个标志,或者改读基表。
DynamoDB DuplicateItemException(PartiQL INSERT)— 原因与修复
当主键已经存在时,PartiQL INSERT 会以 DuplicateItemException 失败。与 PutItem 不同,它从不覆盖,所以改用 UPDATE 或 PutItem。
"Unexpected from source"(DynamoDB PartiQL)— 修复
当 FROM 里的表名含有短横线或其他特殊字符、却没有加双引号时,PartiQL 会抛出 ValidationException Unexpected from source。一对双引号就能解决。
boto3 "Parameter validation failed"(ParamValidationError)— 修复
botocore 会在请求到达 DynamoDB 之前抛出 ParamValidationError——通常是 client 与 resource 的类型混用。下面讲解如何读懂它并修复。
"The provided starting key is invalid"(DynamoDB)— 修复
DynamoDB 会拒绝一个与你正在分页的表或索引的键模式不精确匹配的 ExclusiveStartKey。把 LastEvaluatedKey 原样传回——绝不手工构建它。
吞吐量与限流错误 (11)
DynamoDB ProvisionedThroughputExceededException — 原因与修复
当读或写超过表或某个 GSI 的预置容量时,DynamoDB 会抛出 ProvisionedThroughputExceededException。下面讲解到底是什么被耗尽了,以及如何修复。
DynamoDB ThrottlingException — 原因与修复
ThrottlingException 意味着你的请求速率超过了某个限制——常常是控制平面 API 调用或账户级限制。用指数退避重试并降低调用频率。
DynamoDB ItemCollectionSizeLimitExceededException — 原因与修复
这个错误只发生在带本地二级索引的表上——一个项目集合(所有共享一个分区键的项目)超过了 10 GB。下面讲解如何修复它。
DynamoDB RequestLimitExceeded — 原因与修复
RequestLimitExceeded 是一个账户级速率限制——按需模式默认每秒 40,000 个读写请求单元。到 Service Quotas 里提高它。
DynamoDB TransactionConflictException — 原因与修复
TransactionConflictException 意味着另一个事务正在触及与你写入相同的项目。它是瞬时的——用退避重试并让事务保持小巧。
"Provisioned throughput decreases are limited within a given day" — 修复
DynamoDB 限制你每个 UTC 天能把一张表的预置容量降低多少次。一旦用完额度,UpdateTable 就会抛出这个错误——下面讲解配额计算以及如何绕过它。
DynamoDB 按需吞吐量超限 — 原因与修复
按需表仍然会限流——配置的最大吞吐量、超过先前峰值两倍的爬升,或者一个表配额。下面讲解如何提高上限。
DynamoDB 有容量却被限流 — 热点分区修复
即使表有富余容量,DynamoDB 也会对单个热点分区键限流,因为每个物理分区都有自己 3,000 RCU / 1,000 WCU 的上限。分散键,然后重试。下面讲解方法。
DynamoDB TransactionInProgressException — 原因与修复
一次 TransactWriteItems 重试复用了仍在运行的那次尝试的 ClientRequestToken。继续用退避重试,并把超时调到 5 秒以上。
DynamoDB InternalServerError(HTTP 500)— 该怎么办
来自 DynamoDB 的 HTTP 500 是一个瞬时的服务端故障——可以安全重试,但一次失败的写入仍可能已经被应用。下面是 AWS 记载的重试与幂等处理。
DynamoDB ReplicatedWriteConflictException — 原因与修复
在一张多区域强一致性全局表上,一次写入因另一个区域正在修改同一项目而被拒绝。它可重试——下面讲解如何处理它。
表与资源错误 (19)
DynamoDB ResourceNotFoundException — 原因与修复
ResourceNotFoundException 意味着表或索引在你调用的区域和账户中不存在。检查名称、区域和凭证。
DynamoDB ResourceInUseException("Table already exists")— 修复
ResourceInUseException 意味着表已经存在,或者仍处于 CREATING、UPDATING 或 DELETING 状态。动手之前先用 DescribeTable 检查它的状态。
DynamoDB LimitExceededException — 原因与修复
LimitExceededException 意味着并发的控制平面调用(CreateTable、UpdateTable、DeleteTable)过多,或触及了某个账户限制。下面讲解如何保持在它们之下。
"The table does not have the specified index" — 修复
DynamoDB 拒绝了这次调用,因为 IndexName 在那张表上不存在、拼写错误,或者 GSI 还没到 ACTIVE。下面讲解如何确认并修复它。
DynamoDB BackupNotFoundException — 原因与修复
BackupNotFoundException 表示 DynamoDB 找不到你传入的 BackupARN 对应的备份——通常是 ARN 错误、备份已删除或过期,或者区域不对。
DynamoDB ReplicaNotFoundException — 原因与修复
ReplicaNotFoundException 意味着你正在更新的区域副本不是全局表的一部分——区域错误、被移除的副本,或一次竞速。下面是修复方法。
"Attempting to modify a GSI that is being created" — 修复
当全局二级索引仍在构建时,DynamoDB 会阻止结构性更改。等 IndexStatus 变为 ACTIVE,或者把你的更改排成先后顺序。
DynamoDB ExportTableToPointInTime — PITR 未启用的修复
ExportTableToPointInTime 要求源表启用时间点恢复,否则会抛出 PointInTimeRecoveryUnavailableException。一条命令即可修复。
DynamoDB 全局表版本不匹配 — 原因与修复
当副本对不齐时全局表创建会失败——非空表、不匹配的键模式或 GSI,或者混用 2017 和 2019 的 API 版本。下面是修复方法。
DynamoDB LSI 项目集合 10 GB 限制 — 原因与修复
带本地二级索引的表把每个项目集合限制在 10 GB——越过它写入就会失败。监控 ItemCollectionMetrics 并重新分片。下面讲解方法。
DynamoDB Cannot Access Stream — Stream Not Enabled 修复
某个消费者读取了一张已关闭 Streams 的表上的 DynamoDB stream,或者用了一个陈旧的 ARN。启用 Streams,并把它指向当前的 LatestStreamArn。
DynamoDB TableAlreadyExistsException / "Table already exists" — 修复
恢复会抛出 TableAlreadyExistsException;CreateTable 和 ImportTable 则报告 ResourceInUseException。目标名称已被占用,换一个新的。
DynamoDB Streams ExpiredIteratorException — 原因与修复
一个 DynamoDB Streams 分片迭代器有效期为 15 分钟;此后使用它会抛出 ExpiredIteratorException。下面讲解如何获取一个新迭代器并在不丢失记录的情况下恢复。
DynamoDB Streams TrimmedDataAccessException — 原因与修复
Stream 记录保留 24 小时,比这更旧的检查点会抛出 TrimmedDataAccessException。从 TRIM_HORIZON 恢复,再从表里对账。
DynamoDB BackupInUseException — 原因与修复
DynamoDB BackupInUseException 意味着同一张表上的另一个备份操作仍在运行。等它完成后再重试你的调用。
DynamoDB InvalidRestoreTimeException — 原因与修复
InvalidRestoreTimeException 意味着你的 RestoreDateTime 落在表最长 35 天的 PITR 窗口之外。下面讲解如何解读它并选一个有效的恢复时间。
DynamoDB PointInTimeRecoveryUnavailableException — 修复
你试图对一张从未启用 PITR 的表做时间点恢复。从现在起启用连续备份——对于你今天需要的数据,使用一个按需备份。
DynamoDB GlobalTableNotFoundException — 原因与修复
GlobalTableNotFoundException 意味着旧版全局表 API 看不到你的表——通常是一个通过 UpdateTable 管理的当前 2019.11.21 全局表。
DynamoDB ReplicaAlreadyExistsException — 原因与修复
你让 DynamoDB 添加一个已经是全局表一部分的副本区域。先描述复制组,并让副本管理具有幂等性。
身份验证与配置错误 (13)
"not authorized to perform dynamodb:..." — AccessDeniedException 修复
DynamoDB AccessDeniedException:你的 IAM 身份没有权限执行消息中指明的操作。下面讲解如何解读它并修复 IAM 策略。
"ConfigError: Missing region in config" — DynamoDB 修复
AWS SDK 无法确定要把 DynamoDB 请求发往哪个区域。在客户端上、通过 AWS_REGION,或在你的 AWS 配置中设置区域。下面是各个选项。
"The security token included in the request is invalid" — DynamoDB 修复
这个 UnrecognizedClientException 意味着你的 AWS 凭证错误、过期,或者根本没有被读到。下面讲解如何查清是哪一种并修好它。
DynamoDB IncompleteSignatureException — 原因与修复
IncompleteSignatureException 意味着 SigV4 签名格式有误——通常是手写的签名,或者某个代理改写了 Authorization 请求头。
"The security token included in the request is expired" — DynamoDB 修复
ExpiredTokenException 意味着你的临时 STS、SSO 或担任角色凭证超时了。重新运行 aws sso login,并清掉陈旧的 AWS_SESSION_TOKEN。
"Unable to locate credentials"(boto3 / DynamoDB)— 修复
当 boto3 的 provider 链里没有任何东西提供 AWS 凭证时——没有环境变量、没有 profile、没有实例角色——它会抛出 NoCredentialsError。下面是修复方法。
"The request signature we calculated does not match" — 修复
SigV4 签名失败时,DynamoDB 返回的是 InvalidSignatureException,而不是 SignatureDoesNotMatch。通常是密钥不对,或者你机器上的时钟偏移。
"Credential should be scoped to a valid region" — DynamoDB 修复
这个 SigV4 签名错误意味着你凭证作用域中的区域与你实际调用的区域不匹配。下面讲解如何对齐客户端和端点的区域。
"InvalidSignatureException: Signature expired" — DynamoDB 修复
DynamoDB 会拒绝签名时间戳偏离 AWS 服务器时间超过五分钟的请求。几乎总是客户端时钟偏移——下面讲解如何修正它。
"Missing Authentication Token" — DynamoDB 错误修复
来自 DynamoDB 的 MissingAuthenticationTokenException 意味着 endpoint URL 或路径错误,又或者请求根本没有签名。下面是各自的修复方法。
"Could not load credentials from any providers"(DynamoDB)— 修复
当 AWS SDK for JavaScript v3 的整条凭证链都空手而归时,它会抛出 CredentialsProviderError。下面讲解这条链如何解析,以及每一种修复方法。
"The SSO session associated with this profile has expired" — 修复
过期的 IAM Identity Center token 会让 AWS CLI 和 SDK 对 DynamoDB 的调用失败。运行 aws sso login;如果还不够,就清掉陈旧的 ~/.aws/sso/cache。
"The config profile could not be found" — AWS CLI 与 boto3 的修复
当指定的 profile 在 ~/.aws/config 中不存在时,AWS CLI 和 boto3 会抛出 ProfileNotFound。三个常见成因,以及各自的修复方法。
DynamoDB Local 与安装设置错误 (8)
"Unable to start DynamoDB Local process" — 修复
DynamoDB Local 启动失败——通常是缺少/不兼容的 Java 运行时、端口已被占用,或安装路径错误。下面讲解各自的修复方法。
"Could not connect to DynamoDB Local"(ECONNREFUSED)— 修复
对 DynamoDB Local 的 ECONNREFUSED 意味着没有任何东西在监听。通常是模拟器未运行、端口错误,或者 SDK 访问的是真实 AWS。
"Could not connect to the endpoint URL"(DynamoDB)— 修复
当 botocore 连不上 DynamoDB 时会抛出 EndpointConnectionError。通常是 endpoint URL 错误、DynamoDB Local 未运行,或者区域不对。
DynamoDB Local "Address already in use"(端口 8000)— 修复
当某个东西已经占用了端口 8000 时,DynamoDB Local 会抛出 java.net.BindException Address already in use。下面讲解如何找到该进程、释放端口,或在其他端口上启动 Local。
DynamoDB Local "Failed to load native library sqlite4java" — 修复
DynamoDB Local 在启动时因 sqlite4java 的 UnsatisfiedLinkError 而崩溃——java.library.path 错误或 Apple Silicon 架构不匹配。下面是两者的修复方法。
"Unable to execute HTTP request"(DynamoDB, Java SDK)— 修复
当 AWS SDK for Java 连不上 endpoint 时,会以 Unable to execute HTTP request 失败——DynamoDB Local 未运行、端口错误,或 Docker 网络问题。
"Cannot do operations on a non-existent table"(DynamoDB Local)— 修复
DynamoDB Local 给每一对凭证和区域各自一个数据库,所以你创建的表可能看不见。用 -sharedDb 启动 Local,让它们共用一个。
DynamoDB Local UnsupportedClassVersionError — 修复
DynamoDB Local 2.6.0 及更新版本需要 Java 17 或更高。在较旧的 JRE 上,JVM 会拒绝加载它。请安装一个当前的 JDK,或改用 Docker 镜像运行。
这些错误消息如何核实
文档是对自身实现的转述,而转述会走样。这些页面引用的每一条错误消息,都是把失败的调用真实发往 AWS DynamoDB 服务、再逐字记录返回内容得到的 —— 而不是从 AWS 文档里抄来的。
不是 DynamoDB Local。这个模拟器很方便,但 AWS 从未承诺它的错误措辞与服务一致 —— 我们实测时发现,它有一半以上的消息都不相同。凡是这种差异值得了解的地方,页面会同时给出两种措辞。
我们唯一改动的,是描述你的请求而非错误本身的部分:表名,以及服务原样回显的那份请求内容。只要有页面引用了服务从未返回过的字符串,就会有一个测试让构建失败 —— 这个测试之所以存在,是因为我们自己的一个页面曾引用了一条凭空编造的消息,几个月里都没人去跑一遍代码。
涵盖 14 种异常类型的 58 条消息:55 条采集自线上服务,2 条在请求发出前就被 SDK 拒绝,另有 1 条以 DynamoDB Local 自身的措辞为主题。其中 6 条附有说明,讲述模拟器如何表述同一个失败。
- 线上服务
- Amazon DynamoDB (live service, us-east-1)
- 模拟器(用于对比)
- DynamoDB Local (amazon/dynamodb-local)
- JavaScript SDK
- @aws-sdk/client-dynamodb 3.1096.0
- Python SDK
- boto3 1.43.81 on Python 3.14.7
- Node.js
- v24.20.0