AWS CLI 从零到精通的配置、实战与自动化运维指南

📅 2026/8/2 22:38:25
AWS CLI 从零到精通的配置、实战与自动化运维指南
1. 项目概述为什么AWS CLI是云上操作的“瑞士军刀”如果你已经开始接触亚马逊云科技还在网页控制台里点点戳戳那感觉就像开着一辆跑车却只用一档在市区里慢慢挪。AWS CLI这个命令行工具才是让你真正“挂上高速档”的关键。简单说它让你能用一行命令完成在网页上需要点开好几层菜单才能搞定的操作。无论是批量创建100台服务器还是定时备份数据库或者自动化部署整个应用栈AWS CLI都能让你事半功倍。我刚开始用AWS的时候也觉得图形界面挺友好直到有一次需要给几十个EC2实例统一打标签手动操作差点让我崩溃。自从把AWS CLI配置好、用熟之后这种重复性劳动就变成了一个简单的脚本循环。它不仅仅是命令的集合更是自动化、脚本化和集成化的基石。无论是运维工程师、开发人员还是架构师想要提升在AWS上的工作效率和掌控力熟练掌握AWS CLI都是绕不开的一课。今天我就结合自己多年的使用经验从零开始带你彻底搞定AWS CLI的配置并通过几个硬核的实例让你看到它真正的威力。2. AWS CLI核心配置全解析配置是使用AWS CLI的第一步也是最容易踩坑的一步。配置不对后面的所有操作都无从谈起。这里面的门道远不止一个aws configure那么简单。2.1 安装与环境准备选对方法事半功倍安装AWS CLI本身并不复杂但针对不同的操作系统和场景选择最合适的方法能避免后续很多麻烦。对于macOS用户我强烈推荐使用Homebrew。这不是偷懒而是为了依赖管理的干净和升级的方便。打开终端一行命令搞定brew install awscli用Homebrew安装所有依赖都会被自动处理好将来升级也只需要brew upgrade awscli。如果你手动下载pkg安装包虽然也能装但后期管理起来会稍微麻烦一些。对于Linux用户特别是Ubuntu或Debian用系统包管理器是最稳妥的。但需要注意默认仓库里的版本可能不是最新的。我建议先更新仓库索引再安装sudo apt update sudo apt install awscli -y安装完成后务必用aws --version确认一下版本。如果对版本有要求比如某些新功能需要特定版本以上可以去AWS官方文档找用curl下载安装包的方法步骤会多几步但能确保版本最新。对于Windows用户最无痛的方式是使用官方的MSI安装程序。下载后双击跟着向导一步步走就行。但这里有个关键细节安装时注意勾选“将AWS CLI添加到系统PATH环境变量”这个选项。如果漏了你就得手动去加环境变量对新手不太友好。安装好后打开PowerShell或者CMD输入aws --version测试一下。注意无论哪种系统安装完成后都建议关闭当前终端窗口再重新打开一次。这是为了让系统重新加载环境变量确保aws命令可以被正确识别。很多“命令找不到”的问题重启一下终端就解决了。2.2 凭证配置的三种武器与最佳实践安装只是拿到了工具配置凭证才是拿到打开AWS大门的钥匙。AWS CLI需要凭据来认证你的身份决定你能操作哪些资源。这里主要有三种方式适用场景完全不同。第一种也是最常用的使用aws configure进行交互式配置。在终端输入这个命令后它会依次问你四个问题AWS Access Key ID你的访问密钥ID。AWS Secret Access Key对应的秘密访问密钥。这里输入时不会有任何显示星号都没有正常输入后回车即可。Default region name默认区域。例如us-east-1美国东部弗吉尼亚、ap-southeast-1新加坡或cn-north-1中国北京。这个设置很重要后续很多不指定区域的命令都会用这个默认值。Default output format默认输出格式。有json、yaml、text、table可选。我个人的习惯是设为json因为机器可读性最强方便用jq这样的工具进行后续处理。如果是临时想看看清晰的表格可以在单条命令后面加--output table。这个命令会把凭证明文存储在你家目录下的~/.aws/credentials文件里区域和输出格式存在~/.aws/config文件里。这是最方便的方式但也意味着你需要保护好这台电脑。第二种适用于临时权限或联合登录使用环境变量。在某些自动化脚本或容器环境中你可能不想或不能将凭证写入磁盘。这时可以通过环境变量来设置export AWS_ACCESS_KEY_IDAKIAIOSFODNN7EXAMPLE export AWS_SECRET_ACCESS_KEYwJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY export AWS_DEFAULT_REGIONus-west-2设置后当前终端会话中的AWS CLI就会使用这些凭证。它的优先级高于配置文件里的凭证。关闭终端后这些变量就失效了比较安全。在Dockerfile或CI/CD流水线中这种方式很常见。第三种最安全也最推荐给个人长期使用的使用IAM角色或SSO。对于日常开发直接使用长期有效的Access Key并不是最佳实践。更好的方式是配置AWS CLI SSO如果你的组织使用了AWS Single Sign-On你可以用aws configure sso来配置。它会打开浏览器让你登录获取一组临时的、权限范围明确的凭证自动管理刷新非常安全。为EC2实例配置IAM角色如果你的CLI运行在EC2实例上根本不需要配置任何凭证。只要给这个EC2实例挂载一个拥有适当权限的IAM角色AWS CLI会自动从实例元数据服务获取临时凭证。这是云上应用的最佳实践。实操心得千万不要把具有高权限的Access Key提交到代码仓库如GitHub我见过太多因为.gitignore没写好不小心把~/.aws/credentials推上去导致的安全事件。一个基本的防护是永远使用IAM用户并遵循最小权限原则只赋予这个用户完成其任务所必需的最低权限。对于生产环境的密钥考虑使用AWS Secrets Manager来存储和轮转。2.3 多配置与多环境切换高手技巧当你需要同时管理开发、测试、生产等多个AWS账户或者在同一账户下用不同身份操作时多配置Named Profile功能就是你的救星。使用aws configure --profile prod就可以创建一个名为“prod”的配置。所有凭证和设置都会独立存储。使用时在命令后加上--profile prod参数即可例如aws s3 ls --profile prod aws ec2 describe-instances --profile dev但每次打--profile很麻烦。你可以通过设置AWS_PROFILE环境变量来指定当前会话默认使用的配置export AWS_PROFILEprod这样之后的所有命令只要不显式指定其他profile都会自动使用prod配置。更高级的用法是结合aws configure list-profiles查看所有配置以及利用~/.aws/config文件进行更复杂的设置比如为某个profile指定一个角色让CLI自动进行角色切换Assume Role。这在跨账户访问时非常有用。例如你的config文件可以这样写[profile cross-account-dev] role_arn arn:aws:iam::123456789012:role/CrossAccountAccessRole source_profile default region us-east-1这样当你使用--profile cross-account-dev时CLI会自动用default配置的凭证去扮演Assume目标账户的角色无需手动管理两套密钥。3. 基础使用与核心命令精讲配置妥当后我们开始真正使用它。AWS CLI的命令遵循统一的模式理解这个模式就能举一反三。3.1 命令结构与通用参数剖析所有AWS CLI命令都遵循这个基本结构aws service operation [options and parameters]aws命令本身。serviceAWS服务名称如s3、ec2、lambda、rds等。operation要对该服务执行的操作通常是动词名词如describe-instances、put-object、create-function。[options and parameters]选项和参数用来指定操作的细节。有几个通用参数非常重要--region指定操作发生的AWS区域。如果不指定则使用默认区域。这是很多错误的根源比如你的S3桶在us-west-2默认区域是us-east-1直接aws s3 ls可能什么也看不到必须用aws s3 ls --region us-west-2。--output覆盖默认的输出格式。当你需要快速查看一个列表时--output table非常直观。当你想用jq解析时--output json是必须的。--query这是一个神器。它允许你使用JMESPath查询语言从返回的JSON中过滤和提取你需要的数据能极大减少输出噪音。例如只想看所有EC2实例的ID和状态aws ec2 describe-instances --query Reservations[*].Instances[*].[InstanceId, State.Name] --output table--dry-run模拟运行。对于创建、删除等“危险”操作先加上这个参数CLI会检查你的权限和参数是否有效但不会真正执行。确认无误后再去掉它执行真实操作是个好习惯。--debug当命令出现莫名其妙的问题时加上这个参数可以打印出详细的HTTP请求和响应信息对于排查认证失败、网络问题或API错误非常有帮助。3.2 输出控制与数据过滤从信息海洋中精准捕捞AWS API返回的信息通常非常详尽但我们也常常只需要其中的一小部分。掌握输出控制才能高效工作。--output格式选择json/yaml结构化数据适合程序处理。yaml格式对人类阅读更友好一些。text以制表符分隔的简单文本可以用传统的Unix工具如cut、awk处理。table生成一个格式化的ASCII表格在终端里看起来最清晰。--query的威力 这是AWS CLI最强大的功能之一。假设我们想获取所有正在运行的EC2实例的私有IP地址和标签中Name的值。aws ec2 describe-instances \ --query Reservations[*].Instances[?State.Namerunning].[PrivateIpAddress, Tags[?KeyName].Value | [0]] \ --output table这个查询做了几件事1) 遍历所有Reservations和Instances。2) 用?State.Namerunning过滤出运行中的实例。3) 为每个实例提取一个包含两个元素的列表私有IP和Name标签的值[0]是为了从结果数组中取出第一个元素。学习JMESPath的基本语法如过滤?管道|切片[]多选列表[]能让你处理AWS CLI输出的能力提升一个数量级。结合外部工具 Linux/macOS环境下jq是处理JSON的瑞士军刀awscli的--query虽然强大但有时结合jq更灵活。例如将某个复杂JSON输出美化并保存到文件aws ec2 describe-vpcs --output json | jq . vpcs.json或者用jq进行更复杂的转换和计算。3.3 自动化与脚本集成基础AWS CLI的本质是一个命令行程序这意味着它可以无缝地集成到Shell脚本中实现自动化。一个简单的例子定期检查某个S3桶中特定前缀的文件数量。#!/bin/bash # 这是一个Bash脚本示例 BUCKETmy-backup-bucket PREFIXlogs/ count$(aws s3 ls s3://${BUCKET}/${PREFIX} --recursive --summarize | grep Total Objects | awk {print $3}) echo [$(date)] 桶 ${BUCKET} 中前缀为 ${PREFIX} 的文件总数为${count} # 可以加上逻辑判断比如文件数超过1000就发警报 if [ $count -gt 1000 ]; then echo 警告文件数量过多 # 这里可以替换成发送邮件或Slack消息的命令 fi在Python、Node.js等脚本中你可以使用subprocess或child_process模块来调用AWS CLI命令并解析其结果。虽然AWS更推荐直接使用其SDK如boto3但在一些快速原型或运维脚本中直接调用CLI可能更简单直接。注意事项在脚本中自动化时一定要做好错误处理。AWS CLI命令执行失败会返回非零的退出码。在你的脚本中应该检查$?在Bash中或命令执行的返回值并对失败情况进行处理例如记录日志、重试或发出警报。盲目假设命令总会成功是自动化脚本常见的缺陷。4. 核心服务使用实例深度实战光说不练假把式。下面我们通过几个最常用服务的实例来感受AWS CLI如何解决真实问题。4.1 EC2实例生命周期管理从创建到销毁管理虚拟机是云上最常见的操作。我们用CLI来走完一个EC2实例的完整生命周期。1. 创建实例关键参数详解创建实例的命令参数较多我们拆解来看aws ec2 run-instances \ --image-id ami-0c55b159cbfafe1f0 \ # Amazon Linux 2 的AMI ID不同区域不同 --instance-type t3.micro \ # 实例类型t3.micro是免费的微机型 --key-name MyKeyPair \ # 你之前创建并保存在本地的密钥对名称 --subnet-id subnet-0bb1c79de3EXAMPLE \ # 子网ID决定实例放在哪个子网/VPC --security-group-ids sg-0aaEXAMPLE \ # 安全组ID控制网络访问 --tag-specifications ResourceTypeinstance,Tags[{KeyName,ValueMyWebServer}] \ # 打标签便于识别 --count 1 \ # 创建数量 --region us-east-1 # 指定区域这条命令会返回一个包含大量信息的JSON其中最重要的就是Instances[0].InstanceId。立刻把这个InstanceId记下来或者用变量存起来后续所有操作都需要它。2. 查看与筛选实例创建后查看实例状态# 查看所有实例的简要信息ID 类型 状态 标签 aws ec2 describe-instances --query Reservations[*].Instances[*].[InstanceId, InstanceType, State.Name, Tags[?KeyName].Value | [0]] --output table # 查看特定实例的详细信息包括公有IP、私有IP等 aws ec2 describe-instances --instance-ids i-1234567890abcdef03. 连接与操作实例获取实例的公有IP地址假设你已经为实例分配了弹性IP或它在公有子网PUBLIC_IP$(aws ec2 describe-instances --instance-ids i-1234567890abcdef0 --query Reservations[0].Instances[0].PublicIpAddress --output text) echo $PUBLIC_IP然后使用SSH连接确保你的安全组允许22端口入站ssh -i ~/.ssh/MyKeyPair.pem ec2-user$PUBLIC_IP4. 停止与启动实例停止实例相当于关机aws ec2 stop-instances --instance-ids i-1234567890abcdef0启动实例aws ec2 start-instances --instance-ids i-1234567890abcdef0注意停止后再启动公有IP地址通常会改变除非你使用了弹性IP。5. 终止实例不可逆操作终止实例相当于永久删除数据盘根卷除外默认也会被删除。aws ec2 terminate-instances --instance-ids i-1234567890abcdef0重要警告terminate操作无法撤销执行前务必再三确认Instance ID是否正确最好先加上--dry-run测试或者先给实例打一个快照备份。4.2 S3存储桶高级操作不止是上传下载S3是对象存储的标杆CLI操作S3非常高效。1. 桶管理# 创建一个桶桶名必须全球唯一 aws s3 mb s3://my-unique-bucket-name-2023 --region us-east-1 # 列出所有桶 aws s3 ls # 删除一个空桶 aws s3 rb s3://my-unique-bucket-name-2023 # 强制删除一个有内容的桶危险 aws s3 rb s3://my-unique-bucket-name-2023 --force2. 文件同步与高级传输cp和sync命令是使用频率最高的。# 简单复制本地文件到S3 aws s3 cp ./localfile.txt s3://my-bucket/path/to/remotefile.txt # 递归同步整个目录只上传新的或修改过的文件 aws s3 sync ./local-directory s3://my-bucket/path/to/remote/ --delete--delete参数非常有用它会使远程目录的内容与本地完全一致删除远程有而本地没有的文件。但使用时要极度小心误操作可能导致数据丢失。我个人的习惯是先不加--delete运行一次看看输出里会删除哪些文件确认无误后再加上--delete执行。3. 使用预签名URL进行安全分享你有一个私有S3文件想临时分享给其他人下载但又不想公开桶或设置复杂的权限。预签名URL完美解决这个问题。# 生成一个在1小时3600秒内有效的下载URL aws s3 presign s3://my-bucket/private-report.pdf --expires-in 3600命令会返回一个长长的URL将其发给对方即可。过期后自动失效安全又方便。4. 结合生命周期策略与清单CLI还可以管理桶的配置比如设置生命周期规则自动将旧文件转移到更便宜的存储层级如Standard-IA或Glacier。# 首先创建一个生命周期策略的JSON配置文件 lifecycle.json # 然后应用到桶上 aws s3api put-bucket-lifecycle-configuration --bucket my-bucket --lifecycle-configuration file://lifecycle.json虽然这类配置在控制台操作更直观但在需要批量、自动化管理数百个桶时CLI脚本的优势就无可替代了。4.3 IAM权限精细化管理实战安全是云上重中之重IAM是安全的核心。通过CLI管理IAM可以实现权限的版本控制和代码化。1. 创建用户与策略# 创建一个IAM用户 aws iam create-user --user-name dev-user # 创建一个内联策略策略文档以JSON格式定义 aws iam put-user-policy --user-name dev-user --policy-name S3ReadOnlyAccess --policy-document file://policy.jsonpolicy.json文件内容示例{ Version: 2012-10-17, Statement: [ { Effect: Allow, Action: [s3:GetObject, s3:ListBucket], Resource: [arn:aws:s3:::my-data-bucket, arn:aws:s3:::my-data-bucket/*] } ] }2. 为用户创建访问密钥aws iam create-access-key --user-name dev-user请务必安全保存返回的AccessKeyId和SecretAccessKeySecretAccessKey只显示一次。3. 管理用户组与角色将用户加入组是更好的权限管理方式。# 创建组并附加托管策略 aws iam create-group --group-name Developers aws iam attach-group-policy --group-name Developers --policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess # 将用户加入组 aws iam add-user-to-group --user-name dev-user --group-name Developers4. 模拟策略验证在给用户或角色附加策略前可以使用aws iam simulate-principal-policy来模拟该身份是否被允许执行某些操作这是一个非常实用的安全审查工具。5. 高级技巧与生产环境最佳实践当你熟悉基础操作后这些高级技巧能让你的云上运维水平再上一个台阶。5.1 利用jq进行复杂JSON处理与转换--query参数很强但jq更灵活两者结合天下无敌。例如我们想获取所有安全组的ID和描述并按描述排序aws ec2 describe-security-groups --output json | jq -r .SecurityGroups[] | [.GroupId, .GroupName, .Description] | tsv | sort -k3这个管道1) 获取JSON输出。2)jq提取每个安全组的ID、名称和描述组成数组。3)tsv将数组转换为制表符分隔的文本行。4)sort -k3按第三列描述排序。另一个常见场景将EC2实例信息转换为CSV格式方便导入电子表格。aws ec2 describe-instances --query Reservations[*].Instances[*].[InstanceId, InstanceType, State.Name, LaunchTime] --output json | jq -r .[][] | csv5.2 自动化运维脚本编写范式一个健壮的自动化脚本应该包含以下要素错误处理使用set -e在Bash中使脚本在遇到错误时立即退出或使用if语句判断上一条命令的返回值$?。日志记录将关键操作和结果输出到文件或系统日志logger命令。参数化使用命令行参数或环境变量来传递配置而不是写死在脚本里。幂等性脚本应该可以安全地重复运行。例如创建资源前先检查是否存在。示例一个安全的创建EC2实例脚本框架。#!/bin/bash set -euo pipefail # 严格错误处理模式 INSTANCE_NAME${1:-MyDefaultInstance} # 从第一个参数获取实例名 IMAGE_IDami-0c55b159cbfafe1f0 INSTANCE_TYPEt3.micro KEY_NAMEMyKeyPair LOG_FILE./instance_creation.log exec (tee -a $LOG_FILE) 21 # 将脚本所有输出同时打印到屏幕和日志文件 echo 开始创建实例: $INSTANCE_NAME # 检查密钥对是否存在 if ! aws ec2 describe-key-pairs --key-names $KEY_NAME /dev/null; then echo 错误密钥对 $KEY_NAME 不存在。 exit 1 fi # 创建实例 INSTANCE_ID$(aws ec2 run-instances \ --image-id $IMAGE_ID \ --instance-type $INSTANCE_TYPE \ --key-name $KEY_NAME \ --tag-specifications ResourceTypeinstance,Tags[{KeyName,Value$INSTANCE_NAME}] \ --query Instances[0].InstanceId \ --output text) echo 实例已创建ID: $INSTANCE_ID # 等待实例运行 echo 等待实例进入运行状态... aws ec2 wait instance-running --instance-ids $INSTANCE_ID echo 实例已运行。 # 获取公有IP PUBLIC_IP$(aws ec2 describe-instances --instance-ids $INSTANCE_ID --query Reservations[0].Instances[0].PublicIpAddress --output text) echo 实例公有IP地址: $PUBLIC_IP echo 实例创建完成 5.3 性能优化与超时处理当操作大量资源如列出某个大桶里的所有文件或描述一个拥有上千个实例的账户时可能会遇到性能问题或超时。使用分页参数很多list或describe操作默认只返回一定数量如50或100的结果并包含一个NextToken。你需要循环处理直到NextToken为空。NEXT_TOKEN while true; do if [ -z $NEXT_TOKEN ]; then RESPONSE$(aws s3api list-objects-v2 --bucket my-large-bucket --max-items 1000) else RESPONSE$(aws s3api list-objects-v2 --bucket my-large-bucket --max-items 1000 --starting-token $NEXT_TOKEN) fi # 处理当前页的响应内容... echo $RESPONSE | jq -r .Contents[].Key NEXT_TOKEN$(echo $RESPONSE | jq -r .NextToken // empty) if [ -z $NEXT_TOKEN ]; then break fi done调整超时和重试AWS CLI有内置的重试机制。你可以在~/.aws/config文件中为特定profile或全局配置更长的超时时间和重试次数这在网络不稳定或操作本身耗时较长时有用。[profile prod] region us-east-1 cli_read_timeout 120 cli_connect_timeout 10 max_attempts 55.4 安全加固与审计跟踪启用CLI历史记录Bash等Shell默认会记录命令历史。确保你的.bash_history文件安全并考虑设置HISTTIMEFORMAT来记录时间戳便于审计。使用MFA进行CLI操作对于高权限账户可以配置在调用CLI时要求MFA令牌。这需要在IAM策略中设置条件键aws:MultiFactorAuthPresent并在调用CLI时使用临时安全凭证通常通过aws sts get-session-token配合MFA设备获取。定期轮转访问密钥建立流程定期如90天更换IAM用户的访问密钥。可以使用IAM的access-key-last-used信息来识别并清理长期未使用的密钥。利用CloudTrail进行API调用审计所有通过CLI发出的API调用都会被CloudTrail如果已启用记录。你可以通过CLI本身来查询CloudTrail日志形成一个闭环。aws cloudtrail lookup-events --lookup-attributes AttributeKeyEventName,AttributeValueRunInstances --start-time 2023-10-01 --end-time 2023-10-026. 常见问题排查与调试指南即使经验丰富也难免会遇到问题。下面是一些常见错误的排查思路。6.1 典型错误码与解决方案速查表错误信息/代码可能原因解决方案Unable to locate credentials1. 未运行aws configure。2. 环境变量AWS_PROFILE设置错误。3.~/.aws/credentials文件权限太开放。1. 运行aws configure或检查环境变量。2. 检查AWS_PROFILE值或使用--profile。3. 执行chmod 600 ~/.aws/credentials。An error occurred (UnauthorizedOperation) when calling the X operationIAM用户/角色没有执行该操作的权限。1. 检查附加的IAM策略。2. 使用aws iam simulate-principal-policy验证权限。3. 联系管理员添加所需权限。An error occurred (AccessDenied) when calling the X operation资源级权限不足。例如有ec2:DescribeInstances权限但策略限制只能描述带特定标签的实例而目标实例没有该标签。检查IAM策略中的Resource和Condition部分是否过于严格。The security token included in the request is expired使用的临时凭证如来自角色扮演或SSO已过期。重新获取临时凭证。对于SSO运行aws sso login。A client error (InvalidAMIID.NotFound) occurred指定的AMI ID在当前区域不存在。1. 确认AMI ID正确无误。2. 确认该AMI在你操作的区域是可用的。3. 使用--region参数指定正确区域。Could not connect to the endpoint URL1. 网络问题无法连接到AWS API端点。2. 区域代码拼写错误如useast-1。3. 在私有网络环境且未配置VPC端点或代理。1. 检查网络连接和DNS。2. 核对区域名称如us-east-1。3. 检查代理设置或VPC端点配置。An error occurred (BucketAlreadyExists) when calling the CreateBucket operationS3桶名全局唯一你起的名字已被他人占用。换一个更独特的桶名。命令执行缓慢或无响应1. 网络延迟高。2. 返回数据量极大如未分页列出海量对象。3. AWS服务端临时问题。1. 使用--region选择离你近的区域。2. 为list操作加上--page-size或--max-items限制。3. 稍后重试或检查AWS健康面板。6.2 调试模式与请求追踪当遇到难以理解的错误时打开调试模式是终极武器。aws s3 ls --debug 21 | less--debug会输出非常详细的信息包括最终用于签名的凭证。构建的完整HTTP请求包括头部。HTTP请求的原始响应。这能帮你确认用的密钥对不对请求发往哪个端点服务端返回了什么具体错误你可以将输出重定向到文件然后仔细分析。通常关注点在于认证头Authorization、请求URL、以及响应体中的错误消息。6.3 版本兼容性与升级策略AWS CLI和AWS服务API都在不断更新。偶尔会出现命令语法变化或弃用的情况。定期更新CLI使用aws --version查看当前版本并关注官方博客或更新日志。用包管理器如brew upgrade awscli或pip install --upgrade awscli进行升级。注意命令变化例如较新的AWS CLI版本推荐使用s3api系列命令如aws s3api list-objects-v2来代替旧的s3命令如aws s3 ls s3://bucket --recursive以进行编程式交互因为前者返回结构化的JSON。使用aws help这是最好的离线文档。aws ec2 help会列出所有EC2相关命令aws ec2 run-instances help会显示该命令的详细参数说明和示例。遇到不确定的参数先查帮助。配置和使用AWS CLI从生疏到熟练是一个典型的“磨刀不误砍柴工”的过程。初期可能会觉得记命令麻烦不如点控制台快。但一旦你熟悉了它的语法并将其与Shell脚本、定时任务甚至更复杂的编排工具结合你就会发现它带来的效率提升是革命性的。它让你对云资源的操作变得可重复、可审计、可自动化。下次当你需要在控制台重复点击十几次时不妨停下来想一想“这个操作能不能用一行AWS CLI命令来解决” 很多时候答案都是肯定的。