4. 客户端操作:从命令行到SDK的实战配置
这一章我们动手实战,先把环境搭起来。说实话,这几步看起来简单,但很多人上来就翻车。我见过不少同学对着错误日志发呆半小时,结果只是Key配错了。来,我们一步步来。
4.1 AWS CLI:你的第一把瑞士军刀
安装,其实一句话的事。Linux/Mac用户打开终端,跑一行:
pip install awscli
Windows用户去官网下一个安装包,双击就行。装完验证一下:
aws --version
看到版本号,说明装成了。
我个人的习惯:装完顺手配个自动补全,能省不少时间。
aws --completer # 查看补全脚本路径
# 然后把它加到你的bashrc或zshrc里
4.2 配置凭证与默认区域
AWS CLI要干活,得先认识你。说白了,你需要告诉它三样东西:你是谁(Access Key)、你值得信任吗(Secret Key)、你在哪个机房(Region)。
aws configure
AWS Access Key ID [None]: 你的access-key
AWS Secret Access Key [None]: 你的secret-key
Default region name [None]: us-east-1
Default output format [None]: json
嗯,这里要注意:Secret Key一输进去就看不见了,别慌,那是正常的。我刚开始用的时候以为自己没输进去,反反复复敲了十几次。
配完之后,系统会在你家目录下生成两个文件:
~/.aws/credentials– 存放你的密钥~/.aws/config– 存放区域和输出格式
避坑警告:我曾经见过有人把credentials文件直接传到GitHub上,结果一夜之间被刷了几千美金的账单。后来我养成了习惯:
- 永远把
.aws/加到.gitignore里 - 使用 IAM 角色或临时凭证,而不是长期 Key
4.3 玩转存储桶:创建与删除
配置搞定,我们来试试第一个操作——创建存储桶。为什么先做这个?因为没存储桶,你什么都存不了。
aws s3 mb s3://my-encryption-project-bucket --region us-east-1
等一两秒,你会看到 make_bucket: my-encryption-project-bucket。成了。
我建议你每次操作都显式指定region,避免踩到默认region的坑。我在项目里吃过亏,后来养成了习惯,每个命令都带上 --region。
创建之后,检查一下是否真成功了:
aws s3 ls
看到你的桶名在列表里,稳了。
删除存储桶更简单:
aws s3 rb s3://my-encryption-project-bucket
核心知识点:删除桶时有个坑——桶里不能有对象。如果桶非空,你得先清空所有文件,不然会报 BucketNotEmpty 错误。
清空桶可以用:
aws s3 rm s3://my-bucket --recursive
4.4 上传、下载、删除对象
有桶了,来存点东西。上传文件:
aws s3 cp my-local-file.txt s3://my-encryption-project-bucket/
下载文件:
aws s3 cp s3://my-encryption-project-bucket/my-local-file.txt ./downloaded-file.txt
删除对象:
aws s3 rm s3://my-encryption-project-bucket/my-local-file.txt
其实这几个命令的套路都一样,记住 cp 和 rm 就行。你想想看,S3本质上就是个键值存储,操作比本地文件系统还简单。
| 操作 | 命令 | 说明 |
|---|---|---|
| 创建桶 | aws s3 mb s3://桶名 |
桶名全局唯一 |
| 列桶 | aws s3 ls |
查看所有桶 |
| 上传文件 | aws s3 cp 本地路径 s3://桶名/ |
自动创建前缀 |
| 下载文件 | aws s3 cp s3://桶名/对象名 本地路径 |
可指定新文件名 |
| 删除对象 | aws s3 rm s3://桶名/对象名 |
注意:不可恢复 |
| 删除桶 | aws s3 rb s3://桶名 |
桶必须为空 |
4.5 Python boto3 SDK:用代码说话
CLI适合快速测试,但项目里我们得写代码。Python接入S3,全靠 boto3 这个库。
安装也很简单:
pip install boto3
装完检查一下版本:
import boto3
print(boto3.__version__)
为什么不直接用requests调API? boto3帮你处理了签名、重试、分片上传这些体力活。说白了,是你和S3之间的贴身管家。
4.6 boto3 三件套:创建桶、存文件、删文件
先初始化客户端。我个人习惯用 session 管理凭证:
import boto3
session = boto3.Session(
aws_access_key_id='你的AK',
aws_secret_access_key='你的SK',
region_name='us-east-1'
)
s3_client = session.client('s3')
创建桶:
s3_client.create_bucket(Bucket='my-python-bucket')
上传文件:
with open('local.txt', 'rb') as f:
s3_client.upload_fileobj(f, 'my-python-bucket', 'remote.txt')
注意upload_fileobj和upload_file的区别:前者接受文件对象,后者接受文件路径。我更喜欢 upload_fileobj,因为它可以配合上下文管理器,自动关闭文件。
下载文件:
with open('downloaded.txt', 'wb') as f:
s3_client.download_fileobj('my-python-bucket', 'remote.txt', f)
删除对象:
s3_client.delete_object(Bucket='my-python-bucket', Key='remote.txt')
删除桶:
s3_client.delete_bucket(Bucket='my-python-bucket')
你会发现,boto3的API和CLI的命令基本一一对应。嗯,这也是AWS设计者的良苦用心——降低了学习曲线。
4.7 IAM权限与最小化原则
操作过程中,你可能碰到权限问题。比如:
An error occurred (AccessDenied) when calling the CreateBucket operation
为什么会这样?因为没有给使用的AK分配对应的S3权限。
我踩过的坑:刚开始搞这个的时候,我总是给太大的权限,直接上 AdministratorAccess。后来被安全审计点名批评,才老实学会最小权限原则。
推荐的做法:
- 创建一个专门的IAM用户,只赋予S3相关权限
- 用策略模板限制操作范围
一个最小化的策略示例:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:CreateBucket",
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::my-project-*",
"arn:aws:s3:::my-project-*/*"
]
}
]
}
这种写法,只允许操作前缀为 my-project- 的桶及其内部对象。就算密钥泄露,影响范围也小得多。
再啰嗦一次:不要把长期AK写在代码里。开发环境用环境变量,生产环境用IAM Role。我曾经在迁移项目时发现boto3版本太低,某些加密参数不支持,代码跑了一天才报错。所以现在配置前我肯定会打一下版本。
boto3.__version__ # 确保 >= 1.26.0
4.8 本章知识体系总览
为了让你对整章内容有个全局概念,我画了一张流程总览图,把CLI和boto3的配置、操作流程串起来。
这张图从上往下看,左边是CLI路线,右边是SDK路线,中间是操作流程的顺序。你可以先通过CLI快速验证各个操作是否能通,然后无缝迁移到Python代码里。