AWS CLI 命令速查表 - EC2/S3/IAM 云资源管理大全
控制台能点的操作,脚本里迟早要再点一次——这张表覆盖配置认证、EC2、S3、IAM、CloudWatch、Lambda 与查询技巧。认证一组解释为什么本地必须写 --profile:多账号并行时环境变量和默认 profile 互相覆盖,是排查噩梦的常见来源。查询一组用得最多:--output table 给人看,--output json 喂 jq,--query 走 JMESPath 直接抽字段进变量,一条命令替掉解析 JSON 的二十行脚本。排障路径也写清了:实例起不来先看 describe-instances 的 StateReason,再去 CloudTrail 找 CreateFailedReason。边界在于它是单次调用客户端而非编排工具,循环与重试该交给 CloudFormation 或 CI。
典型使用场景
面向在跳板机、CI runner 或本地终端里排查与操作云资源的工程师。AWS CLI 真正的价值是把控制台里点不动的批量操作变成可重复、可 review 的命令:用 --filters 收窄范围、用 --query 做 JMESPath 投影、用 --output table/text/json 控制呈现。本表覆盖配置与 profile(configure / AWS_PROFILE / sts get-caller-identity)、EC2、S3、IAM、CloudWatch 日志与指标、Lambda,以及实用查询技巧。必须建立的一个安全习惯是每次操作前先跑 sts get-caller-identity —— 因为账号与 profile 配错时,命令会成功执行在错误的账号里,而 terminate-instances 这类操作不可撤销。
配置与认证 6
aws configureaws configure --profile productionaws configure listaws sts get-caller-identityexport AWS_PROFILE=productionaws configure set region us-west-2EC2 实例 6
aws ec2 describe-instances --filters "Name=instance-state-name,Values=running"aws ec2 describe-instances --query "Reservations[].Instances[].[InstanceId,State.Name]"aws ec2 start-instances --instance-ids i-xxxxxaws ec2 stop-instances --instance-ids i-xxxxxaws ec2 terminate-instances --instance-ids i-xxxxxaws ec2 create-key-pair --key-name my-key --query "KeyMaterial" --output text > my-key.pemS3 存储 8
aws s3 lsaws s3 ls s3://my-bucket/aws s3 cp file.txt s3://my-bucket/aws s3 cp s3://my-bucket/file.txt ./file.txtaws s3 sync ./local/ s3://my-bucket/remote/aws s3 sync s3://src-bucket/ s3://dst-bucket/ --deleteaws s3 rm s3://my-bucket/file.txtaws s3 mb s3://new-bucket-nameIAM 用户与权限 6
aws iam list-usersaws iam create-user --user-name newuseraws iam create-access-key --user-name newuseraws iam attach-user-policy --user-name newuser --policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccessaws iam list-attached-user-policies --user-name newuseraws iam delete-user --user-name newuserCloudWatch 日志与监控 5
aws logs describe-log-groupsaws logs tail /app/production --followaws logs filter-log-events --log-group-name mygroup --start-time 1234567890aws logs tail /app/production --since 1haws cloudwatch get-metric-statistics --namespace AWS/EC2 --metric-name CPUUtilization --start-time 2026-07-20T00:00:00Z --end-time 2026-07-21T00:00:00Z --period 3600 --statistics AverageLambda 与服务 5
aws lambda list-functionsaws lambda invoke --function-name my-function output.jsonaws lambda create-function --function-name my-fn --runtime python3.11 --role arn:aws:iam::123:role/role --handler index.handler --zip-file fileb://fn.zipaws rds describe-db-instancesaws dynamodb list-tables实用查询技巧 5
aws ec2 describe-instances --output tableaws s3api list-objects --bucket my-bucket --query "Contents[?Size>`1000000`].Key"aws ec2 describe-instances --filters "Name=tag:Name,Values=web-*"aws ec2 describe-instances --query "Reservations[].Instances[].PublicIpAddress" --output textaws s3 presign s3://my-bucket/file.zip --expires-in 3600参数矩阵
| 参数 | 作用 | 示例 |
|---|---|---|
aws configure --profile production | 写入 ~/.aws/config 里的独立 profile,让多账号切换不必覆盖默认凭据 | aws configure --profile production |
aws configure list | 查看当前生效的凭据来源与配置项,是排查「为什么连的是错账号」的第一站 | aws configure list |
aws sts get-caller-identity | 返回当前身份与账号,任何变更操作前的必备校验,比看配置更可靠 | aws sts get-caller-identity |
export AWS_PROFILE=production | 用环境变量选择 profile,脚本里比反复写 --profile 更清晰 | export AWS_PROFILE=production |
aws configure set region us-west-2 | 只改单个配置项并写回 profile,省去交互式 configure 的问答 | aws configure set region us-west-2 |
--filters "Name=instance-state-name,Values=running" | 服务端过滤,先过滤再返回,能显著缩短大账号下的响应时间 | aws ec2 describe-instances --filters "Name=instance-state-name,Values=running" |
--query "Reservations[].Instances[].[InstanceId,State.Name]" | JMESPath 客户端投影,把嵌套结构压成需要的几列 | aws ec2 describe-instances --query "Reservations[].Instances[].[InstanceId,State.Name]" |
--output table | 表格呈现,适合人看;--output text 适合喂给后续命令,json 适合 jq | aws ec2 describe-instances --output table |
--output text --query "Contents[?Size>`1000000`].Key" | 过滤表达式用反引号包数值字面量,直接得到一列可用的值 | aws s3api list-objects --bucket my-bucket --query "Contents[?Size>`1000000`].Key" |
aws ec2 start-instances --instance-ids i-xxxxx | 按实例 ID 批量启动;stop 是保持 EBS 与配置,terminate 才释放 | aws ec2 start-instances --instance-ids i-xxxxx |
aws ec2 terminate-instances --instance-ids i-xxxxx | 销毁实例,不可撤销;执行前务必确认 ID 与账号 | aws ec2 terminate-instances --instance-ids i-xxxxx |
aws ec2 create-key-pair --query "KeyMaterial" --output text > my-key.pem | 私钥只在创建时返回一次,因此这一步必须重定向落盘,否则无法再取回 | aws ec2 create-key-pair --key-name my-key --query "KeyMaterial" --output text > my-key.pem |
aws s3 ls s3://my-bucket/ | 列举桶或前缀内容,末尾斜杠决定列目录还是列桶名 | aws s3 ls s3://my-bucket/ |
aws s3 cp file.txt s3://my-bucket/ | 单文件上传下载;大文件会自动分片并发 | aws s3 cp s3://my-bucket/file.txt ./file.txt |
aws s3 sync ./local/ s3://my-bucket/remote/ | 按「大小与时间戳」做增量同步,只传差异;源与目标路径末尾斜杠都要留 | aws s3 sync ./local/ s3://my-bucket/remote/ |
aws s3 sync ... --delete | 删除目标端源端已无的对象,用于精确镜像;务必先 --dryrun 预演 | aws s3 sync s3://src-bucket/ s3://dst-bucket/ --delete |
aws s3 rm s3://my-bucket/file.txt | 删除对象;若桶开启了版本控制,这只是新增删除标记 | aws s3 rm s3://my-bucket/file.txt |
aws s3 mb s3://new-bucket-name | 创建桶;建完记得按需求设置区域、加密与公开访问策略 | aws s3 mb s3://new-bucket-name |
aws iam create-user --user-name newuser | 建 IAM 用户本身不等于能登录,必须再配访问密钥或密钥对 | aws iam create-user --user-name newuser |
aws iam attach-user-policy | 直接挂 AWS 托管策略;最小权限场景更适合自建策略而不是托管策略 | aws iam attach-user-policy --user-name newuser --policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess |
aws iam list-attached-user-policies --user-name newuser | 确认实际生效的策略,是排查「权限莫名生效/失效」的依据 | aws iam list-attached-user-policies --user-name newuser |
aws logs tail /app/production --follow | 实时跟踪日志组,等价于 tail -f 免去查流式接口的繁琐 | aws logs tail /app/production --follow |
aws logs tail /app/production --since 1h | 限制回溯时间窗,避免一次性拉出几 GB 日志 | aws logs tail /app/production --since 1h |
aws logs filter-log-events --log-group-name mygroup --start-time 1234567890 | 按时间戳(毫秒)过滤事件,排查指定时段问题时用 | aws logs filter-log-events --log-group-name mygroup --start-time 1234567890 |
aws cloudwatch get-metric-statistics --period 3600 --statistics Average | 按粒度与统计量取指标;period 不对齐粒度会返回空数据点 | aws cloudwatch get-metric-statistics --namespace AWS/EC2 --metric-name CPUUtilization --start-time 2026-07-20T00:00:00Z --end-time 2026-07-21T00:00:00Z --period 3600 --statistics Average |
aws lambda invoke --function-name my-function output.json | 同步调用函数,响应体落到 output.json;第二行是函数错误 | aws lambda invoke --function-name my-function output.json |
aws lambda create-function --zip-file fileb://fn.zip | 创建函数要求 zip 上传或指向 S3;权限角色 ARN 写错会在调用时报错 | aws lambda create-function --function-name my-fn --runtime python3.11 --role arn:aws:iam::123:role/role --handler index.handler --zip-file fileb://fn.zip |
aws s3 presign s3://my-bucket/file.zip --expires-in 3600 | 生成限时直连 URL,分发大文件时避免中转流量与权限扩散 | aws s3 presign s3://my-bucket/file.zip --expires-in 3600 |
aws ec2 describe-instances --filters "Name=tag:Name,Values=web-*" | 按标签过滤,是从一个大账号里挑出「我的」资源最可靠的方式 | aws ec2 describe-instances --filters "Name=tag:Name,Values=web-*" |
易错点与避坑指南
现象命令在错误的账号里执行成功,资源改错了地方。
原因profile 与环境变量残留不同步,AWS_PROFILE、~/.aws/credentials 或实例角色的优先级容易被忽略。
处置每条变更命令前跑 aws sts get-caller-identity 核对账号;脚本里显式写 --profile,不依赖全局默认。
现象s3 sync 之后目标端多出预期外的文件,或源端删掉的文件在目标端仍在。
原因sync 默认不做删除;加了 --delete 又会让目标端多余对象被删,而且路径末尾斜杠决定同步的是目录还是目录名本身。
处置先加 --dryrun 预演并核对 with --delete 时的删除清单;源与目标都写结尾斜杠。
现象create-key-pair 执行完了却找不到私钥。
原因KeyMaterial 只在创建响应里返回一次,没有 --output text > file 落盘就永久丢失,只能换密钥对。
处置重定向到文件并立刻 chmod 600;如果密钥已经丢了,删除该密钥对并新建。
现象get-metric-statistics 返回空数据点,看不到曲线。
原因--period 与 CloudWatch 存储粒度不匹配(如取 1 分钟粒度而底层是 5 分钟),或时间区间写成 UTC 之外时区。
处置让 period 不小于该指标的存储粒度,时间统一用 ISO8601 带 Z 的 UTC 格式。
现象返回体巨大导致终端卡死,也不好阅读。
原因describe-* 类接口在全量返回时可能有上千个对象,没有过滤与投影。
处置优先加 --filters 做服务端过滤,再用 --query 投影出需要的几列,最后决定用 table 还是 text。
现象sts get-caller-identity 报 "ExpiredToken" 或 "InvalidClientTokenId"。
原因临时凭据(STS/实例角色)已过期,或 ~/.aws/credentials 里残留了过期条目。
处置刷新凭据来源(重新 assume-role 或换 profile),并检查 ~/.aws/config 里的 role_arn 与 source_profile 是否仍有效。
现象IAM 用户创建了却无法访问任何资源。
原因创建用户与授权是两件事,没有 attach 任何策略的用户权限边界为空。
处置用 list-attached-user-policies 核对已挂策略,必要时用 attach-user-policy 补最小权限。
现象lambda invoke 命令成功返回,但函数其实报错了。
原因命令本身的退出码只反映调用是否送达,函数内部错误体现在输出文件的第二段与 StatusCode 字段。
处置调用后读 output.json:首行 StatusCode 非 200 即失败;批量场景改用 --log-type Tail 看日志。
排障路径
1确认当前身份与账号
aws sts get-caller-identity任何变更操作前的第一道校验。
2看配置来源与冲突项
aws configure list标出 access_key 为 None 时说明凭据来自环境变量或实例角色。
3把大结果压成可读表格
aws ec2 describe-instances --output table先用 table 看全貌,再用 --query 精确取字段。
4同步前预演,确认 --delete 的影响范围
aws s3 sync ./local/ s3://my-bucket/remote/ --delete --dryrun输出中标记 delete 的行就是将被删除的对象。
5按标签筛出自己的资源
aws ec2 describe-instances --filters "Name=tag:Name,Values=web-*"避免在大账号里误伤别人的资源。
6只取需要的几列并压成一行一个值
aws ec2 describe-instances --query "Reservations[].Instances[].PublicIpAddress" --output texttext 输出可直接喂给 ssh、curl 等后续命令。
命令示例
换账号前先确认自己是谁
aws configure list
aws sts get-caller-identity
export AWS_PROFILE=production
aws sts get-caller-identity两条 sts get-caller-identity 分别在切换前和切换后执行,用输出里的 Account 对比就知道环境有没有切干净。这一步能挡住绝大多数「在生产账号上跑了测试命令」的事故——报错信息往往在几分钟后才出现,那时数据已经被改写了。
输出
"UserId": "AIDAEXAMPLE", "Account": "123456789012"
用 filter + query 把实例列表收敛到一屏
aws ec2 describe-instances \
--filters "Name=tag:Name,Values=web-*" \
--query "Reservations[].Instances[].[InstanceId,State.Name]" \
--output table三个选项各管一层:--filters 在服务端过滤(少传数据),--query 用 JMESPath 在客户端抽取需要的列(少显示列),--output table 决定呈现方式。缺 --filters 时账户里所有区域的实例都会被拉回来,几十台机器时输出直接没法读。
输出
------------------- | InstanceId | State.Name | | i-0a1b2c3d4e | running |
找 S3 里的大文件再决定删谁
aws s3 ls s3://my-bucket/ --human-readable
aws s3api list-objects --bucket my-bucket \
--query "Contents[?Size>`1000000`].Key"先把桶内容列出来看体量,再用 s3api 的 JMESPath 过滤筛出超过 1MB 的 key。顺序不能反:先拿到 key 列表再逐个人工确认,最后才执行 aws s3 rm,这样不会在没看清名字的情况下删掉东西。
目录同步先不带 --delete 跑一遍
aws s3 sync ./local/ s3://my-bucket/remote/
aws s3 sync ./local/ s3://my-bucket/remote/ --dryrun
aws s3 sync ./local/ s3://my-bucket/remote/ --delete--delete 会把目标端存在、源端没有的对象全部删除,路径写错(比如把 ./local 写成 ./ 或者末尾少一个斜杠)就会成片删数据。先跑普通 sync 确认源没问题,再用 --dryrun 看 --delete 到底要删哪些文件名,看清输出再加 --delete。
输出
delete: s3://my-bucket/remote/old-file.log
给外部用户发一个限时下载链接,不落盘
aws s3 presign s3://my-bucket/file.zip --expires-in 3600presign 生成的 URL 自带签名和过期时间,发给别人就能下载,无需把 AK/SK 或临时凭证写进任何文件。链接一旦发出就等同于给了该文件权限,所以过期时间尽量设短,用完即弃。
输出
https://my-bucket.s3.amazonaws.com/file.zip?X-Amz-Algorithm=...
常见坑与注意事项
- aws configure 交互时选错 Profile,凭证就明文落到 ~/.aws/credentials(默认 0644 权限),CI 机器上的同用户其它进程可直接读取。设完权限改收紧:chmod 600 ~/.aws/credentials,并且不要用 --profile 之外的方式把 AK/SK 写进行内环境变量再提交到仓库。
- 同一份凭证既配在 ~/.aws/credentials 又用 export AWS_ACCESS_KEY_ID 导出时,环境变量优先级更高,会静默顶掉配置文件里的 Profile——你以为在用 staging 账号,实际打的是生产的。任何会话开始前先跑 aws sts get-caller-identity 核对 Account。
- aws ec2 terminate-instances 与 stop-instances 只有一个字母之差:前者删除实例且不可恢复,后者可再启动。在实例 ID 是从 --query 或管道粘贴来的场景下,粘贴成 stop 极容易变成 terminate。批量操作前先用 aws ec2 describe-instances --filters "Name=instance-state-name,Values=running" --output table 复核 ID 列表。
- Region 不匹配是最难排查的一类问题:命令返回的不是 InvalidClientTokenId 或 AccessDenied,而是「桶不存在」「资源不存在」这类误导性错误。aws configure set region us-west-2 之后忘了 export,或 S3 用 aws s3 ls(走全局端点)而 EC2 用区域端点,两边行为会不一致。排查时先 aws configure list 看 region 是否为空。
- aws s3 sync --delete 和 aws s3 rm 的删除不可回滚,且 S3 版本控制默认关闭时删掉就是永久消失。要恢复只能依赖事前开启的版本控制或跨区域复制。清理前先 aws s3 ls s3://bucket/prefix/ 逐条确认 key,别把通配前缀写宽了。
- aws iam create-access-key 生成的 Secret 只在创建响应里出现一次,丢失后只能 delete-access-key 再重建(会打断使用该 key 的所有服务)。密钥不要贴进工单、聊天群或 CI 日志;排查用 aws iam list-access-keys 确认状态即可,不要把 secret 打进命令参数。
提示
- aws configure --profile production 可以创建命名 Profile,方便多账号管理。
- S3 的 sync 命令只传输变化的文件,适合备份和部署。
- aws ec2 describe-instances --query 可以用 JMESPath 过滤输出。
- CloudWatch Logs Insights 用查询语法分析日志,比 filter-log-events 更强大。
- --output 参数可选 json/table/text,text 适合脚本处理,table 适合人工查看。
- --query 用 JMESPath 语法提取字段,配合 --output text 适合 shell 脚本。
- export AWS_PROFILE=prod 让会话内所有 aws 命令自动切账号,比在每条命令后面加 --profile 少一层手滑导致的操作到错误环境。
- --generate-cli-skeleton output | bash 可以打印当前版本的完整可用参数,查冷门服务的子命令比翻文档准,也避免升级后参数已删除导致的报错。
- 把 --output json 加到 ~/.aws/config 的 cli_defaults 里做全局默认,脚本里就不用每次显式声明输出格式,减少漏写导致的解析失败。
常见问题
同一台机器要操作多个 AWS 账号,怎么避免串号误操作生产环境?
用命名 Profile 隔离:aws configure --profile production 单独存一套 Access Key 和 Region,之后 export AWS_PROFILE=production 切换默认身份,或在每条命令上直接带 --profile production。用 aws sts get-caller-identity 随时确认当前凭证到底是谁,aws configure list 列出全部配置项。这样开发账号和线上账号不会互相污染,也不用反复重写 ~/.aws/credentials。
aws s3 cp 和 aws s3 sync 什么时候用哪个?
看是不是整目录。cp 是一次性搬运,指定明确:aws s3 cp file.txt s3://my-bucket/ 上传,aws s3 cp s3://my-bucket/file.txt ./file.txt 下载,删单个文件用 aws s3 rm s3://my-bucket/file.txt。sync 是目录级同步,只传输发生变化的文件,适合备份和部署:aws s3 sync ./local/ s3://my-bucket/remote/。注意加上 --delete 后会删掉目标端多出来的文件,双向同步务必先确认方向。
怎么从几千行 CLI 输出里只挑我需要的字段?
用 --query 写 JMESPath 表达式过滤,再用 --output 决定呈现方式。例如 aws ec2 describe-instances --query "Reservations[].Instances[].[InstanceId,State.Name]" 抽出实例 ID 与状态;aws ec2 describe-instances --query "Reservations[].Instances[].PublicIpAddress" --output text 输出每行一个公网 IP,便于脚本处理;--output table 更适合人看,--output text 适合喂给 shell。S3 里还可以这样用:aws s3api list-objects --bucket my-bucket --query "Contents[?Size>`1000000`].Key" 筛出大于 1MB 的文件。
线上服务器没有密钥,怎么临时登录又不留隐患?
两步走:先 aws ec2 create-key-pair --key-name my-key --query "KeyMaterial" --output text > my-key.pem 生成并落盘私钥,再用 aws ec2 describe-instances --filters "Name=tag:Name,Values=web-*" 按标签筛出目标实例的 ID,最后 aws ec2 start-instances --instance-ids i-xxxxx 启动后登录。用完记得在控制台或 IAM 侧清理这把临时密钥;注意 terminate-instances 是不可恢复的销毁,和 stop-instances 的临时停机不是一回事。
排查线上问题想实时看日志,又不想被日志量刷屏?
三种按需收窄的方式。追一个日志组的最新输出:aws logs tail /app/production --follow。只看最近一小时:aws logs tail /app/production --since 1h。按时间戳区间做精确检索:aws logs filter-log-events --log-group-name mygroup --start-time 1234567890。摸底阶段先用 aws logs describe-log-groups 把有哪些组列出来;注意 filter-log-events 只是按时间过滤,复杂的多条件检索要用 CloudWatch Logs Insights 的查询语法,能力更强。
由 巧匠 维护
公开更新于 2026年7月19日,内容持续校对官方文档。