AWS系列之官方CLI、AWS Local:简介、实战

CLI

官网,开源(GitHub,17.3K Star,4.7K Fork)、纯Python实现、用于管理AWS产品的统一工具,使用命令行控制多个AWS产品并利用脚本来自动执行这些服务。

技巧:

  • 命令补全:AWS CLI v2支持Tab键补全命令和参数
  • 自动提示:输入aws时可获得命令和参数建议
  • 历史记录:使用aws history list和aws history show查看执行记录
  • S3文件夹概念:S3并无真实文件夹,路径结构由对象前缀模拟

实战

支持超多种安装方式。

因为是纯Python实现,当然支持通过pip安装:

bash 复制代码
pip install awscli

Unix类系统,也可通过包管理器安装:

bash 复制代码
apt-get install awscli

对于macOS而言,通过cURL命令curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"下载得到.pkg文件,双击安装,验证安装是否成功:

bash 复制代码
aws --version
# 输出:aws-cli/2.36.49 Python/3.14.6 Darwin/24.4.0 exe/x86_64

命令行安装成功后,如何使用才是关键。

执行任何AWS命令行,都需要有(终端下的)登录态信息,默认从~/.aws/credentials文件读取。执行aws login命令会打开浏览器,手动输入用户名密码,登录成功后,会将登录态信息写入到该文件。这是一个纯文本文件,内容示例:

bash 复制代码
[default]
aws_access_key_id = ASIA111111ILTF72
aws_secret_access_key = ltrIXg2222222mgs333gIKKWB
aws_session_token = IQoJb3JpZ2luX2VjEGYaDmNuLW5vcnRod2VzdC0xIkcwRQIgM8F4s2JtuLS7Sr++j+k7seFKxrN2XpHR+xReQfXaUeoCIQDHrxqzibRDf3TQPmZPD+x/6wVtlmdbuhBaqfh7s8ZWzsP+u68pUmKJzWWndi0vxJv7RM0odgg3/n9a2OOgAQ1gVCQBWmj4vhU6+SS+158wmKhlUjhlOG49N4vWz0KbVzXf4=

既然如此,也支持手动编辑此文件。如何获取这3个数据呢?

打开浏览器开发者调试工具(如Chrome浏览器,快捷键F12),登录AWS控制台,找到接口browserCreds,如https://cn-northwest-1.console.amazonaws.cn/api/prod/browserCreds,查看该接口的响应:

java 复制代码
{
    "accessKeyId": "ASIA111111ILTF72",
    "secretAccessKey": "ltrIXg2222222mgs333gIKKWB",
    "sessionToken": "IQoJb3JpZ2luX2VjEGYaDmNuLW5vcnRod2VzdC0xIkcwRQIgM8F4s2JtuLS7Sr++j+k7seFKxrN2XpHR+xReQfXaUeoCIQDHrxqzibRDf3TQPmZPD+x/6wVtlmdbuhBaqfh7s8ZWzsP+u68pUmKJzWWndi0vxJv7RM0odgg3/n9a2OOgAQ1gVCQBWmj4vhU6+SS+158wmKhlUjhlOG49N4vWz0KbVzXf4=",
    "expiration": "2026-09-23T09:27:07.000Z"
}

accessKeyId和secretAccessKey应该是固定不变,变更的数据是sessionToken。sessionToken默认有效期是24小时:24h内,可反复执行aws命令行;24h后,执行绝大多数命令会报错提示aws: [ERROR]: An error occurred (ExpiredToken) when calling the ListBuckets operation: The provided token has expired.需重新执行aws login命令登录,更新~/.aws/credentials文件。

当然,不是所有的命令行都依赖于~/.aws/credentials文件,如执行aws configure list命令是读取配置列表。执行aws configure set region cn-northwest-1命令会往~/.aws/config文件写入配置项信息(即KV对),aws configure list命令实际上就是从~/.aws/config和~/.aws/credentials文件读取KV对:

~/.aws/config纯文本文件示例:

复制代码
[sso-session d-1111]
sso_start_url=https://d-1111.awsapps.com/start
sso_region=eu-west-2
sso_registration_scopes=codewhisperer:conversations,codewhisperer:transformations,codewhisperer:taskassist,codewhisperer:completions,codewhisperer:analysis
[default]
region = cn-northwest-1

命令行使用示例:

bash 复制代码
aws login
aws configure list
aws configure set region cn-northwest-1

# s3
aws s3 ls
aws s3 ls s3://
aws s3 ls s3://bucket1/
# 上传文件
aws s3 cp ./file.txt s3://my-bucket/
# 同步本地与 S3
aws s3 sync /home/ s3://ceshi/ecs-backup/$(date +%Y-%m-%d)/ --delete
# 删除文件或目录
aws s3 rm s3://my-bucket/file.txt
aws s3 rm s3://my-bucket/folder/ --recursive
# 删除空存储桶
aws s3 rb s3://my-bucket/

# ecr
aws ecr get-login-password --region eu-west-2 > .token

# iam
# 列出账户中的 OIDC Provider
aws iam list-open-id-connect-providers
# 检查特定 OIDC Provider 的 thumbprint
aws iam get-open-id-connect-provider \
	--open-id-connect-provider-arn "arn:aws-cn:iam::069034308707:oidc-provider/oidc.eks.cn-northwest-1.amazonaws.com.cn/id/9EE8912AEA5717C75FBA19D701D24C46"
# 查看IAM Role的策略
aws iam list-attached-role-policies \
	--role-name jlr-gdd-fta-vehicle-service-bridge-role \
	--region cn-northwest-1

# secretsmanager
aws secretsmanager get-secret-value --secret-id 'arn:aws-cn:secretsmanager:cn-northwest-1:069034308707:secret:rds!cluster-41693547-4809-466d-84ff-42a7907909d2-3aCjbD' --query SecretString --output text | jq -r '.password'

# ec2
# 检查是否有VPC Endpoint for STS
aws ec2 describe-vpc-endpoints \
	--region cn-northwest-1 \
	--filters "Name=service-name,Values=com.amazonaws.vpce.cn-northwest-1.sts"
# 检查VPC Endpoint的安全组
aws ec2 describe-security-groups \
	--region cn-northwest-1 \
	--group-ids <security-group-id-from-vpc-endpoint>

# sts
aws sts get-caller-identity

# eks
aws eks describe-cluster --name <cluster-name> --region cn-northwest-1 | grep -A5 -B5 identity
aws eks describe-cluster --name cn-dev --region cn-northwest-1 | grep -A5 -B5 identity
# 查看集群OIDC提供商信息
aws eks describe-cluster \
	--name cn-dev \
	--region cn-northwest-1 \
	--query 'cluster.identity.oidc.issuer'

注:命令行示例后面会持续更新。

awslocal

LocalStack官方开源(GitHub,1.3K Star,94 Fork)、Python+Shell实现、围绕aws命令行设计的轻量级包装器,专为与LocalStack集成而生,专门用来连接本地的LocalStack模拟环境。

区别:awslocal会自动把请求发送到本地,而不用每次都手动指定地址。

  • aws:AWS官方命令行工具。默认情况下,会去连接真正的AWS云。如果想让它去连接本地LocalStack,需手动在每条命令后面加上--endpoint-url=http://localhost:4566参数,或配置专门profile。
  • awslocal:轻量级的包装脚本(thin wrapper)。底层调用aws,会自动把--endpoint-url指向本地LocalStack(默认localhost:4566)。
特性 aws(原生) awslocal(包装)
默认目标 真正的AWS云 本地的LocalStack
连接方式 需要加--endpoint-url或配置profile 自动指向localhost:4566
命令语法 aws s3 ls awslocal s3 ls(完全相同)
安装方式 官方安装包 可通过pip install awscli-local安装

例子

  • 用原生aws连接LocalStack:aws --endpoint-url=http://localhost:4566 s3 ls
  • 用awslocal连接LocalStack:awslocal s3 ls

LocalStack推出新工具lstk,整合awslocal、tflocal等功能。

本身并不直接管理复杂的配置文件,配置主要通过环境变量实现:

  • AWS_ENDPOINT_URL:服务端点URL,优先级高于下述两个选项
  • LOCALSTACK_HOST:已弃用,定义LocalStack位置,默认localhost:4566
  • USE_SSL:已弃用,控制是否对连接到LocalStack使用SSL,默认否

对于更细致的配置(如特定于某个服务的行为),通常建议调整LocalStack本身的设置或利用AWS CLI的配置机制。可通过上述环境变量间接控制awslocal的行为,确保它指向正确的LocalStack实例或其他自定义设置。

源码目录结构概览:

复制代码
awscli-local/
├── github/workflows	# GitHub Actions工作流相关配置文件
├── bin					# 可执行脚本所在目录
├── output				# 空目录
├── tests/bin			# 测试
├── Makefile			# 构建和自动化任务文件
├── README.md			# 主要的项目说明文件
├── requirements.txt	# 依赖包列表
├── setup.py			# 安装脚本

解读:

  • bin:包含awslocal入口脚本或相关辅助脚本
  • requirements.txt:列出项目运行所需的Python库
  • setup.py:用于通过pip安装此包裹的元数据和安装逻辑

实战

基于pip安装:pip install awscli-local

安装成功后,可能会出现命令行无法使用的问题:

bash 复制代码
awslocal
zsh: /Users/tssh/Library/Python/3.9/bin/awslocal: bad interpreter: /Library/Developer/CommandLineTools/usr/bin/python3: no such file or directory

原因在于macOS下Python环境混乱问题(之前安装过3.9,后来安装3.13),解决方法:

bash 复制代码
# 重新基于3.13安装
python3 -m pip install --upgrade --force-reinstall awscli-local
# 删除3.9
rm -fr ~/Library/Python/3.9
# 验证
which awslocal
# 输出:/Library/Frameworks/Python.framework/Versions/3.13/bin/awslocal

执行awslocal命令输出:

bash 复制代码
aws: [ERROR]: An error occurred (ParamValidation): the following arguments are required: command
usage: aws [options] <command> <subcommand> [<subcommand> ...] [parameters]
To see help text, you can run:
	aws help
	aws <command> help
	aws <command> <subcommand> help

示例:

bash 复制代码
awslocal sqs create-queue --queue-name sample-queue
awslocal s3api create-bucket --bucket rishi --region cn-northwest-1
awslocal s3api list-buckets
相关推荐
无风听海8 小时前
AWS CLI的profile
云计算·aws
翼龙云_cloud20 小时前
亚马逊云服务器服务代理商:Bedrock 实践经验 Serverless 架构下的 AI 自动化落地
服务器·架构·serverless·云计算·aws
yyuuuzz3 天前
云服务器部署 web 项目的进程常驻记录
运维·服务器·前端·阿里云·云计算·aws
无风听海4 天前
一文读懂 AWS IAM:从工牌、钥匙到统一登录
云计算·aws
Wonopop5 天前
AWS Budgets 预算告警与卡片拒付,为什么不能共用一个“超支“状态?附对账模型与反例测试
云计算·aws·支付系统·对账·mpchat
七牛开发者5 天前
从 AWS 到 OpenRouter,拆解 Agent 模型路由的工程设计
云计算·aws
小七-七牛开发者6 天前
从 AWS 到 OpenRouter,拆解 Agent 模型路由的工程设计
llm·agent·aws·openrouter·codingagent
可达智灵7 天前
堵了门,钥匙还在:一次持续九个月的 AWS 接管修复
云计算·aws·可达智灵
云边云科技_云网融合7 天前
混合云组网难题破解:SD-WAN 如何打通 AWS 与阿里云,让总部分支访问稳如专线
阿里云·云计算·aws
Elastic 中国社区官方博客12 天前
AWS 自动化根因分析:从 CloudWatch 告警到完成故障诊断,仅需 36 秒
大数据·运维·elasticsearch·自动化·aws