S3基础 #

一、S3概述 #

1.1 什么是S3 #

Amazon S3(Simple Storage Service)是AWS提供的对象存储服务,提供业界领先的可扩展性、数据可用性、安全性和性能。

1.2 S3核心特性 #

text
S3核心特性:
├── 无限存储
│   └── 存储任意数量的对象
│   └── 单个对象最大5TB
│
├── 高可用性
│   └── 99.99%可用性
│   └── 跨多个设施冗余存储
│
├── 高耐久性
│   └── 99.999999999%(11个9)
│   └── 设计可承受两个设施同时故障
│
├── 安全性
│   └── 多种访问控制方式
│   └── 支持加密
│
├── 可扩展性
│   └── 自动扩展
│   └── 无需预置容量
│
└── 多种存储类别
    └── 根据访问模式选择

1.3 S3使用场景 #

场景 说明
数据湖 存储原始数据用于分析
备份与归档 长期数据存储
静态网站托管 托管静态网站
应用数据存储 应用程序数据存储
媒体存储 图片、视频等媒体文件
软件分发 软件包分发

二、S3核心概念 #

2.1 存储桶(Bucket) #

text
存储桶特点:
├── 对象的容器
├── 全局唯一名称
├── 创建在特定区域
├── 每个账户最多100个(可提升)
└── 无存储限制

存储桶命名规则 #

text
命名规则:
├── 3-63个字符
├── 只能包含小写字母、数字、点、连字符
├── 必须以字母或数字开头和结尾
├── 不能使用IP地址格式
├── 不能以xn--开头
├── 不能以-s3alias结尾
└── 必须全局唯一

2.2 对象(Object) #

text
对象组成:
├── 键(Key)
│   └── 对象的唯一标识符
│   └── 类似文件路径
│
├── 值(Value)
│   └── 实际数据内容
│   └── 最大5TB
│
├── 版本ID
│   └── 启用版本控制后
│
├── 元数据
│   ├── 系统元数据
│   └── 用户定义元数据
│
├── 子资源
│   ├── ACL
│   └── Torrent
│
└── 标签
    └── 用于管理和筛选

2.3 存储类别 #

text
S3存储类别:
├── S3 Standard
│   └── 频繁访问的数据
│   └── 默认存储类别
│
├── S3 Intelligent-Tiering
│   └── 自动优化存储成本
│   └── 适合访问模式不确定的数据
│
├── S3 Standard-IA
│   └── 不频繁访问的数据
│   └── 最小存储30天
│
├── S3 One Zone-IA
│   └── 不频繁访问的数据
│   └── 单可用区存储
│
├── S3 Glacier Instant Retrieval
│   └── 归档数据,即时检索
│
├── S3 Glacier Flexible Retrieval
│   └── 归档数据,灵活检索
│   └── 检索时间1-5小时
│
└── S3 Glacier Deep Archive
    └── 长期归档
    └── 检索时间12-48小时

2.4 存储类别对比 #

存储类别 可用性 耐久性 最小存储 检索时间 适用场景
Standard 99.99% 99.999999999% 即时 频繁访问
Intelligent-Tiering 99.9% 99.999999999% 即时 访问模式不确定
Standard-IA 99.9% 99.999999999% 30天 即时 不频繁访问
One Zone-IA 99.5% 99.999999999% 30天 即时 可重建数据
Glacier Instant 99.9% 99.999999999% 90天 即时 归档即时检索
Glacier Flexible 99.99% 99.999999999% 90天 1-5小时 归档
Deep Archive 99.99% 99.999999999% 180天 12-48小时 长期归档

三、创建存储桶 #

3.1 通过控制台创建 #

text
创建存储桶步骤:
├── 第一步:基本信息
│   ├── 存储桶名称(全局唯一)
│   └── AWS区域
│
├── 第二步:配置选项
│   ├── 阻止公有访问设置
│   ├── 存储桶版本控制
│   ├── 标签
│   └── 默认加密
│
├── 第三步:设置权限
│   ├── 阻止公有访问
│   ├── ACL设置
│   └── 存储桶策略
│
└── 第四步:审核创建

3.2 通过CLI创建 #

bash
aws s3api create-bucket \
    --bucket my-unique-bucket-name \
    --region us-east-1

3.3 存储桶配置 #

版本控制 #

text
版本控制:
├── 保留对象的多个版本
├── 可防止意外删除
├── 可恢复到之前版本
└── 一旦启用无法完全禁用

默认加密 #

text
加密选项:
├── SSE-S3
│   └── Amazon管理的密钥
│
├── SSE-KMS
│   └── KMS管理的密钥
│
└── SSE-C
    └── 客户提供的密钥

四、对象操作 #

4.1 上传对象 #

通过控制台上传 #

text
上传步骤:
├── 选择存储桶
├── 点击"上传"
├── 添加文件
├── 设置属性
│   ├── 存储类别
│   ├── 加密
│   ├── 元数据
│   └── 标签
└── 上传

通过CLI上传 #

bash
aws s3 cp local-file.txt s3://my-bucket/

aws s3 sync ./local-folder s3://my-bucket/folder/

aws s3api put-object \
    --bucket my-bucket \
    --key uploads/file.txt \
    --body local-file.txt

4.2 下载对象 #

bash
aws s3 cp s3://my-bucket/file.txt ./local-file.txt

aws s3 sync s3://my-bucket/folder/ ./local-folder/

aws s3api get-object \
    --bucket my-bucket \
    --key uploads/file.txt \
    local-file.txt

4.3 列出对象 #

bash
aws s3 ls s3://my-bucket/

aws s3 ls s3://my-bucket/folder/ --recursive

aws s3api list-objects-v2 --bucket my-bucket

4.4 删除对象 #

bash
aws s3 rm s3://my-bucket/file.txt

aws s3 rm s3://my-bucket/folder/ --recursive

aws s3api delete-object \
    --bucket my-bucket \
    --key file.txt

4.5 删除存储桶 #

bash
aws s3 rb s3://my-bucket --force

五、访问控制 #

5.1 阻止公有访问 #

text
阻止公有访问设置:
├── 新存储桶默认启用
├── 四个级别:
│   ├── 新存储桶
│   ├── 新对象
│   ├── 任何存储桶
│   └── 任何对象
└── 可在账户或存储桶级别配置

5.2 存储桶策略 #

存储桶策略是JSON格式的访问控制:

json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::my-bucket/*"
        }
    ]
}

常用策略示例 #

限制特定IP访问:

json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::my-bucket/*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "192.0.2.0/24"
                }
            }
        }
    ]
}

强制SSL访问:

json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ForceSSL",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::my-bucket/*",
            "Condition": {
                "Bool": {
                    "aws:SecureTransport": "false"
                }
            }
        }
    ]
}

5.3 ACL(访问控制列表) #

text
ACL类型:
├── 私有(private)
│   └── 只有所有者可访问
│
├── 公共读(public-read)
│   └── 所有人可读
│
├── 公共读写(public-read-write)
│   └── 所有人可读写
│
└── 认证用户读(authenticated-read)
    └── 认证用户可读

5.4 IAM策略 #

json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::my-bucket/*"
        }
    ]
}

5.5 预签名URL #

生成临时访问链接:

bash
aws s3 presign s3://my-bucket/private-file.txt --expires-in 3600
python
import boto3

s3_client = boto3.client('s3')
url = s3_client.generate_presigned_url(
    'get_object',
    Params={'Bucket': 'my-bucket', 'Key': 'private-file.txt'},
    ExpiresIn=3600
)
print(url)

六、S3静态网站托管 #

6.1 启用静态网站 #

text
配置步骤:
├── 存储桶属性
├── 静态网站托管
├── 启用
├── 设置索引文档(index.html)
├── 设置错误文档(可选)
└── 保存

6.2 网站配置 #

xml
<WebsiteConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <IndexDocument>
        <Suffix>index.html</Suffix>
    </IndexDocument>
    <ErrorDocument>
        <Key>error.html</Key>
    </ErrorDocument>
</WebsiteConfiguration>

6.3 网站端点 #

text
网站端点格式:
├── http://bucket-name.s3-website-region.amazonaws.com
└── http://bucket-name.s3-website.region.amazonaws.com

6.4 示例网站 #

html
<!DOCTYPE html>
<html>
<head>
    <title>My S3 Website</title>
</head>
<body>
    <h1>Hello from S3!</h1>
    <p>This is a static website hosted on S3.</p>
</body>
</html>

七、S3最佳实践 #

7.1 安全最佳实践 #

text
安全建议:
├── 启用阻止公有访问
├── 使用存储桶策略而非ACL
├── 启用服务器端加密
├── 启用版本控制
├── 启用访问日志
├── 使用预签名URL而非公开访问
└── 定期审计权限

7.2 性能优化 #

text
性能建议:
├── 使用多部分上传大文件
├── 使用S3 Transfer Acceleration
├── 并行上传
├── 合理命名前缀
└── 选择合适的存储类别

7.3 成本优化 #

text
成本优化建议:
├── 选择合适的存储类别
├── 使用生命周期策略
├── 启用Intelligent-Tiering
├── 删除不需要的对象版本
├── 使用S3 Storage Lens分析
└── 监控存储使用情况

八、S3限制 #

8.1 配额限制 #

限制项 配额
存储桶数量 每账户100个(可提升)
对象大小 最大5TB
单次上传 最大5GB
多部分上传 每部分5MB-5GB
键长度 最大1024字节

九、小结 #

本章介绍了S3基础:

内容 要点
S3概念 对象存储、无限容量、高可用
存储桶 对象容器、全局唯一名称
对象 键值对、元数据、版本控制
存储类别 Standard、IA、Glacier等
访问控制 存储桶策略、ACL、IAM

下一步学习 #

了解S3基础后,接下来可以:

  1. S3高级特性 - 学习版本控制、生命周期等
  2. CloudFront CDN - 配合CDN使用
  3. Lambda无服务器 - S3触发Lambda
最后更新:2026-03-28