aws configure交互式问答,把 AK SK、默认 region、输出格式写到 ~/.aws/credentials 和 ~/.aws/config。
⚠ 常见坑: 默认写到 [default] profile。多账号公司必须 aws configure --profile <name>,否则会把已有的覆盖掉。
aws configure
aws configure --profile prod
aws configure list
AWS CLI 命令速查,80+ 条覆盖 EC2/S3/IAM/Lambda/RDS/EKS/CloudFormation,带真实例子。
aws configure交互式问答,把 AK SK、默认 region、输出格式写到 ~/.aws/credentials 和 ~/.aws/config。
⚠ 常见坑: 默认写到 [default] profile。多账号公司必须 aws configure --profile <name>,否则会把已有的覆盖掉。
aws configure
aws configure --profile prod
aws configure list
aws configure sso配 IAM Identity Center(SSO)profile,浏览器跳出来登录,本地缓存短效 token。
⚠ 常见坑: token 默认 8 小时过期,过期后所有命令都 401,重新 aws sso login --profile <name> 就行,不用再 configure。
aws configure sso
aws sso login --profile prod-admin
aws sso logout
aws sts get-caller-identity打印当前凭证对应的账号 ID、用户/角色 ARN、user ID。AWS 的 whoami。
⚠ 常见坑: 任何写/删操作前先跑一遍。两秒的确认救过无数程序员,免得在错的账号里删错栈。
aws sts get-caller-identity
aws sts get-caller-identity --profile prod
aws sts get-caller-identity --output text --query Arn
aws sts assume-role扮演(assume)一个 IAM 角色,返回该角色的临时凭证(AK SK + session token)。
⚠ 常见坑: 返回凭证默认 1 小时过期。要 export 三个变量,大部分人忘了 AWS_SESSION_TOKEN。更优雅:~/.aws/config 里设 source_profile + role_arn,CLI 自动 assume。
aws sts assume-role --role-arn arn:aws:iam::123456789012:role/Admin --role-session-name lilei
aws sts assume-role-with-web-identity --role-arn ... --web-identity-token $TOKEN --role-session-name ci
aws configure list-profiles列出 ~/.aws/credentials 和 ~/.aws/config 里所有 profile 名字。
aws configure list-profiles
AWS_PROFILE=prod aws sts get-caller-identity
aws --version打印 CLI 版本。v1 和 v2 的 pager、output、二进制 payload 编码默认值都不一样,出问题先看版本。
⚠ 常见坑: v1 已经停止维护。多数运维问题是 v1 跑着 v2 文档。pip install --upgrade awscli 升 v1,或者用 v2 installer 装 v2。
aws --version
which aws
aws configure get读 profile 里某一项配置(region、output、aws_access_key_id 等),不用手动翻文件。
aws configure get region --profile prod
aws configure get output
aws configure get aws_access_key_id --profile dev
aws configure set非交互地往 ~/.aws/config 或 ~/.aws/credentials 写一项配置。装机脚本里很顺手。
⚠ 常见坑: 设 aws_secret_access_key 会把明文 secret 写进 ~/.aws/credentials。能用 SSO 或 assume-role 就别存长效 key。
aws configure set region ap-northeast-1 --profile prod
aws configure set output json --profile prod
aws configure set cli_pager "" --profile prod
aws sts get-session-token为你自己的身份换一组临时凭证,常用于敏感操作前满足 MFA 要求。
⚠ 常见坑: 它不切角色,只是把当前身份包一层(可带 MFA)。要换权限用 assume-role。
aws sts get-session-token --serial-number arn:aws:iam::123456789012:mfa/lilei --token-code 123456
aws sts get-session-token --duration-seconds 3600
aws sts get-access-key-info把一个 access key ID(AKIA…/ASIA…)反查出它属于哪个 AWS 账号,不需要任何权限。
⚠ 常见坑: 应急排查神器:捡到一个不知归属的泄漏 key,一条命令就能定位到账号,再决定怎么处置。
aws sts get-access-key-info --access-key-id AKIAIOSFODNN7EXAMPLE
aws sso login在浏览器里重新登录,刷新某个 profile 的短效 SSO token。不用重新 configure。
⚠ 常见坑: token 过期后所有命令都 401,解法是 aws sso login,不是 aws configure sso。无界面机器加 --no-browser。
aws sso login --profile prod-admin
aws sso login --no-browser --profile ci
aws ec2 describe-instances列出当前 region 所有 EC2 实例的完整信息:ID、机型、IP、安全组、tag、启动时间。
⚠ 常见坑: 默认 table 输出会按终端宽度截断列。脚本里用 --output text --query 抽具体字段。不加 --filters 会把所有实例都列出来。
aws ec2 describe-instances
aws ec2 describe-instances --filters "Name=instance-state-name,Values=running"
aws ec2 describe-instances --query "Reservations[].Instances[].[InstanceId,State.Name,Tags[?Key=='Name'].Value|[0]]" --output table
aws ec2 start-instances按实例 ID 启动一个或多个已停止的 EC2 实例。
⚠ 常见坑: 每次 stop/start 公网 IP 都会变,除非挂了 Elastic IP。书签和 DNS 记录会失效。
aws ec2 start-instances --instance-ids i-0abc1234def567890
aws ec2 start-instances --instance-ids i-aaa i-bbb i-ccc
aws ec2 stop-instances停止运行中的 EC2。EBS 卷和 Elastic IP 都还在,只是不再付计算钱。
⚠ 常见坑: 停了仍然要为 EBS 付费。彻底停账单要 terminate,但 terminate 默认会一起删卷。
aws ec2 stop-instances --instance-ids i-0abc1234def567890
aws ec2 stop-instances --instance-ids i-aaa --hibernate
aws ec2 terminate-instances永久销毁 EC2 实例。实例 ID 不可恢复,根卷默认一起删。
⚠ 常见坑: 不可逆。生产机一定加终止保护(modify-instance-attribute --disable-api-termination),免得手抖删掉。
aws ec2 terminate-instances --instance-ids i-0abc1234def567890
aws ec2 modify-instance-attribute --instance-id i-aaa --disable-api-termination
aws ec2 run-instances从 AMI 启动一个新 EC2 实例。要指定镜像、机型、key pair、子网、安全组。
⚠ 常见坑: 忘传 --security-group-ids 会用默认 SG,通常全部入站拒绝。忘传 --key-name 没 SSH key,登不上。
aws ec2 run-instances --image-id ami-0abcdef --instance-type t3.micro --key-name lilei --security-group-ids sg-aaa --subnet-id subnet-bbb
aws ec2 run-instances --image-id ami-0abcdef --instance-type t3.micro --count 3 --tag-specifications "ResourceType=instance,Tags=[{Key=Env,Value=dev}]"aws ec2 describe-security-groups列出所有安全组及其入站/出站规则。
aws ec2 describe-security-groups
aws ec2 describe-security-groups --group-ids sg-0abc1234
aws ec2 describe-security-groups --filters "Name=group-name,Values=web"
aws ec2 authorize-security-group-ingress给安全组加一条入站规则,对 CIDR 或另一个 SG 开端口。
⚠ 常见坑: 把 22/3389 开 0.0.0.0/0 几小时内安全扫描就会告警。要么收口到办公室 CIDR,要么用 SSM Session Manager 彻底不开 SSH。
aws ec2 authorize-security-group-ingress --group-id sg-aaa --protocol tcp --port 443 --cidr 0.0.0.0/0
aws ec2 authorize-security-group-ingress --group-id sg-aaa --protocol tcp --port 22 --cidr 203.0.113.42/32
aws ec2 authorize-security-group-ingress --group-id sg-aaa --source-group sg-bbb --protocol tcp --port 5432
aws ec2 revoke-security-group-ingress从安全组里删一条入站规则。
aws ec2 revoke-security-group-ingress --group-id sg-aaa --protocol tcp --port 22 --cidr 0.0.0.0/0
aws ec2 describe-key-pairs列出当前 region 的所有 EC2 key pair(只有名字和指纹,没有私钥)。
aws ec2 describe-key-pairs
aws ec2 create-key-pair --key-name lilei-dev --query KeyMaterial --output text > lilei-dev.pem
aws ec2 describe-images按 owner、名字、架构找 AMI。"找 AMI ID" 的常用命令。
⚠ 常见坑: 不加 --owners 会扫整个 AMI marketplace,巨慢。加 --owners amazon 或 --owners 099720109477(Canonical)缩范围。
aws ec2 describe-images --owners amazon --filters "Name=name,Values=al2023-ami-*" --query "Images|sort_by(@,&CreationDate)[-1].ImageId" --output text
aws ec2 describe-images --owners 099720109477 --filters "Name=name,Values=ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-amd64-server-*"
aws ec2 allocate-address申请一个新的 Elastic IP。配合 associate-address 挂到实例或 ENI 上。
⚠ 常见坑: 没挂出去的 EIP 每小时 $0.005。不用的及时 release-address,不然账单慢慢涨。
aws ec2 allocate-address
aws ec2 associate-address --instance-id i-aaa --allocation-id eipalloc-bbb
aws ec2 reboot-instances原地重启运行中的 EC2。实例 ID、私网 IP、EBS 卷都不变。
⚠ 常见坑: reboot 不等于 stop/start,机器还在同一台宿主机上,治不了底层硬件故障。那种情况要 stop 再 start。
aws ec2 reboot-instances --instance-ids i-0abc1234def567890
aws ec2 describe-instance-status查实例的系统状态检查、实例状态检查,以及有没有计划事件(退役、重启)。
⚠ 常见坑: 默认只显示运行中的实例。要看非运行的加 --include-all-instances。
aws ec2 describe-instance-status --instance-ids i-aaa
aws ec2 describe-instance-status --include-all-instances --filters "Name=instance-status.status,Values=impaired"
aws ec2 describe-volumes列 EBS 卷,含大小、类型、状态、挂在哪个实例上。
⚠ 常见坑: 按 status=available 过滤能找出没挂载的孤儿卷。卸下来的 EBS 照样按小时收费,纯浪费。
aws ec2 describe-volumes --filters "Name=status,Values=available"
aws ec2 describe-volumes --query "Volumes[].[VolumeId,Size,State]" --output table
aws ec2 create-snapshot给 EBS 卷做一个时间点快照。快照是增量的,底层存在 S3 里。
⚠ 常见坑: 运行中实例要多卷一致快照,用 create-snapshots(复数)加 --instance-specification,别一个卷一个卷地拍。
aws ec2 create-snapshot --volume-id vol-0abc123 --description "before upgrade"
aws ec2 create-snapshots --instance-specification InstanceId=i-aaa --description "full-host"
aws ec2 describe-regions列出账号能用的所有 region,包括默认关闭、要手动开通(opt-in)的那些。
aws ec2 describe-regions --query "Regions[].RegionName" --output text
aws ec2 describe-regions --all-regions --query "Regions[?OptInStatus=='not-opted-in'].RegionName"
aws ec2 describe-availability-zones列某个 region 里的可用区(含 local/wavelength 区),含状态和 zone ID。
⚠ 常见坑: zone 名字(us-east-1a)每个账号随机映射,你的 us-east-1a 和别人账号的不是同一片硬件。要真正对齐用 zone ID(use1-az1)。
aws ec2 describe-availability-zones --region us-east-1 --query "AvailabilityZones[].[ZoneName,ZoneId]" --output table
aws ec2 create-tags给一个或多个 EC2 资源(实例、卷、快照、AMI 等)加 tag 或覆盖已有 tag。
⚠ 常见坑: tag 决定成本归集和 IAM 条件。Key 拼错不会报错,而是悄悄新建一个 tag,成本报表就此分裂。
aws ec2 create-tags --resources i-aaa vol-bbb --tags Key=Env,Value=prod Key=Owner,Value=lilei
aws ec2 delete-tags --resources i-aaa --tags Key=Temp
aws ec2 modify-instance-attribute在实例停止时改它的属性:机型、EBS 优化、user-data、终止保护等。
⚠ 常见坑: 改 --instance-type 必须先停机,而且新机型在同一 AZ 要有货,否则报 IncorrectInstanceState。
aws ec2 modify-instance-attribute --instance-id i-aaa --instance-type "{\"Value\":\"t3.large\"}"aws ec2 modify-instance-attribute --instance-id i-aaa --no-source-dest-check
aws ec2 get-console-output抓实例的串口控制台/启动日志。SSH 连不上、想看为啥没启动起来时第一手段。
⚠ 常见坑: 输出有缓存,启动后可能滞后几分钟。Nitro 实例加 --latest 强制拿最新串口输出。
aws ec2 get-console-output --instance-id i-aaa --output text
aws ec2 get-console-output --instance-id i-aaa --latest
aws ec2 describe-vpcs列 region 里的所有 VPC,含 CIDR 段,以及哪个是默认 VPC。
aws ec2 describe-vpcs --query "Vpcs[].[VpcId,CidrBlock,IsDefault]" --output table
aws ec2 describe-vpcs --filters "Name=isDefault,Values=true"
aws ec2 describe-subnets列子网,含所属 VPC、可用区、CIDR、剩余可用 IP 数。
⚠ 常见坑: 盯着 AvailableIpAddressCount。子网 IP 耗尽是 VPC 里 "Lambda/ENI/Fargate 起不来" 的经典根因。
aws ec2 describe-subnets --filters "Name=vpc-id,Values=vpc-aaa" --query "Subnets[].[SubnetId,AvailabilityZone,CidrBlock,AvailableIpAddressCount]" --output table
aws s3 ls列 S3 桶,或某个桶/前缀下的对象。S3 版的 ls。
⚠ 常见坑: 默认翻页只显示前 1000 个 key,翻页静默不提示。要看子前缀加 --recursive,翻页用 --page-size / --max-items 控制。
aws s3 ls
aws s3 ls s3://my-bucket/
aws s3 ls s3://my-bucket/logs/ --recursive --human-readable --summarize
aws s3 cp从/到/在 S3 之间复制文件。最基础的上传下载命令。
⚠ 常见坑: 默认单文件。整目录加 --recursive,或者直接用 aws s3 sync,后者是增量再传更快。
aws s3 cp ./build.tar.gz s3://my-bucket/releases/build.tar.gz
aws s3 cp s3://my-bucket/logs/access.log ./
aws s3 cp ./dist s3://my-bucket/site/ --recursive --acl public-read
aws s3 syncrsync 风格同步:只传体积或修改时间不同的文件。加 --delete 把目标里多余文件也删掉。
⚠ 常见坑: 源忘了写子目录(aws s3 sync . s3://b/ --delete)第一次跑会把整个桶清光。第一次跑加 --dryrun 看一遍。
aws s3 sync ./dist s3://my-bucket/ --delete
aws s3 sync s3://prod-bucket/ s3://backup-bucket/
aws s3 sync ./photos s3://my-bucket/photos --exclude "*.tmp" --include "*.jpg"
aws s3 mv移动对象,等价于 cp 之后再 rm 源对象。
⚠ 常见坑: 传一半网络断了源已经没了目标却空。重要数据先 cp 再校验再 rm,别一步到位。
aws s3 mv s3://my-bucket/tmp/file s3://my-bucket/archive/file
aws s3 mv ./local.csv s3://my-bucket/incoming/
aws s3 rm删除 S3 对象(整前缀加 --recursive)。
⚠ 常见坑: 开了版本的桶,rm 只是加一个删除标记,数据还在还要付存储费。要真删用 aws s3api delete-object 加 --version-id。
aws s3 rm s3://my-bucket/old.log
aws s3 rm s3://my-bucket/logs/ --recursive --exclude "*" --include "2024-*"
aws s3 mb建桶,创建新 S3 桶。名字全 AWS 唯一。
⚠ 常见坑: 桶名是全球唯一的。挑 `lilei-2026-logs` 这种带前缀的,别用 `logs` 早被占了。非 us-east-1 必须传 --region。
aws s3 mb s3://lilei-2026-logs
aws s3 mb s3://lilei-2026-logs --region ap-northeast-1
aws s3 rb删桶。默认只能删空桶,加 --force 会先清光内容再删。
⚠ 常见坑: --force 处理不了开了版本的桶。要先 aws s3api delete-objects 把所有版本删掉,再 rb。容易卡在这一步。
aws s3 rb s3://my-bucket
aws s3 rb s3://my-bucket --force
aws s3 presign生成一个限时 HTTPS 链接,任何人都能下载私有对象,不用给对方 AWS 账号。
⚠ 常见坑: 默认 1 小时过期,最长 7 天。拿到 URL 就能下,所以 URL 本身就是密文,别外漏。
aws s3 presign s3://my-bucket/report.pdf
aws s3 presign s3://my-bucket/report.pdf --expires-in 86400
aws s3 website把桶配成静态网站托管(指定 index 和 error 文档)。
⚠ 常见坑: website endpoint 只支持 HTTP 而且是 path-style URL。要 HTTPS + 自定义域名必须前面挂 CloudFront,或者走新的 S3 + OAC 模式。
aws s3 website s3://my-bucket/ --index-document index.html --error-document error.html
aws s3api list-objects-v2S3 底层 API,带分页 token、前缀、分隔符地列对象。aws s3 ls 满足不了时的兜底。
aws s3api list-objects-v2 --bucket my-bucket --prefix logs/ --max-keys 50
aws s3api list-object-versions --bucket my-bucket --prefix old.log
aws s3api put-public-access-block给桶设 Block Public Access。防止误开全网读权限的双保险。
⚠ 常见坑: 账号级设置覆盖桶级。两个都要设:s3control put-public-access-block --account-id <id> 和按桶设的这个。
aws s3api put-public-access-block --bucket my-bucket --public-access-block-configuration "BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true"
aws s3api put-bucket-policy给桶绑定 JSON 桶策略,控制谁能读写。
⚠ 常见坑: Principal:"*" 加 s3:GetObject 等于桶对全网开放。一定配合 Block Public Access 开关,不然每次安全审查都会被点名。
aws s3api put-bucket-policy --bucket my-bucket --policy file://policy.json
aws s3api head-object只取对象的元数据(大小、content-type、ETag、存储类、最后修改时间),不下载内容本身。
⚠ 常见坑: key 不存在时返回退出码 254 且报错为空,脚本要判 $? 而不是只看 stdout,才能区分 "不存在" 和 "出错"。
aws s3api head-object --bucket my-bucket --key path/to/file.zip
aws s3api copy-objectS3 内部服务端复制,可改存储类、元数据、加密方式,字节不经过你本机。
⚠ 常见坑: 改元数据必须加 --metadata-directive REPLACE。默认 COPY 指令下,你传的 --content-type 会被静默忽略。
aws s3api copy-object --bucket b --key file --copy-source b/file --storage-class GLACIER
aws s3api copy-object --bucket b --key f --copy-source b/f --metadata-directive REPLACE --content-type application/json
aws s3api put-bucket-versioning给桶开启(或暂停)对象版本控制,这样覆盖和删除都会保留旧版本。
⚠ 常见坑: 版本控制开启后只能 Suspended,无法彻底关闭。旧版本一直计费,要配生命周期规则过期掉非当前版本。
aws s3api put-bucket-versioning --bucket my-bucket --versioning-configuration Status=Enabled
aws s3api put-bucket-versioning --bucket my-bucket --versioning-configuration Status=Suspended
aws s3api put-bucket-lifecycle-configuration给桶配生命周期规则,把对象转到更便宜的存储类,或 N 天后过期删除。
⚠ 常见坑: 每次调用是替换整套规则,不是追加。先读现有配置,改 JSON,再把整套写回去。
aws s3api put-bucket-lifecycle-configuration --bucket my-bucket --lifecycle-configuration file://lifecycle.json
aws s3api put-bucket-encryption给桶设默认服务端加密(SSE-S3 / SSE-KMS),之后每个新对象自动落盘加密。
⚠ 常见坑: SSE-KMS 每个对象都打一次 KMS API,高频请求会撞 KMS 限流。开 S3 Bucket Keys 能大幅减少 KMS 调用。
aws s3api put-bucket-encryption --bucket my-bucket --server-side-encryption-configuration '{"Rules":[{"ApplyServerSideEncryptionByDefault":{"SSEAlgorithm":"aws:kms","KMSMasterKeyID":"alias/my-key"},"BucketKeyEnabled":true}]}'aws s3api get-bucket-location查桶在哪个 region。跨 region 操作或签 presigned URL 之前必须先确认。
⚠ 常见坑: us-east-1 的桶 API 返回 null(LocationConstraint 为空),这是历史遗留怪癖。看到 null 就当 us-east-1。
aws s3api get-bucket-location --bucket my-bucket --output text
aws s3api list-buckets列出你拥有的所有桶(跨全部 region),含创建时间。账号级桶清单。
aws s3api list-buckets --query "Buckets[].Name" --output text
aws s3api list-buckets --query "sort_by(Buckets,&CreationDate)[].[Name,CreationDate]" --output table
aws s3api restore-object把归档在 Glacier / Glacier Deep Archive 的对象发起恢复,临时拿回一份可下载副本。
⚠ 常见坑: 恢复是异步且慢的,Standard 档要几分钟到几小时,Deep Archive 最长 12 小时。轮询 head-object 看 Restore 头。
aws s3api restore-object --bucket my-bucket --key archive/data.bak --restore-request Days=3,GlacierJobParameters={Tier=Standard}aws iam list-users列出账号下所有 IAM 用户。
aws iam list-users
aws iam list-users --query "Users[].UserName" --output text
aws iam create-user建一个新 IAM 用户。默认没登录和编程访问权限,要单独加。
⚠ 常见坑: 现代做法是完全不建 IAM 用户,改用 Identity Center(SSO)联邦登录。长效 AK SK 的 IAM 用户是泄漏事故重灾区。
aws iam create-user --user-name lilei
aws iam create-login-profile --user-name lilei --password Temp-2026! --password-reset-required
aws iam attach-user-policy给 IAM 用户挂一个托管策略(AWS 自带的或自建的)。
⚠ 常见坑: 直接挂 AdministratorAccess 最省事但最危险。用具体的(PowerUserAccess、ReadOnlyAccess)按最小权限原则。
aws iam attach-user-policy --user-name lilei --policy-arn arn:aws:iam::aws:policy/ReadOnlyAccess
aws iam list-attached-user-policies --user-name lilei
aws iam create-access-key给 IAM 用户生成新 AK SK。secret 只会返回一次,当下不存以后再也拿不到。
⚠ 常见坑: AK SK 永远不要 commit 到 git,哪怕是私库。每 90 天轮换一次,旧的立刻删。一旦泄漏第一时间 aws iam delete-access-key,再追查影响。
aws iam create-access-key --user-name lilei
aws iam delete-access-key --user-name lilei --access-key-id AKIA...
aws iam list-roles列出账号下所有 IAM 角色。
aws iam list-roles --query "Roles[].RoleName" --output text
aws iam list-roles --path-prefix /aws-service-role/
aws iam create-role建 IAM 角色,要附 trust policy(谁能 assume 这个角色)。
⚠ 常见坑: trust policy 必填,而且是 AccessDenied 最常见根因:principal ARN 错了、condition 漏了。JSON 一定要对。
aws iam create-role --role-name MyAppRole --assume-role-policy-document file://trust.json
aws iam attach-role-policy --role-name MyAppRole --policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess
aws iam simulate-principal-policy模拟某个 user/role 能否对某资源执行某操作,不真跑。IAM 调试神器。
aws iam simulate-principal-policy --policy-source-arn arn:aws:iam::123456789012:user/lilei --action-names s3:GetObject --resource-arns arn:aws:s3:::my-bucket/key
aws iam get-account-summary账号高层级汇总:用户数、角色数、MFA 设备数、密码策略状态。
aws iam get-account-summary
aws iam get-account-authorization-details一次性导出整个 IAM 模型:所有用户、组、角色、策略、绑定关系。审计全量快照。
⚠ 常见坑: 真实账号上输出巨大。导到文件再用 jq 离线分析,别在终端里翻。
aws iam get-account-authorization-details > iam-dump.json
aws iam get-account-authorization-details --filter Role
aws iam list-access-keys列某个 IAM 用户的 access key(ID、状态、创建时间)。不含 secret,只有元数据。
⚠ 常见坑: 一个用户最多两把 key,这个上限就是为了轮换:先建新的、部署、再删旧的。
aws iam list-access-keys --user-name lilei
aws iam update-access-key --user-name lilei --access-key-id AKIA... --status Inactive
aws iam get-access-key-last-used查某把 access key 最后一次使用的时间、region、服务。判断 "这把 key 还活着吗" 用。
⚠ 常见坑: 90 天以上没用过的 key 优先删。配合凭证报告可以把整个账号扫一遍。
aws iam get-access-key-last-used --access-key-id AKIAIOSFODNN7EXAMPLE
aws iam generate-credential-report生成(再 get-credential-report)一份 CSV,列出每个用户的 key 年龄、MFA 状态、最后使用情况。审计利器。
⚠ 常见坑: 生成是异步的:先 generate,等 COMPLETE,再 get-credential-report 读 base64 的 CSV。报告缓存 4 小时。
aws iam generate-credential-report
aws iam get-credential-report --query Content --output text | base64 --decode
aws iam create-policy从 JSON 文档建一个客户托管策略,这样同一套权限能复用给多个主体。
⚠ 常见坑: 每个策略最多保留 5 个版本,超了 create-policy-version 会失败。删个旧版本,或明确用 --set-as-default。
aws iam create-policy --policy-name S3ReadMyBucket --policy-document file://policy.json
aws iam create-policy-version --policy-arn arn:aws:iam::123:policy/S3ReadMyBucket --policy-document file://v2.json --set-as-default
aws iam list-attached-role-policies列某个角色挂的托管策略。配合 list-role-policies 看内联策略。
⚠ 常见坑: 托管策略和内联策略是两套体系。找不到的 "权限缺失" 常常藏在内联策略里,而不是挂上去的托管策略。
aws iam list-attached-role-policies --role-name MyAppRole
aws iam list-role-policies --role-name MyAppRole
aws iam create-service-linked-role为某个 AWS 服务创建它代你行动所需的专用 IAM 角色(如 ECS、ELB、Auto Scaling)。
⚠ 常见坑: 多数服务首次使用时会自动建。只有当 CloudFormation 或 Terraform 部署报 "service-linked role does not exist yet" 时才手动跑。
aws iam create-service-linked-role --aws-service-name elasticloadbalancing.amazonaws.com
aws lambda list-functions列当前 region 所有 Lambda 函数,含 runtime、内存、最后修改时间。
aws lambda list-functions
aws lambda list-functions --query "Functions[?Runtime=='nodejs20.x'].FunctionName" --output text
aws lambda invoke同步调用 Lambda,传 JSON payload,把响应写到本地文件。
⚠ 常见坑: CLI v2 必须加 --cli-binary-format raw-in-base64-out,否则 --payload 会被静默 base64 编码,函数拿到一堆乱码。
aws lambda invoke --function-name my-fn --payload '{"key":"value"}' --cli-binary-format raw-in-base64-out response.jsonaws lambda invoke --function-name my-fn --invocation-type Event --payload '{}' /dev/nullaws lambda update-function-code把新代码推到已有 Lambda,本地 zip、S3 对象、或容器镜像 URI 都行。
⚠ 常见坑: 新代码几秒内生效。安全发布要 publish-version + alias 流量切换,或走 CodeDeploy。
aws lambda update-function-code --function-name my-fn --zip-file fileb://function.zip
aws lambda update-function-code --function-name my-fn --s3-bucket my-deploys --s3-key fn-v2.zip
aws lambda update-function-code --function-name my-fn --image-uri 123.dkr.ecr.us-east-1.amazonaws.com/my-fn:v2
aws lambda get-function-configuration打印函数配置:handler、runtime、内存、timeout、环境变量、layer、VPC 配置。
aws lambda get-function-configuration --function-name my-fn
aws lambda get-function-configuration --function-name my-fn --query "Environment.Variables"
aws lambda update-function-configuration原地改 Lambda 配置,内存、timeout、环境变量、handler、layer 都行。
⚠ 常见坑: --environment "Variables={...}" 是替换全部环境变量,不是合并。一定先 get-function-configuration 拿到现有的再追加。
aws lambda update-function-configuration --function-name my-fn --memory-size 1024 --timeout 30
aws lambda update-function-configuration --function-name my-fn --environment "Variables={STAGE=prod,LOG_LEVEL=info}"aws lambda publish-version把当前 $LATEST 快照成一个不可变的编号版本。配合 alias 做蓝绿发布。
aws lambda publish-version --function-name my-fn --description "v1.2.3"
aws lambda create-alias建一个指向特定版本的命名 alias,可选流量权重做金丝雀发布。
aws lambda create-alias --function-name my-fn --name prod --function-version 7
aws lambda update-alias --function-name my-fn --name prod --function-version 8 --routing-config "AdditionalVersionWeights={\"7\"=0.9}"aws lambda add-permission授权另一个 AWS 服务或账号来调用你的函数,比如让 API Gateway 或 S3 触发它。
⚠ 常见坑: 每条声明要唯一的 --statement-id。同一个 SID 重跑会报 ResourceConflictException,先 remove-permission 或换新 SID。
aws lambda add-permission --function-name my-fn --statement-id s3invoke --action lambda:InvokeFunction --principal s3.amazonaws.com --source-arn arn:aws:s3:::my-bucket
aws lambda add-permission --function-name my-fn --statement-id apigw --action lambda:InvokeFunction --principal apigateway.amazonaws.com
aws lambda create-event-source-mapping把流/队列源(SQS、Kinesis、DynamoDB Streams、Kafka)接到函数上做轮询触发。
⚠ 常见坑: SQS 要把 --batch-size 和 --maximum-batching-window-in-seconds 一起调。batch 太大而函数 timeout 太短会悄悄拖垮吞吐。
aws lambda create-event-source-mapping --function-name my-fn --event-source-arn arn:aws:sqs:us-east-1:123:my-queue --batch-size 10
aws lambda list-event-source-mappings --function-name my-fn
aws lambda get-function拿函数的全部信息:配置,外加一个能下载已部署代码包的 presigned URL。
⚠ 常见坑: Code.Location 这个 URL 是预签名的,约 10 分钟过期,要立刻下载,别存着以后用。
aws lambda get-function --function-name my-fn
aws lambda get-function --function-name my-fn --query Code.Location --output text
aws lambda put-function-concurrency给函数预留(或封顶)并发数,既不让它被饿死,也不让它把账号其它函数挤垮。
⚠ 常见坑: 给一个函数预留并发,会从账号的未预留池里扣掉。预留太多,其它函数就开始被限流。
aws lambda put-function-concurrency --function-name my-fn --reserved-concurrent-executions 50
aws lambda delete-function-concurrency --function-name my-fn
aws lambda put-provisioned-concurrency-config为某个 alias/版本预热固定数量的执行环境,消除延迟敏感路径上的冷启动。
⚠ 常见坑: 预置并发即使闲着也计费,而且只能绑版本或 alias,绑不了 $LATEST。忘了这点就是 "怎么还是冷启动" 的常见原因。
aws lambda put-provisioned-concurrency-config --function-name my-fn --qualifier prod --provisioned-concurrent-executions 5
aws cloudwatch get-metric-statistics按 namespace/指标/维度,在时间窗口内拉原始数据点,指定聚合方式。
⚠ 常见坑: --start-time 和 --end-time 必须 UTC ISO-8601。传 Unix 时间戳会报错。Period 必须是 60 的倍数。
aws cloudwatch get-metric-statistics --namespace AWS/EC2 --metric-name CPUUtilization --dimensions Name=InstanceId,Value=i-aaa --start-time 2026-05-26T00:00:00Z --end-time 2026-05-26T01:00:00Z --period 300 --statistics Average
aws cloudwatch put-metric-alarm建/改一个指标告警:阈值、连续周期数、告警动作(通常一个 SNS topic ARN)。
⚠ 常见坑: --alarm-actions 要的是 ARN,不是 topic 名字。没设动作告警只是悄悄变状态,没人会被叫起来。
aws cloudwatch put-metric-alarm --alarm-name high-cpu --metric-name CPUUtilization --namespace AWS/EC2 --statistic Average --period 300 --threshold 80 --comparison-operator GreaterThanThreshold --evaluation-periods 2 --alarm-actions arn:aws:sns:us-east-1:123:alerts --dimensions Name=InstanceId,Value=i-aaa
aws cloudwatch describe-alarms列指标告警,按状态过滤能看出当下哪些在 ALARM。
aws cloudwatch describe-alarms
aws cloudwatch describe-alarms --state-value ALARM
aws cloudwatch describe-alarms --alarm-name-prefix high-
aws logs tail像 tail -f 一样跟 CloudWatch Logs group,可选正则过滤,--follow 持续流。
⚠ 常见坑: 同时只能跟 ~10 个 log stream。太活跃的 group 加 --log-stream-name-prefix 或者改用 Logs Insights。
aws logs tail /aws/lambda/my-fn --follow
aws logs tail /aws/lambda/my-fn --since 10m --filter-pattern ERROR
aws logs tail /aws/lambda/my-fn --format short --since 1h
aws logs filter-log-events在时间范围内用 CloudWatch Logs filter pattern 搜 log group。
aws logs filter-log-events --log-group-name /aws/lambda/my-fn --filter-pattern "ERROR" --start-time $(date -u -d "1 hour ago" +%s)000
aws logs describe-log-groups列出 region 里所有 CloudWatch log group。
aws logs describe-log-groups --log-group-name-prefix /aws/lambda/
aws cloudwatch list-metrics在画图或建告警之前,先查清某 namespace/维度下到底有哪些指标存在。
⚠ 常见坑: list-metrics 只显示近两周内有上报数据的指标。全新资源即使配好了,也可能还没出现。
aws cloudwatch list-metrics --namespace AWS/Lambda
aws cloudwatch list-metrics --namespace AWS/RDS --dimensions Name=DBInstanceIdentifier,Value=mydb
aws cloudwatch get-metric-data现代批量指标查询,一次拉多个指标并支持数学表达式。规模化场景替代 get-metric-statistics。
⚠ 常见坑: 用 JSON 的 --metric-data-queries 结构,不是平铺的 flag。每个 query 的 Id 要唯一且匹配 ^[a-z][a-zA-Z0-9_]*$,首字母大写会被拒。
aws cloudwatch get-metric-data --metric-data-queries file://queries.json --start-time 2026-05-29T00:00:00Z --end-time 2026-05-30T00:00:00Z
aws cloudwatch set-alarm-state手动把告警强推到 ALARM/OK/INSUFFICIENT_DATA,用来验证 SNS/呼叫链路是不是真的能触发。
⚠ 常见坑: 强推的状态是临时的,下一次真实评估就会覆盖。用它测通知链路,别拿来当永久覆盖。
aws cloudwatch set-alarm-state --alarm-name high-cpu --state-value ALARM --state-reason "testing pager"
aws logs start-query在一个或多个 log group 上跑 CloudWatch Logs Insights 查询,结构化、类 SQL 的日志分析。
⚠ 常见坑: start-query 是异步的,返回 queryId,之后要轮询 get-query-results 直到 Status 为 Complete。没有一步出结果的版本。
aws logs start-query --log-group-name /aws/lambda/my-fn --start-time $(date -u -d "1 hour ago" +%s) --end-time $(date -u +%s) --query-string "fields @timestamp, @message | filter @message like /ERROR/ | sort @timestamp desc | limit 20"
aws logs get-query-results --query-id <id>
aws logs put-retention-policy设 log group 保留天数。新建的 group 默认 "永不过期",账单会悄悄一直涨。
⚠ 常见坑: 保留天数只能取允许值(1、3、5、7、14、30、60、90 …)。随便填个 45 会被拒。
aws logs put-retention-policy --log-group-name /aws/lambda/my-fn --retention-in-days 30
aws rds describe-db-instances列出 RDS DB 实例,含引擎、版本、endpoint、状态、存储。
aws rds describe-db-instances
aws rds describe-db-instances --query "DBInstances[].[DBInstanceIdentifier,Engine,DBInstanceStatus,Endpoint.Address]" --output table
aws rds create-db-snapshot给 RDS 实例做手动快照。手动快照不删就一直在。
⚠ 常见坑: 快照默认不跨账号,要先 share-db-snapshot 共享。存储费一直收,过期的快照记得删。
aws rds create-db-snapshot --db-instance-identifier mydb --db-snapshot-identifier mydb-2026-05-26
aws rds restore-db-instance-from-db-snapshot从快照恢复出一个新 RDS 实例。原实例不受影响。
⚠ 常见坑: 恢复出的新实例 endpoint 是新的。应用要改连接串,没有原地恢复这种操作。
aws rds restore-db-instance-from-db-snapshot --db-instance-identifier mydb-restored --db-snapshot-identifier mydb-2026-05-26
aws rds modify-db-instance改 RDS 实例:机型、存储、主密码、参数组、备份保留天数。
⚠ 常见坑: 不加 --apply-immediately 改动要等维护窗口才生效。"我改了密码怎么没效"通常就这个坑。
aws rds modify-db-instance --db-instance-identifier mydb --db-instance-class db.t3.medium --apply-immediately
aws rds describe-db-snapshots列 RDS 快照,手动和自动的都列。
aws rds describe-db-snapshots --db-instance-identifier mydb --snapshot-type manual
aws rds reboot-db-instance重启 RDS 实例。加 --force-failover 会触发 Multi-AZ 主备切换。
aws rds reboot-db-instance --db-instance-identifier mydb
aws rds reboot-db-instance --db-instance-identifier mydb --force-failover
aws rds describe-db-clusters列 Aurora / Multi-AZ DB 集群,含写端点、读端点、引擎版本、状态。
⚠ 常见坑: Aurora 的集群(写)端点和读端点是分开的。所有流量都打集群端点,等于读副本白养了。
aws rds describe-db-clusters --query "DBClusters[].[DBClusterIdentifier,Endpoint,ReaderEndpoint,Status]" --output table
aws rds failover-db-cluster在 Aurora 集群里触发一次受控故障转移,可指定把某个读副本提升为写实例。
⚠ 常见坑: 故障转移会断掉所有现有连接,有短暂中断。除非在主动测试容灾,否则放维护窗口里跑。
aws rds failover-db-cluster --db-cluster-identifier my-aurora --target-db-instance-identifier my-aurora-reader-1
aws rds describe-db-log-files列 RDS 实例上可用的数据库日志文件(错误日志、慢查询日志),再下载下来。
⚠ 常见坑: RDS 不能 SSH 进去,所以这个加 download-db-log-file-portion 是命令行读 MySQL/Postgres 日志的唯一途径。
aws rds describe-db-log-files --db-instance-identifier mydb
aws rds download-db-log-file-portion --db-instance-identifier mydb --log-file-name error/mysql-error.log --output text
aws rds describe-events查实例或集群近期的 RDS 事件:故障转移、备份、参数变更、存储不足告警等。
⚠ 常见坑: 事件只保留 14 天。要更长历史,用 create-event-subscription 订阅一个 SNS topic。
aws rds describe-events --source-identifier mydb --source-type db-instance --duration 1440
aws eks update-kubeconfig为 EKS 集群生成(或更新)一条 kubeconfig,kubectl 就能连了。
⚠ 常见坑: 用当前 AWS profile 签 token。后面换了 profile kubectl 就连不上,重跑加 --profile <name>。
aws eks update-kubeconfig --name my-cluster --region us-east-1
aws eks update-kubeconfig --name my-cluster --profile prod --alias prod-cluster
aws eks describe-cluster打印 EKS 集群完整信息:endpoint、版本、IAM role、VPC 配置、addon。
aws eks describe-cluster --name my-cluster
aws eks describe-cluster --name my-cluster --query "cluster.version" --output text
aws eks list-clusters列当前 region 的 EKS 集群。
aws eks list-clusters
aws eks list-clusters --query "clusters[]" --output text
aws eks list-nodegroups列出 EKS 集群的所有托管 nodegroup。
aws eks list-nodegroups --cluster-name my-cluster
aws eks describe-nodegroup查托管 nodegroup 完整配置:机型、扩缩容、AMI 版本、taint。
aws eks describe-nodegroup --cluster-name my-cluster --nodegroup-name workers
aws eks update-addon升 EKS addon 版本(VPC CNI、CoreDNS、kube-proxy、EBS CSI)。--resolve-conflicts 控制字段所有权冲突怎么处理。
⚠ 常见坑: 不加 --resolve-conflicts OVERWRITE(或 PRESERVE)如果之前 kubectl 手改过这个 addon,升级会中止。要明确选一个。
aws eks update-addon --cluster-name my-cluster --addon-name vpc-cni --addon-version v1.18.0-eksbuild.1 --resolve-conflicts OVERWRITE
aws eks list-addons列出 EKS 集群上安装的 addon(VPC CNI、CoreDNS、kube-proxy、EBS CSI 等)。
aws eks list-addons --cluster-name my-cluster
aws eks describe-addon-versions查某个 EKS addon 在指定 Kubernetes 版本下有哪些兼容版本,升级前先看一眼。
⚠ 常见坑: 不是每个 addon 版本都支持每个集群版本。用 --kubernetes-version 过滤,别挑到一个升级会失败的。
aws eks describe-addon-versions --addon-name vpc-cni --kubernetes-version 1.29 --query "addons[].addonVersions[].addonVersion"
aws eks update-nodegroup-version把托管 nodegroup 滚动升级到更新的 AMI / Kubernetes 版本,优雅地排空并替换节点。
⚠ 常见坑: 没设 PodDisruptionBudget,滚动中你的工作负载可能一次性全被驱逐。升级前先设 PDB,否则 --force 谁都不顾。
aws eks update-nodegroup-version --cluster-name my-cluster --nodegroup-name workers --kubernetes-version 1.29
aws eks list-fargate-profiles列集群上的 Fargate profile,也就是决定哪些 pod 跑在无服务器上的命名空间/标签选择器。
aws eks list-fargate-profiles --cluster-name my-cluster
aws eks describe-fargate-profile --cluster-name my-cluster --fargate-profile-name fp-default
aws eks describe-update查正在进行的 EKS 控制面或 addon 更新状态(InProgress / Successful / Failed)以及失败原因。
aws eks describe-update --name my-cluster --update-id <update-id>
aws cloudformation deploy高层 deploy,栈不存在就创建,存在就更新。changeset 自动算。
⚠ 常见坑: 不加 --capabilities CAPABILITY_NAMED_IAM,模板里有 IAM 资源就报 "Requires capabilities"。大部分栈都要加。
aws cloudformation deploy --template-file template.yaml --stack-name my-stack --capabilities CAPABILITY_NAMED_IAM
aws cloudformation deploy --template-file template.yaml --stack-name my-stack --parameter-overrides Env=prod Region=us-east-1
aws cloudformation describe-stacks列/查 CloudFormation 栈:状态、参数、output、漂移状态。
aws cloudformation describe-stacks
aws cloudformation describe-stacks --stack-name my-stack --query "Stacks[0].Outputs"
aws cloudformation describe-stack-events查栈的事件流。"我的 deploy 为啥失败"必看。
⚠ 常见坑: 事件是倒序的。最早的那个失败才是根因,被压在最底下,要拉到底或者 pipe 给 tac。
aws cloudformation describe-stack-events --stack-name my-stack --max-items 50
aws cloudformation delete-stack删 CloudFormation 栈,连同它建的所有资源。
⚠ 常见坑: 有对象的桶、保留=Never 的 log group、没 skip-snapshot 的 RDS 都会卡删除。看 describe-stack-events 找哪个资源卡住了。
aws cloudformation delete-stack --stack-name my-stack
aws cloudformation wait stack-delete-complete --stack-name my-stack
aws cloudformation package把模板里引用的本地产物上传 S3,产出一份可以 deploy 的模板。
aws cloudformation package --template-file template.yaml --s3-bucket my-deploys --output-template-file packaged.yaml
aws cloudformation validate-template部署前先 lint 一下 CloudFormation 模板,看语法和必填参数有没有问题。
aws cloudformation validate-template --template-body file://template.yaml
aws cloudformation create-change-set在真正应用之前,预览这次更新会新增/修改/删除什么。安全更新生产栈的正确姿势。
⚠ 常见坑: 全新栈要加 --change-set-type CREATE,默认的 UPDATE 类型在栈还不存在时会报错。
aws cloudformation create-change-set --stack-name my-stack --template-body file://t.yaml --change-set-name preview1 --capabilities CAPABILITY_NAMED_IAM
aws cloudformation describe-change-set --stack-name my-stack --change-set-name preview1
aws cloudformation detect-stack-drift检测实际资源有没有偏离栈模板的声明,通常是有人又去控制台手点了。
⚠ 常见坑: 漂移检测是异步的:detect-stack-drift 返回一个 id,再轮询 describe-stack-drift-detection-status 和 describe-stack-resource-drifts。
aws cloudformation detect-stack-drift --stack-name my-stack
aws cloudformation describe-stack-resource-drifts --stack-name my-stack --stack-resource-drift-status-filters MODIFIED DELETED
aws cloudformation list-stacks按状态过滤列栈,方便一次性找出账号里所有卡在 ROLLBACK 或 DELETE_FAILED 的栈。
⚠ 常见坑: 默认会把已删栈作为幽灵列出来。用 --stack-status-filter 排除 DELETE_COMPLETE,只看活着的栈。
aws cloudformation list-stacks --stack-status-filter CREATE_COMPLETE UPDATE_COMPLETE ROLLBACK_COMPLETE
aws cloudformation cancel-update-stack中止正在进行的栈 UPDATE,回滚到上一个已知正常状态。
⚠ 常见坑: 只在状态为 UPDATE_IN_PROGRESS 时有效。一旦进到 UPDATE_ROLLBACK_FAILED,就得改用 continue-update-rollback。
aws cloudformation cancel-update-stack --stack-name my-stack
aws route53 list-hosted-zones列账号下所有 Route 53 hosted zone。
aws route53 list-hosted-zones
aws route53 list-hosted-zones --query "HostedZones[].[Name,Id]" --output text
aws route53 list-resource-record-sets列 hosted zone 里的所有 DNS 记录(A、AAAA、CNAME、MX、TXT、ALIAS)。
aws route53 list-resource-record-sets --hosted-zone-id Z1234567890ABC
aws route53 list-resource-record-sets --hosted-zone-id Z1234567890ABC --query "ResourceRecordSets[?Type=='A']"
aws route53 change-resource-record-sets通过 JSON change batch 创建/修改/删除 DNS 记录。脚本化改 DNS 唯一方法。
⚠ 常见坑: DELETE 必须和现有记录完全一致,值、TTL 都对得上。错一个字符就 InvalidChangeBatch。先 list-resource-record-sets 拿现有的 JSON 复制出来改。
aws route53 change-resource-record-sets --hosted-zone-id Z1234567890ABC --change-batch file://change.json
aws route53 get-change查 Route 53 改动是否传播完成(PENDING vs INSYNC)。
aws route53 get-change --id /change/C1234567890ABC
aws route53 create-hosted-zone为某个域名建一个新的 Route 53 hosted zone。
⚠ 常见坑: 建完后要在域名注册商那里把 NS 记录改成返回的四个,否则 zone 建了但解析不出去。
aws route53 create-hosted-zone --name example.com --caller-reference $(date +%s)
aws route53 list-health-checks列 Route 53 健康检查,它们驱动 DNS 故障转移和基于延迟的路由决策。
aws route53 list-health-checks
aws route53 get-health-check-status --health-check-id abc-123
aws route53 test-dns-answer问 Route 53:对某个名字/类型、从某个解析器 IP 出发,它会返回什么答案,不动你真实的 DNS。
⚠ 常见坑: 它直接查权威 zone,绕过所有解析器和 TTL 缓存。这是真相,但不是有缓存记录的终端用户当下看到的结果。
aws route53 test-dns-answer --hosted-zone-id Z1234567890ABC --record-name www.example.com --record-type A
aws route53domains list-domains列通过 Route 53 Domains 注册的域名,含到期日和自动续费状态。
⚠ 常见坑: Route 53 Domains 是全球服务,API 只在 us-east-1 应答。加 --region us-east-1,否则连不上。
aws route53domains list-domains --region us-east-1
aws route53domains get-domain-detail --domain-name example.com --region us-east-1
--profile vs default profile不传 --profile <name>(或 AWS_PROFILE 环境变量)就走 [default] profile。多账号公司这几乎一定是错的。shell 里 export AWS_PROFILE,或按项目起 alias。
⚠ 常见坑: --profile=prod(带 =)在不同 CLI 版本里行为不一致。统一写 --profile prod(用空格)最稳。
export AWS_PROFILE=prod
aws s3 ls --profile dev
alias awsp="aws --profile prod"
--region default empty--region、AWS_REGION、AWS_DEFAULT_REGION、profile 里都没设 region,会报 "You must specify a region" 或更迷惑的 "Could not connect"。
⚠ 常见坑: 不同服务在不同 region。在 ~/.aws/config 每个 profile 设默认 region 最好维护。
aws configure set region us-east-1 --profile prod
export AWS_REGION=ap-northeast-1
aws s3 ls --region eu-west-1
pagination truncates outputAWS API 全部翻页。CLI 默认自动翻,但如果 AWS_PAGER=""或 --no-paginate 就只看到第一页。aws s3 ls 默认 1000 个 key 一页。
aws ec2 describe-instances --max-items 10 --starting-token <token>
aws s3 ls s3://bucket/ --recursive | wc -l
--output table vs json vs textjson 给 jq 用。text 是 tab 分隔,shell 循环最方便(for i in $(aws ... --output text))。table 是给人看的,会按终端宽度截断。在 ~/.aws/config 设默认。
aws ec2 describe-instances --output text --query "Reservations[].Instances[].InstanceId"
aws s3api list-buckets --output json | jq -r ".Buckets[].Name"
aws configure set output json --profile prod
--query is JMESPath not jq--query 用 JMESPath,跟 jq 有微妙差别:.[0] 写 [0],表达式里没 pipe,字符串字面量用单引号。形状变化复杂时还是 --output json | jq 更顺手。
aws ec2 describe-instances --query "Reservations[*].Instances[*].[InstanceId,State.Name]" --output table
aws s3api list-buckets --query "Buckets[?starts_with(Name, 'logs-')].Name" --output text
--dry-run is EC2-only很多人以为所有 AWS 服务都支持 --dry-run。其实只有 EC2 的大部分写操作支持,成功会返回 DryRunOperation。其他服务用 iam simulate-principal-policy 或 cloudformation deploy --no-execute-changeset 模拟。
aws ec2 terminate-instances --instance-ids i-aaa --dry-run
aws cloudformation deploy --template-file t.yaml --stack-name s --no-execute-changeset
S3 eventual consistency从 2020 起 S3 写后读全球强一致。老的"PUT 之后 LIST 看不到"那个坑已经没了。但跨 region 复制、CloudFront 缓存、版本控制仍然是最终一致的。
aws s3 cp file s3://b/key && aws s3 ls s3://b/key
aws s3api put-object --bucket b --key k --body file
AKID leaked to gitAK SK 一旦进 git 历史,GitHub 上的扫描机器人几分钟内就用它在所有 region 起比特币挖矿。立刻 iam delete-access-key,查近 24h 的 CloudTrail,把这个账号所有 secret 都轮换一遍。
⚠ 常见坑: 重写 git 历史救不了,key 早被抓走缓存了。先删 key 才是关键,历史清理只是面子。
aws iam delete-access-key --user-name lilei --access-key-id AKIA...
aws cloudtrail lookup-events --lookup-attributes AttributeKey=AccessKeyId,AttributeValue=AKIA...
global services live in us-east-1IAM、Route 53、CloudFront、WAF(global)、Organizations 是全球服务,但 CLI 端点在 us-east-1。在别的 region "连不上" 或返回空,基本都是要加 --region us-east-1。
aws cloudfront list-distributions --region us-east-1
aws route53domains list-domains --region us-east-1
throttling and exponential backoff批量调用时 AWS 会返回 ThrottlingException / RequestLimitExceeded。CLI 自带退避重试,但你按条循环调还是会被限流。调高 --cli-read-timeout、设 AWS_MAX_ATTEMPTS,或改用服务端批量 API。
AWS_MAX_ATTEMPTS=10 AWS_RETRY_MODE=adaptive aws ec2 describe-instances
aws configure set retry_mode adaptive --profile prod
fileb:// vs file:// for binaries文本(JSON 策略、模板)用 file://,二进制(Lambda zip、图片)用 fileb://。用 file:// 传 zip 会损坏,因为 CLI 把它当 UTF-8 文本处理。
aws lambda update-function-code --function-name my-fn --zip-file fileb://function.zip
aws iam create-policy --policy-name P --policy-document file://policy.json
AWS_PAGER opens less and hangsCLI v2 默认把长输出喂给分页器(less)。在脚本和 CI 里会表现成命令 "卡住" 等你按键。全局或单条设 AWS_PAGER=""。
export AWS_PAGER=""
AWS_PAGER="" aws ec2 describe-instances
aws configure set cli_pager "" --profile prod
clock skew breaks signatures签名时间戳和服务器时间相差超过约 5 分钟,AWS 会以 "Signature expired" 或 "InvalidSignatureException" 拒绝。如果所有命令突然鉴权失败,先查系统时钟 / NTP。
date -u
sudo chronyc makestep
endpoint-url for LocalStack / VPC endpoints用 --endpoint-url 把 CLI 指到非默认端点:LocalStack 测试、S3 兼容存储、或私有 VPC 端点。不加就打到真实公网 AWS 端点,可能产生费用或失败。
aws --endpoint-url http://localhost:4566 s3 ls
aws --endpoint-url https://bucket.vpce-xxx.s3.us-east-1.vpce.amazonaws.com s3 cp f s3://b/f
可搜索的 AWS CLI 速查,覆盖云工程师、SRE、运维真正在 AWS 账号上 敲的 80+ 条命令,不是官网首页那种凑数列表。十一个服务分类:配置 (aws configure / sso login / sts get-caller-identity / sts assume-role)、EC2(describe-instances、run-instances、start / stop / terminate、describe-security-groups、 authorize-security-group-ingress、key-pair 管理)、S3(ls、cp、 sync、mv、rm、mb、rb、presign、website,以及底层 s3api 兜底)、 IAM(list-users、create-user、attach-policy、list-roles、 create-role、simulate-principal-policy)、Lambda(list-functions、 invoke、update-function-code、get-function-configuration、 publish-version、create-alias)、CloudWatch(get-metric-statistics、 put-metric-alarm、describe-alarms、logs tail、logs filter-log-events)、 RDS(describe-db-instances、create-db-snapshot、 restore-db-instance-from-db-snapshot、modify-db-instance)、EKS (update-kubeconfig、describe-cluster、list-nodegroups、 describe-nodegroup)、CloudFormation(deploy、describe-stacks、 describe-stack-events、delete-stack、package)、Route53 (list-hosted-zones、change-resource-record-sets、list-resource- record-sets)、还有专门一类"常见坑",讲清楚 8 个真正浪费下午 的问题(--profile 默认 default 多账号必坑、--region 默认空、 pagination 默认截到 1000、--output json/table/text 各自给谁用、 --query 是 JMESPath 不是 jq、--dry-run 只有 EC2 支持、S3 最终 一致性、AK SK 一旦上 git 就要立刻 rotate)。每条都有完整语法、 中英说明、对应的"坑",以及 1-3 条带真 ARN/桶名/实例 ID 的可 直接复制的例子。搜索框跨命令 / 说明 / 坑 / 例子四个字段一起过 滤,输 "AKID" 能命中凭证泄漏那条。服务胶囊缩范围,每条命令一键 复制。完全在浏览器里跑,不连任何 AWS 账号,不上传凭证。配合 kubectl / Docker / nginx / curl 速查一起用,运维工具盒就齐了。
把内容粘贴或拖入工具面板。
点击按钮,在浏览器内本地处理,文件不上传。
一键复制结果或下载到本地。
适合穿插在写代码、查问题、做 Review、上线前的小任务里。
这些入口会把当前任务接到更完整的工具链里。
你要把 Next.js 导出的产物推到 s3://acme-www,需要那条对的 sync。速查 直接给你 `aws s3 sync ./out s3://acme-www --delete`,再配上 CloudFront 刷缓存 `aws cloudfront create-invalidation --distribution-id E2QWXYZ --paths "/*"`。源永远写到具体目录的提示,帮你躲开忘写子目录的 `sync . --delete` 第一次同步就把整桶清空那种事故。
9 个账号的组织里,你正要 `terminate-instances`,可终端提示符根本看不出 当前是哪个 profile。你抓配置分类里的 `aws sts get-caller-identity --profile prod`,看到 Account 4179... 和 Arn,确认是 prod 不是 staging,再用同一个 `--profile prod` 跑。30 秒,挡住一次打错账号的删库。
结账 Lambda 偶发报错。你复制 `aws logs tail /aws/lambda/checkout-fn --follow --since 5m --profile staging`,把出错的购物车重放一遍,堆栈 实时滚出来。速查还给了 `aws lambda invoke --function-name checkout-fn --payload file://event.json out.json`,让你用固定测试事件触发,而不是 点 UI 碰运气。
要对 40GB 的 Postgres 生产库跑 ALTER TABLE 之前,你想留个回滚点。复制 `aws rds create-db-snapshot --db-instance-identifier acme-prod --db-snapshot-identifier acme-prod-pre-migrate-2026-05-30`,等到 available 再跑迁移。万一出事,恢复那条命令也在搜索框里。压力下不用再去 控制台一通乱点。
多账号组织里忘写 `--profile`,命令静默打到 default profile。每条写操作都钉死它,例如 `aws ec2 terminate-instances --instance-ids i-0abc --profile prod`。
把 `--query` 当 jq 用。它是 JMESPath,`.Reservations[0]` 要写成 `Reservations[0]`,管道是 `|` 不是 `| jq`。先在读命令上试通再写进脚本。
在错的目录里跑 `aws s3 sync . s3://bucket --delete` 会把桶清空。源钉到具体子目录,第一次跑加 `--dryrun` 看一遍再确认。
这份速查就是一个静态页。搜索完全在浏览器里对内存里的命令数组过滤,不弹凭证框、不加载 AWS SDK、不发任何 API 请求。你输入的搜索词留在本地,也不会进 URL,所以复制页面链接分享时不会带出任何内容。
做你这行的人, 还会一起用这些。