DynamoDB作为AWS上全托管的NoSQL数据库,在键值存储和文档场景中应用广泛。日常维护如果只靠管理控制台点击,每次建表、写入测试数据、批量调整资源都会消耗大量时间。AWS CLI内置了完整的dynamodb命令组,几条命令就能完成表生命周期管理,并适合写进Shell脚本重复执行。下文会从环境准备讲起,逐步覆盖建表、读写、更新和删除等核心操作。

一、安装配置与权限准备
开始操作前需要确保AWS CLI版本在2.x以上,旧版本可能缺少部分dynamodb子命令或输出格式选项。安装完成后运行aws --version确认版本,再执行aws configure设置访问密钥、默认区域和输出格式。输出格式建议选择json,方便后续用--query参数过滤结果。
IAM用户或角色至少需要以下权限:dynamodb:CreateTable、dynamodb:DescribeTable、dynamodb:ListTables、dynamodb:PutItem、dynamodb:GetItem、dynamodb:Query、dynamodb:Scan、dynamodb:UpdateTable、dynamodb:DeleteTable。如果是生产环境,建议通过IAM策略限制资源范围,只开放特定表的操作权限,避免误删。可以使用aws sts get-caller-identity验证凭证是否生效,返回的账号ID和ARN能帮助排查权限问题。
配置文件默认存放在~/.aws/credentials和~/.aws/config中,也可以通过环境变量AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY覆盖。Windows系统下路径为C:\Users\用户名\.aws\credentials,使用时注意反斜杠和权限设置。配置完成后就可以开始建表。
二、创建与查看表结构
创建表的核心命令是aws dynamodb create-table。需要指定表名、属性定义和键架构。例如创建一个以Artist为分区键、SongTitle为排序键的音乐表,计费模式选择按请求付费,可以执行下面的命令。
aws dynamodb create-table \
--table-name Music \
--attribute-definitions \
AttributeName=Artist,AttributeType=S \
AttributeName=SongTitle,AttributeType=S \
--key-schema \
AttributeName=Artist,KeyType=HASH \
AttributeName=SongTitle,KeyType=RANGE \
--billing-mode PAY_PER_REQUEST
命令中的AttributeType=S表示字符串类型,其他可选类型包括N表示数字、B表示二进制。HASH对应分区键,RANGE对应排序键。如果只设计一个分区键,键架构中只需保留HASH部分。按请求付费适合流量不可预测的场景,节省容量规划成本;如果明确知道读写吞吐,可以改用PROVISIONED并设置--provisioned-throughput参数。
建表后可以用describe-table查看表状态和架构信息,确认表处于ACTIVE状态后再写入数据。列出当前区域所有表则使用list-tables,配合--query "TableNames"可以只输出表名数组。
aws dynamodb describe-table --table-name Music aws dynamodb list-tables --query "TableNames" --output text
如果输出内容过长,可以加上--no-cli-pager避免进入分页模式,尤其在脚本中非常实用。查看表结构时重点关注KeySchema、AttributeDefinitions、BillingModeSummary等字段,这些字段能帮你判断主键设计和计费方式是否正确。
三、写入与读取数据
单条数据写入使用put-item,--item参数接收JSON格式的键值对。DynamoDB要求每条数据必须包含完整主键,属性值需要用类型描述符包裹,字符串用S,数字用N。例如写入一条歌曲记录可以这样写。
aws dynamodb put-item \
--table-name Music \
--item '{"Artist": {"S": "The Beatles"}, "SongTitle": {"S": "Hey Jude"}, "Year": {"N": "1968"}}'
如果需要防止覆盖已有数据,可以添加条件表达式attribute_not_exists(Artist),只有当前主键不存在时才写入。批量写入则使用batch-write-item,一次最多支持25条数据,适合初始化测试数据。读取单条数据用get-item,必须提供完整的键值。
查询操作分为按主键精确读取的get-item、按分区键条件读取的query和全表扫描的scan。query效率更高,但需要指定分区键,可以用排序键条件或过滤表达式缩小范围。scan会遍历全表,数据量大时性能和费用都不可控,生产环境应尽量避免。下面演示按分区键查询并投影部分字段。
aws dynamodb query \
--table-name Music \
--key-condition-expression "Artist = :a" \
--expression-attribute-values '{":a":{"S":"The Beatles"}}' \
--projection-expression "SongTitle, Year"
更新数据使用update-item,可以只修改部分属性而不影响其他字段。通过--update-expression指定更新动作,SET用于赋值,REMOVE用于删除属性,ADD用于数字加减或集合添加元素。更新时同样支持条件表达式,比如只在Year小于某个值时更新。
四、更新与删除表操作
表创建后可能需要调整吞吐量、启用DynamoDB Streams或添加全局二级索引,这些操作都可以通过update-table完成。例如将按请求付费改为预置吞吐并设置读写容量为5和10,可以执行以下命令。
aws dynamodb update-table \
--table-name Music \
--billing-mode PROVISIONED \
--provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=10
添加全局二级索引需要提供索引名、新的属性定义和键架构,创建过程会消耗几分钟,期间表状态会先变为UPDATING,完成后恢复为ACTIVE。可以通过describe-table查看GlobalSecondaryIndexes字段的IndexStatus来确认索引是否可用。启用流则使用--stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES,方便后续触发Lambda处理变更。
删除表使用delete-table,命令会立即启动删除流程,表数据和索引都会被清除。DynamoDB会保留一段时间用于意外删除恢复,但如果启用了连续备份或时间点恢复,可以从备份还原。删除前建议先运行describe-table确认表名和资源状态,防止误删生产表。自动化脚本里可以加上--table-name参数校验或交互确认。
批量操作多个表时,可以用Shell循环结合list-tables输出,例如for t in $(aws dynamodb list-tables --query "TableNames[]" --output text); do aws dynamodb delete-table --table-name "$t"; done。这种方式要谨慎使用,最好先限制--starting-table或过滤条件,避免误删其他环境的表。
五、错误排查与效率技巧
使用AWS CLI操作DynamoDB时,常见的错误类型有AccessDeniedException、ResourceNotFoundException和ValidationException。AccessDeniedException通常表示IAM权限不足,需要检查策略是否包含对应动作;ResourceNotFoundException说明表名错误或表已被删除;ValidationException大多是因为参数格式不正确,比如属性定义与键架构不匹配、JSON转义错误或表达式语法问题。
排查问题可以添加--debug参数输出完整请求和响应,定位是签名、端点还是参数错误。日常使用建议设置--output json保留原始结构,配合jq工具提取字段。例如aws dynamodb describe-table --table-name Music | jq '.Table.TableStatus'可以快速获取表状态。如果没有jq,用--query参数也能实现类似效果。
对于复杂参数较多的操作,可以先使用aws dynamodb create-table --generate-cli-skeleton生成JSON骨架,填入内容后再通过--cli-input-json file://schema.json执行,避免命令行转义问题。把常用操作封装成Shell函数或脚本,结合环境变量区分开发、测试和生产表,可以显著提升维护效率。