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。

系统与运维·共 41 条命令·最后更新 2026-07-19
awscli云devops

典型使用场景

面向在跳板机、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 configure
交互式配置 Access Key 和 Region
aws configure --profile production
为指定 Profile 配置凭证
aws configure list
查看当前配置
aws sts get-caller-identity
验证当前身份
export AWS_PROFILE=production
切换默认 Profile
aws configure set region us-west-2
单独设置某个配置项

EC2 实例 6

aws ec2 describe-instances --filters "Name=instance-state-name,Values=running"
列出运行中的实例
aws ec2 describe-instances --query "Reservations[].Instances[].[InstanceId,State.Name]"
查询实例 ID 和状态
aws ec2 start-instances --instance-ids i-xxxxx
启动实例
aws ec2 stop-instances --instance-ids i-xxxxx
停止实例
aws ec2 terminate-instances --instance-ids i-xxxxx
终止实例(不可恢复)
aws ec2 create-key-pair --key-name my-key --query "KeyMaterial" --output text > my-key.pem
创建 SSH 密钥对并保存私钥

S3 存储 8

aws s3 ls
列出所有 Bucket
aws s3 ls s3://my-bucket/
列出 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 s3://src-bucket/ s3://dst-bucket/ --delete
Bucket 间同步并删除目标多余文件
aws s3 rm s3://my-bucket/file.txt
删除文件
aws s3 mb s3://new-bucket-name
创建新 Bucket

IAM 用户与权限 6

aws iam list-users
列出所有 IAM 用户
aws iam create-user --user-name newuser
创建 IAM 用户
aws iam create-access-key --user-name newuser
为用户创建 Access Key
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 delete-user --user-name newuser
删除 IAM 用户

CloudWatch 日志与监控 5

aws logs describe-log-groups
列出日志组
aws logs tail /app/production --follow
实时跟踪日志
aws logs filter-log-events --log-group-name mygroup --start-time 1234567890
按时间过滤日志
aws logs tail /app/production --since 1h
查看最近 1 小时日志
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
查询 EC2 CPU 使用率指标

Lambda 与服务 5

aws lambda list-functions
列出所有 Lambda 函数
aws lambda invoke --function-name my-function output.json
同步调用 Lambda 函数
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
创建 Lambda 函数
aws rds describe-db-instances
列出 RDS 数据库实例
aws dynamodb list-tables
列出 DynamoDB 表

实用查询技巧 5

aws ec2 describe-instances --output table
以表格形式输出(更易读)
aws s3api list-objects --bucket my-bucket --query "Contents[?Size>`1000000`].Key"
用 JMESPath 查询大于 1MB 的文件
aws ec2 describe-instances --filters "Name=tag:Name,Values=web-*"
按标签过滤实例
aws ec2 describe-instances --query "Reservations[].Instances[].PublicIpAddress" --output text
提取所有实例的公网 IP
aws s3 presign s3://my-bucket/file.zip --expires-in 3600
生成 1 小时有效的预签名 URL

参数矩阵

参数作用示例
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 适合 jqaws 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. 1确认当前身份与账号

    aws sts get-caller-identity

    任何变更操作前的第一道校验。

  2. 2看配置来源与冲突项

    aws configure list

    标出 access_key 为 None 时说明凭据来自环境变量或实例角色。

  3. 3把大结果压成可读表格

    aws ec2 describe-instances --output table

    先用 table 看全貌,再用 --query 精确取字段。

  4. 4同步前预演,确认 --delete 的影响范围

    aws s3 sync ./local/ s3://my-bucket/remote/ --delete --dryrun

    输出中标记 delete 的行就是将被删除的对象。

  5. 5按标签筛出自己的资源

    aws ec2 describe-instances --filters "Name=tag:Name,Values=web-*"

    避免在大账号里误伤别人的资源。

  6. 6只取需要的几列并压成一行一个值

    aws ec2 describe-instances --query "Reservations[].Instances[].PublicIpAddress" --output text

    text 输出可直接喂给 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 3600

presign 生成的 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日,内容持续校对官方文档。

联系我们

命令或描述有误?提交反馈、商务合作或产品建议都可发送邮件给我们。

联系我们