介绍
订单服务需要存储订单详情,并按订单 ID 查找。你将创建 DynamoDB 表,存储两个带类型的项目,更新已打包订单,并删除临时订单。最后,你将只删除自己的表,同时保留无关参考表。
本实验在全新环境中独立开始。请先学习 AWS 基础实验中的终端命令、调用者身份和资源名称。使用 /home/labex/project 和已准备好的一次性连接。AWS View 展示实际表和项目状态;它不是 AWS Console。
认证考点
| 认证 | 考点 | 本实验练习 |
|---|---|---|
| Cloud Practitioner (CLF-C02) | 任务 3.4 | DynamoDB 键、类型化项目与数据操作。 |
| Solutions Architect – Associate (SAA-C03) | 任务 3.3 | DynamoDB 键、类型化项目与数据操作。 |
| Developer – Associate (DVA-C02) | 任务 1.3 | DynamoDB 键、类型化项目与数据操作。 |
| Data Engineer – Associate (DEA-C01) | 任务 2.4 | 基础练习:DynamoDB 键、类型化项目与数据操作。 |
实验概览

创建订单表
在本步骤中,你将为小型订单服务创建表。DynamoDB 存储项目(item),而不是受完整列结构约束的行。表声明主键;每个项目可以包含其他属性。在这个简单表中,分区键标识一个项目。
官方 AWS CLI 和一次性连接已准备好。使用这个工作目录,再查看调用者。不要输入个人凭据。
cd /home/labex/project
aws sts get-caller-identity
调用者 ARN 以 user/dynamodb-operator 结尾。账户标识和 ARN 标识连接,不是订单键。
创建 labex-d01-orders,使用 String(S)类型的 order_id 作为分区键(HASH)。--attribute-definitions 只声明键属性,不声明每个项目字段。PAY_PER_REQUEST 选择按需容量,而非预置读写单位。在 AWS 上,请求和存储会产生费用;这种选择不代表免费存储。
aws dynamodb create-table \
--table-name labex-d01-orders \
--attribute-definitions AttributeName=order_id,AttributeType=S \
--key-schema AttributeName=order_id,KeyType=HASH \
--billing-mode PAY_PER_REQUEST
建表返回元数据。等待器(waiter)轮询服务直到表可用,比假定首次响应就意味着资源就绪更稳妥。
aws dynamodb wait table-exists --table-name labex-d01-orders
aws dynamodb describe-table \
--table-name labex-d01-orders \
--query 'Table.{State:TableStatus,Keys:KeySchema,Billing:BillingModeSummary.BillingMode}'
预期为 ACTIVE、order_id 分区键和 PAY_PER_REQUEST。打开 LabEx AWS View。订单卡片还没有项目;独立的参考表属于预先准备的环境,必须保持不变。
写入并读取带类型的项目
在本步骤中,你将存储两个订单,并按准确键读取其中一个。底层 DynamoDB API 使用带类型的属性:S 表示字符串,N 表示数字。N 的值编码为 JSON 字符串,但 DynamoDB 将其视为数字。这里的金额以整数单位表示,用于小型合成示例。

单引号让 Shell 原样传递 JSON,包括内部双引号。每个 put-item 创建具有自身键的完整项目。成功写入通常没有输出。
aws dynamodb put-item \
--table-name labex-d01-orders \
--item '{"order_id":{"S":"O100"},"customer":{"S":"Ada"},"amount":{"N":"145"},"status":{"S":"NEW"}}'
aws dynamodb put-item \
--table-name labex-d01-orders \
--item '{"order_id":{"S":"O101"},"customer":{"S":"Ada"},"amount":{"N":"50"},"status":{"S":"NEW"}}'
按主键读取 O100。--consistent-read 请求基础表的强一致读取,适合立即查看写入结果。默认读取采用最终一致性。
aws dynamodb get-item \
--table-name labex-d01-orders \
--key '{"order_id":{"S":"O100"}}' \
--consistent-read
Item 包含 O100、Ada、金额 145 和状态 NEW。允许缺少非键属性,不允许缺少必需键。在 AWS View 中,展开订单卡片中的 O100,查看同一服务返回的实际带类型项目。
更新订单并删除临时项目
在本步骤中,你将修改 O100 而不替换其他字段,再删除临时订单 O101。update-item 对一个由键指定的项目应用表达式。SET 为属性赋值。表达式名称别名避免保留字冲突:#state 代表 status。表达式值带有 DynamoDB 类型。
订单服务需要修改打包信息,同时保留客户身份。同键 PutItem 会替换整个项目;UpdateItem 只修改指定属性。这里返回的 customer 字段证明更新保留了无关的订单数据。
--return-values ALL_NEW 返回完整更新项目,让你立即查看结果。
aws dynamodb update-item \
--table-name labex-d01-orders \
--key '{"order_id":{"S":"O100"}}' \
--update-expression 'SET amount = :amount, #state = :state' \
--expression-attribute-names '{"#state":"status"}' \
--expression-attribute-values '{":amount":{"N":"160"},":state":{"S":"PACKED"}}' \
--return-values ALL_NEW
返回属性保留客户 Ada,金额变为 160,状态变为 PACKED。
只按准确键删除 O101,再次读取。
aws dynamodb delete-item \
--table-name labex-d01-orders \
--key '{"order_id":{"S":"O101"}}' \
--return-values ALL_OLD
aws dynamodb get-item \
--table-name labex-d01-orders \
--key '{"order_id":{"S":"O101"}}' \
--consistent-read
ALL_OLD 显示已删除项目。后续读取返回 {},因为该键已没有项目;这是成功但没有结果的读取。在 AWS View 中,O101 消失,O100 保留更新后的字段。展开 O100,比较金额和状态。

只清理自己的表
在本步骤中,你将在检查最终数据后删除订单表。删除表会移除全部项目和索引。删除前确认准确名称;不要循环删除服务返回的每张表。
aws dynamodb scan --table-name labex-d01-orders --consistent-read
最终扫描只返回 O100,金额 160、状态 PACKED。扫描检查整张表,而非单个由键指定的项目;下一个实验将通过 Query 处理更大的访问模式。
aws dynamodb delete-table --table-name labex-d01-orders
aws dynamodb wait table-not-exists --table-name labex-d01-orders
aws dynamodb list-tables
aws dynamodb get-item \
--table-name labex-d01-reference \
--key '{"id":{"S":"platform"}}' \
--consistent-read
清单包含 labex-d01-reference,没有订单表。参考 note 仍为 keep unchanged。成功清单查询和参考读取证明连接仍可用;身份验证或网络失败不能证明删除。AWS View 现在只显示保留的参考资源和 Orders table absent。一次性连接随这个 VM 结束;不要将凭据复制到其他地方。
总结
你创建了具有 String 分区键的按需容量表,写入带类型项目,执行按键的强一致读取,更新选定属性并删除一个项目。随后,你只删除自己的表,并证明无关参考资源仍可读取。这些操作为后续实验中的复合键查询和替代访问模式建立基础。
进一步阅读 AWS 官方资料:表、项目、属性与主键。



