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 CLI 命令速查
操作 命令 说明
创建桶 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的配置、操作流程串起来。

客户端操作流程总览 1. 环境准备 AWS CLI Python boto3 SDK aws configure 配密钥区域 创建桶: aws s3 mb 上传/下载/删除对象 boto3.Session() 初始化 create_bucket / upload_fileobj download_fileobj / delete_object 存储桶 & 对象操作完成 小贴士 两者功能等价 CLI:快速测试 SDK:集成项目 推荐先CLI验证 再写SDK代码

这张图从上往下看,左边是CLI路线,右边是SDK路线,中间是操作流程的顺序。你可以先通过CLI快速验证各个操作是否能通,然后无缝迁移到Python代码里。